-
Notifications
You must be signed in to change notification settings - Fork 584
Expand file tree
/
Copy pathMakefile
More file actions
236 lines (180 loc) · 6.18 KB
/
Copy pathMakefile
File metadata and controls
236 lines (180 loc) · 6.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
ifeq ($(OS),Windows_NT)
FILE_PATH_SEP := \\
IS_WINDOWS := true
else
FILE_PATH_SEP := /
endif
/ = $(FILE_PATH_SEP)
THIS_MAKEFILE_PATH := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
THIS_DIR := $(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)
CONF_FILE_ENCRYPTED=./resources/secrets/config.json.enc
CONF_FILE=./config-local.json
NPM ?= $(NODE) $(shell which npm)
NPM_BIN = $(shell npm bin)
ELECTRON_VERSION := $(shell node -e "console.log(require('./package.json').devDependencies.electron)")
RED=`tput setaf 1`
RESET=`tput sgr0`
SIMPLENOTE_JS := $(THIS_DIR)/dist/app.js
SIMPLENOTE_CHANGES_STD := `find "$(THIS_DIR)" -newer "$(SIMPLENOTE_JS)" \( -name "*.js" -o -name "*.jsx" -o -name "*.json" -o -name "*.scss" -o -name "*.ts" -o -name "*.tsx" \) -type f -print -quit | grep -v .min. | wc -l`
SIMPLENOTE_BRANCH = $(shell git --git-dir .git branch | sed -n -e 's/^\* \(.*\)/\1/p')
##############
# SIMPLENOTE #
##############
# Node environment
NODE_ENV ?= production
# Defines if we should compile web app via `build` target
SKIP_BUILD ?= false
# Host for dev server
HOST ?= 0.0.0.0
# Port for dev server
PORT ?= 4000
### TODO: changes for HOST and PORT aren't yet reflected in `desktop/app.js`
# Access dev server or locally built web app files
DEV_SERVER ?= false
# electron-builder publish option
# options: always|onTag|onTagOrDraft|never
#
# Unfortunately, electron-builder does not recognize Buildkite as a provider, so we need to manually check that.
# See https://github.com/electron-userland/electron-builder/blob/14942b70a5da79a5e36e330f64de66ec501b4ac6/packages/electron-publish/src/publisher.ts#L139
#
# Notice the use of ?= to still be able to override at call time
ifeq ($(strip $(BUILDKITE_TAG)),)
PUBLISH ?= never
else
PUBLISH ?= always
endif
# Main targets
.PHONY: start
start:
@NODE_ENV=$(NODE_ENV) DEV_SERVER=$(DEV_SERVER) npx electron . --inspect --watchDir=./desktop
.PHONY: dev
dev:
@NODE_ENV=development DEV_SERVER=true npx concurrently -c gray.dim "make dev-server" "wait-on http://localhost:4000 && make start"
.PHONY: dev-server
dev-server:
@$(MAKE) build NODE_ENV=$(NODE_ENV)
@NODE_ENV=$(NODE_ENV) npx webpack serve --config ./webpack.config.js --static dist --host $(HOST) --port $(PORT) --hot
.PHONY: test
test:
@npx jest --config=./jest.config.js
# Build web app
.PHONY: build
build:
ifeq ($(SKIP_BUILD),false)
@echo "Building Simplenote Desktop on branch $(RED)$(SIMPLENOTE_BRANCH)$(RESET)"
# IS_PRODUCTION is a helper var for the inline conditional in `build-app`
ifeq ($(NODE_ENV),production)
$(eval IS_PRODUCTION = true)
endif
@$(MAKE) build-app NODE_ENV=$(NODE_ENV) IS_PRODUCTION=$(IS_PRODUCTION)
endif
# Build utils
.PHONY: build-app
build-app:
@NODE_ENV=$(NODE_ENV) npx webpack $(if $(IS_PRODUCTION),--mode production) --config ./webpack.config.js
.PHONY: build-if-not-exists
build-if-not-exists: config.json
@if [ -f $(SIMPLENOTE_JS) ]; then \
echo "File $(SIMPLENOTE_JS) exists, skipping build."; \
true; \
else \
echo "File $(SIMPLENOTE_JS) does not exist, running build."; \
make build; \
fi
.PHONY: build-if-changed
build-if-changed: build-if-not-exists
@if [ $(SIMPLENOTE_CHANGES_STD) -eq 0 ]; then \
echo "No changes detected, skipping build."; \
true; \
else \
echo "Changes detected, running build."; \
make build; \
fi
# Build binaries only
.PHONY: osx
osx: config-release build-if-changed
@npx electron-builder -m --dir
.PHONY: linux
linux: config-release build-if-changed
@npx electron-builder -l --dir
.PHONY: win32
win32: config-release build-if-changed
@npx electron-builder -w --dir
# Build installers
.PHONY: package
package: build-if-changed
# Windows signing: Azure Artifact Signing by default, or PFX when USE_PFX_CODE_SIGNING is set. In
# Azure mode the NSIS exe signs through the win.sign callback, and the Store AppX builds unsigned —
# `env -u` removes PFX cert vars so electron-builder skips its built-in /fd-less PFX call. The
# Store re-signs the AppX regardless. In PFX mode both keep native cert signing, unchanged.
ifndef USE_PFX_CODE_SIGNING
WIN_NSIS_SIGN := -c.win.sign=./scripts/azure-sign.cjs
APPX_NO_SIGN := env -u CSC_LINK -u CSC_KEY_PASSWORD -u WIN_CSC_LINK -u WIN_CSC_KEY_PASSWORD
endif
.PHONY: package-win32
package-win32:
@echo "Packaging exe..."
@npx electron-builder --win -p $(PUBLISH) $(WIN_NSIS_SIGN)
# Dedicated config because the appx target conflicts with exe code signing.
# See https://github.com/electron-userland/electron-builder/issues/6698
@echo "Packaging appx..."
@$(APPX_NO_SIGN) npx electron-builder --win -p $(PUBLISH) --config=./electron-builder-appx.json
.PHONY: package-osx
package-osx: build-if-changed
@npx electron-builder --mac -p $(PUBLISH)
.PHONY: package-linux
package-linux: build-if-changed
@npx electron-builder --linux -p $(PUBLISH)
# NPM
.PHONY:
install: node_modules
node_modules/%:
@npm install $(notdir $@) --legacy-peer-deps
node_modules: package.json
@npm prune --legacy-peer-deps
@npm install --legacy-peer-deps
@touch node_modules
# Checks
config.json:
ifeq (,$(wildcard $(THIS_DIR)$/$CONF_FILE))
$(error $(CONF_FILE) not found. Required file, see docs)
endif
# Utils
.PHONY: config-release
config-release: config.json install
.PHONY: format
format:
@npx prettier --write "**/*.{js,jsx,json,sass,scss,ts,tsx}"
.PHONY: lint
lint: lint-js lint-scss
.PHONY: lint-scss
lint-scss:
@npx stylelint "**/*.scss"
.PHONY: lint-js
lint-js:
@npx eslint
# encrypted config file
.PHONY: _pwd_prompt decrypt_conf encrypt_conf
# 'private' task for echoing instructions
_pwd_prompt:
ifeq ($(strip $(CI)),)
@echo "Check the secret store for Simplenote!"
else
@echo "Use input disabled because running in CI (CI env var set)"
endif
OPENSSL_CMD=openssl aes-256-cbc -pbkdf2
DECRYPT_CMD=${OPENSSL_CMD} -d -in ${CONF_FILE_ENCRYPTED} -out ${CONF_FILE}
# to create config for local development
decrypt_conf: _pwd_prompt
ifeq ($(strip $(CI)),)
${DECRYPT_CMD}
else
ifeq ($(strip $(SECRETS_ENCRYPTION_KEY)),)
$(error Could not decode $(CONF_FILE) because SECRETS_ENCRYPTION_KEY is missing from environment.)
else
@${DECRYPT_CMD} -k ${SECRETS_ENCRYPTION_KEY}
endif
endif
# for updating the stored config with the local values
encrypt_conf: _pwd_prompt
${OPENSSL_CMD} -e -in ${CONF_FILE} -out ${CONF_FILE_ENCRYPTED}