Makefile 8.36 KB
Newer Older
liuzhe-lz's avatar
liuzhe-lz committed
1
2
3
# Setting variables

SHELL := /bin/bash
Zejun Lin's avatar
Zejun Lin committed
4
5
PIP_INSTALL := python3 -m pip install
PIP_UNINSTALL := python3 -m pip uninstall
liuzhe-lz's avatar
liuzhe-lz committed
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

## Install directories
ifeq ($(shell id -u), 0)  # is root
    _ROOT := 1
    BIN_PATH ?= /usr/bin
    INSTALL_PREFIX ?= /usr/share
    EXAMPLES_PATH ?= $(INSTALL_PREFIX)/nni/examples
    BASH_COMP_SCRIPT ?= /usr/share/bash-completion/completions/nnictl
else  # is normal user
    BIN_PATH ?= ${HOME}/.local/bin
    INSTALL_PREFIX ?= ${HOME}/.local
    EXAMPLES_PATH ?= ${HOME}/nni/examples
    ifndef VIRTUAL_ENV
        PIP_MODE ?= --user
    endif
    BASH_COMP_SCRIPT ?= ${HOME}/.bash_completion.d/nnictl
22
endif
Deshui Yu's avatar
Deshui Yu committed
23

liuzhe-lz's avatar
liuzhe-lz committed
24
## Dependency information
Gems Guo's avatar
Gems Guo committed
25
NODE_VERSION ?= v10.10.0
liuzhe-lz's avatar
liuzhe-lz committed
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
NODE_TARBALL ?= node-$(NODE_VERSION)-linux-x64.tar.xz
NODE_PATH ?= $(INSTALL_PREFIX)/nni/node

YARN_VERSION ?= v1.9.4
YARN_TARBALL ?= yarn-$(YARN_VERSION).tar.gz
YARN_PATH ?= /tmp/nni-yarn

SERVE_VERSION ?= 10.0.1
SERVE_TARBALL ?= serve-$(SERVE_VERSION).tgz
SERVE_PATH ?= $(INSTALL_PREFIX)/nni/serve


## Check if dependencies have been installed globally
ifeq (, $(shell command -v node 2>/dev/null))
    $(info Node.js not found)
    _MISS_DEPS := 1  # node not found
else
    _VER := $(shell node --version)
    _NEWER := $(shell echo -e "$(NODE_VERSION)\n$(_VER)" | sort -Vr | head -n 1)
    ifneq ($(_VER), $(_NEWER))
        $(info Node.js version not match)
        _MISS_DEPS := 1  # node outdated
    endif
endif
ifeq (, $(shell command -v yarnpkg 2>/dev/null))
    $(info Yarn not found)
    _MISS_DEPS := 1  # yarn not found
endif
ifeq (, $(shell command -v serve 2>/dev/null))
    $(info Serve not found)
    _MISS_DEPS := 1  # serve not found
endif

ifdef _MISS_DEPS
    $(info Missing dependencies, use local toolchain)
    NODE := $(NODE_PATH)/bin/node
    YARN := PATH=$${PATH}:$(NODE_PATH)/bin $(YARN_PATH)/bin/yarn
    SERVE := $(SERVE_PATH)/serve
else
    $(info All dependencies found, use global toolchain)
    NODE := node
    YARN := yarnpkg
    SERVE := serve
endif

## Colorful output
_INFO := $(shell echo -e '\e[1;36m')
_WARNING := $(shell echo -e '\e[1;33m')
_END := $(shell echo -e '\e[0m')

# Setting variables end


# Main targets

.PHONY: build
Deshui Yu's avatar
Deshui Yu committed
82
build:
liuzhe-lz's avatar
liuzhe-lz committed
83
84
	#$(_INFO) Building NNI Manager $(_END)
	cd src/nni_manager && $(YARN) && $(YARN) build
Deshui Yu's avatar
Deshui Yu committed
85
	
liuzhe-lz's avatar
liuzhe-lz committed
86
87
	#$(_INFO) Building Web UI $(_END)
	cd src/webui && $(YARN) && $(YARN) build
Deshui Yu's avatar
Deshui Yu committed
88
	
liuzhe-lz's avatar
liuzhe-lz committed
89
	#$(_INFO) Building Python SDK $(_END)
Deshui Yu's avatar
Deshui Yu committed
90
91
	cd src/sdk/pynni && python3 setup.py build
	
liuzhe-lz's avatar
liuzhe-lz committed
92
	#$(_INFO) Building nnictl $(_END)
Deshui Yu's avatar
Deshui Yu committed
93
94
	cd tools && python3 setup.py build

liuzhe-lz's avatar
liuzhe-lz committed
95
96
97
98
99
100
101
# Standard installation target
# Must be invoked after building
.PHONY: install
install: install-python-modules
install: install-node-modules
install: install-scripts
install: install-examples
Deshui Yu's avatar
Deshui Yu committed
102
install:
liuzhe-lz's avatar
liuzhe-lz committed
103
	#$(_INFO) Complete! You may want to add $(BIN_PATH) to your PATH environment $(_END)
104

liuzhe-lz's avatar
liuzhe-lz committed
105
106
107
108
109

# Target for remote machine workers
# Only installs core SDK module
.PHONY: remote-machine-install
remote-machine-install:
110
	cd src/sdk/pynni && python3 setup.py install $(PIP_MODE)
liuzhe-lz's avatar
liuzhe-lz committed
111
112


liuzhe-lz's avatar
liuzhe-lz committed
113
# All-in-one target for non-expert users
liuzhe-lz's avatar
liuzhe-lz committed
114
115
116
117
118
# Installs NNI as well as its dependencies, and update bashrc to set PATH
.PHONY: easy-install
easy-install: check-perm
easy-install: install-dependencies
easy-install: build
liuzhe-lz's avatar
liuzhe-lz committed
119
easy-install: install
liuzhe-lz's avatar
liuzhe-lz committed
120
121
easy-install: update-bash-config

liuzhe-lz's avatar
liuzhe-lz committed
122
123
124
125
126
127
128
129
130
131
132
133
easy-install:
	#$(_INFO) Complete! #(_END)


# Target for setup.py
# Do not invoke this manually
.PHONY: pip-install
pip-install: install-dependencies
pip-install: build
pip-install: install-node-modules
pip-install: install-scripts
pip-install: install-examples
liuzhe-lz's avatar
liuzhe-lz committed
134
pip-install: update-bash-config
liuzhe-lz's avatar
liuzhe-lz committed
135
136
137
138
139
140
141
142
143
144
145
146
147
148


# Target for NNI developers
# Creates symlinks instead of copying files
.PHONY: dev-install
dev-install: check-dev-env
dev-install: install-dev-modules
dev-install: install-scripts
dev-install:
	#$(_INFO) Complete! You may want to add $(BIN_PATH) to your PATH environment $(_END)


.PHONY: uninstall
uninstall:
Zejun Lin's avatar
Zejun Lin committed
149
150
	-$(PIP_UNINSTALL) -y nni
	-$(PIP_UNINSTALL) -y nnictl
liuzhe-lz's avatar
liuzhe-lz committed
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
	-rm -rf $(INSTALL_PREFIX)/nni
	-rm -f $(BIN_PATH)/nnimanager
	-rm -f $(BIN_PATH)/nnictl
	-rm -f $(BASH_COMP_SCRIPT)
	-[ $(EXAMPLES_PATH) = ${PWD}/examples ] || rm -rf $(EXAMPLES_PATH)

# Main targets end


# Helper targets

$(NODE_TARBALL):
	#$(_INFO) Downloading Node.js $(_END)
	wget https://nodejs.org/dist/$(NODE_VERSION)/$(NODE_TARBALL)

$(YARN_TARBALL):
	#$(_INFO) Downloading Yarn $(_END)
	wget https://github.com/yarnpkg/yarn/releases/download/$(YARN_VERSION)/$(YARN_TARBALL)

$(SERVE_TARBALL):
	#$(_INFO) Downloading serve $(_END)
	wget https://registry.npmjs.org/serve/-/$(SERVE_TARBALL)

.PHONY: intall-dependencies
install-dependencies: $(NODE_TARBALL) $(YARN_TARBALL) $(SERVE_TARBALL)
	#$(_INFO) Cleaning $(_END)
	rm -rf $(NODE_PATH)
	rm -rf $(YARN_PATH)
	rm -rf $(SERVE_PATH)
	mkdir -p $(NODE_PATH)
	mkdir -p $(YARN_PATH)
	mkdir -p $(SERVE_PATH)
Deshui Yu's avatar
Deshui Yu committed
183
	
liuzhe-lz's avatar
liuzhe-lz committed
184
185
186
	#$(_INFO) Extracting Node.js $(_END)
	tar -xf $(NODE_TARBALL)
	mv -fT node-$(NODE_VERSION)-linux-x64 $(NODE_PATH)
Deshui Yu's avatar
Deshui Yu committed
187
	
liuzhe-lz's avatar
liuzhe-lz committed
188
189
190
	#$(_INFO) Extracting Yarn $(_END)
	tar -xf $(YARN_TARBALL)
	mv -fT yarn-$(YARN_VERSION) $(YARN_PATH)
Deshui Yu's avatar
Deshui Yu committed
191
	
liuzhe-lz's avatar
liuzhe-lz committed
192
193
	#$(_INFO) Installing serve $(_END)
	PATH=$${PATH}:$(NODE_PATH)/bin npm install --prefix $(SERVE_PATH) $(SERVE_TARBALL)
Deshui Yu's avatar
Deshui Yu committed
194
	
liuzhe-lz's avatar
liuzhe-lz committed
195
196
197
198
	#$(_INFO) Creating serve executable script $(_END)
	echo '#!/bin/sh' > $(SERVE_PATH)/serve
	echo '$(NODE) $(SERVE_PATH)/node_modules/serve/bin/serve.js $$@' >> $(SERVE_PATH)/serve
	chmod +x $(SERVE_PATH)/serve
199
200


liuzhe-lz's avatar
liuzhe-lz committed
201
202
203
204
.PHONY: install-python-modules
install-python-modules:
	#$(_INFO) Installing Python SDK $(_END)
	cd src/sdk/pynni && python3 setup.py install $(PIP_MODE)
205
	
liuzhe-lz's avatar
liuzhe-lz committed
206
207
	#$(_INFO) Installing nnictl $(_END)
	cd tools && python3 setup.py install $(PIP_MODE)
208

liuzhe-lz's avatar
liuzhe-lz committed
209
210
.PHONY: install-node-modules
install-node-modules:
211
212
	mkdir -p $(INSTALL_PREFIX)/nni
	
liuzhe-lz's avatar
liuzhe-lz committed
213
	#$(_INFO) Installing NNI Manager $(_END)
214
215
216
	cp -rT src/nni_manager/dist $(INSTALL_PREFIX)/nni/nni_manager
	cp -rT src/nni_manager/node_modules $(INSTALL_PREFIX)/nni/nni_manager/node_modules
	
liuzhe-lz's avatar
liuzhe-lz committed
217
218
	#$(_INFO) Installing Web UI $(_END)
	cp -rT src/webui/build $(INSTALL_PREFIX)/nni/webui
Deshui Yu's avatar
Deshui Yu committed
219
220


liuzhe-lz's avatar
liuzhe-lz committed
221
222
223
.PHONY: install-dev-modules
install-dev-modules:
	#$(_INFO) Installing Python SDK $(_END)
Zejun Lin's avatar
Zejun Lin committed
224
	cd src/sdk/pynni && $(PIP_INSTALL) $(PIP_MODE) -e .
225
	
liuzhe-lz's avatar
liuzhe-lz committed
226
	#$(_INFO) Installing nnictl $(_END)
Zejun Lin's avatar
Zejun Lin committed
227
	cd tools && $(PIP_INSTALL) $(PIP_MODE) -e .
228

liuzhe-lz's avatar
liuzhe-lz committed
229
	mkdir -p $(INSTALL_PREFIX)/nni
230
	
liuzhe-lz's avatar
liuzhe-lz committed
231
232
233
	#$(_INFO) Installing NNI Manager $(_END)
	ln -sf $(PWD)/src/nni_manager/dist $(INSTALL_PREFIX)/nni/nni_manager
	ln -sf $(PWD)/src/nni_manager/node_modules $(INSTALL_PREFIX)/nni/nni_manager/node_modules
Deshui Yu's avatar
Deshui Yu committed
234
	
liuzhe-lz's avatar
liuzhe-lz committed
235
236
237
238
239
240
241
	#$(_INFO) Installing Web UI $(_END)
	ln -sf $(PWD)/src/webui/build $(INSTALL_PREFIX)/nni/webui


.PHONY: install-scripts
install-scripts:
	mkdir -p $(BIN_PATH)
242
243
	
	echo '#!/bin/sh' > $(BIN_PATH)/nnimanager
liuzhe-lz's avatar
liuzhe-lz committed
244
245
	echo 'cd $(INSTALL_PREFIX)/nni/nni_manager' >> $(BIN_PATH)/nnimanager
	echo '$(NODE) main.js $$@' >> $(BIN_PATH)/nnimanager
246
247
248
	chmod +x $(BIN_PATH)/nnimanager
	
	echo '#!/bin/sh' > $(BIN_PATH)/nnictl
liuzhe-lz's avatar
liuzhe-lz committed
249
250
251
252
	echo 'NNI_MANAGER=$(BIN_PATH)/nnimanager \' >> $(BIN_PATH)/nnictl
	echo 'NNI_SERVE=$(SERVE) \' >> $(BIN_PATH)/nnictl
	echo 'WEB_UI_FOLDER=$(INSTALL_PREFIX)/nni/webui \' >> $(BIN_PATH)/nnictl
	echo 'python3 -m nnicmd.nnictl $$@' >> $(BIN_PATH)/nnictl
253
254
	chmod +x $(BIN_PATH)/nnictl
	
liuzhe-lz's avatar
liuzhe-lz committed
255
	install -Dm644 tools/bash-completion $(BASH_COMP_SCRIPT)
Deshui Yu's avatar
Deshui Yu committed
256
257


liuzhe-lz's avatar
liuzhe-lz committed
258
259
260
261
262
263
.PHONY: install-examples
install-examples:
	mkdir -p $(EXAMPLES_PATH)
	[ $(EXAMPLES_PATH) = ${PWD}/examples ] || cp -rT examples $(EXAMPLES_PATH)


liuzhe-lz's avatar
liuzhe-lz committed
264
265
266
267
268
.PHONY: update-bash-config
ifndef _ROOT
update-bash-config:
	#$(_INFO) Updating bash configurations $(_END)
    ifeq (, $(shell echo $$PATH | tr ':' '\n' | grep -x '$(BIN_PATH)'))  # $(BIN_PATH) not in PATH
liuzhe-lz's avatar
liuzhe-lz committed
269
270
	#$(_WARNING) NOTE: adding $(BIN_PATH) to PATH in bashrc $(_END)
	echo 'export PATH="$$PATH:$(BIN_PATH)"' >> ~/.bashrc
liuzhe-lz's avatar
liuzhe-lz committed
271
272
273
274
275
276
277
    endif
    ifeq (, $(shell (source ~/.bash_completion ; command -v _nnictl) 2>/dev/null))  # completion not installed
	#$(_WARNING) NOTE: adding $(BASH_COMP_SCRIPT) to ~/.bash_completion $(_END)
	echo '[[ -f $(BASH_COMP_SCRIPT) ]] && source $(BASH_COMP_SCRIPT)' >> ~/.bash_completion
    endif
else
update-bash-config: ;
liuzhe-lz's avatar
liuzhe-lz committed
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
endif


.PHONY: check-perm
ifdef _ROOT
check-perm:
	#$(_WARNING) Run easy-install as root is not optimal $(_END)
	#$(_WARNING) Suggest run as non-privileged user or manually install instead $(_END)
	#$(_WARNING) Continue easy-install as root? (y/N) $(_END)
	@read CONFIRM && [ "$$CONFIRM" = y ]
else
check-perm: ;
endif


.PHONY: check-dev-env
check-dev-env:
	#$(_INFO) Checking developing environment... $(_END)
ifdef _ROOT
	$(error You should not develop NNI as root)
endif
ifdef _MISS_DEPS
Gems Guo's avatar
Gems Guo committed
300
#	$(error Please install Node.js, Yarn, and Serve to develop NNI)
liuzhe-lz's avatar
liuzhe-lz committed
301
302
303
304
endif
	#$(_INFO) Pass! $(_END)

# Helper targets end