Makefile 8.19 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
95
	cd tools && python3 setup.py build


liuzhe-lz's avatar
liuzhe-lz committed
96
97
98
99
100
101
102
# 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
103
install:
liuzhe-lz's avatar
liuzhe-lz committed
104
	#$(_INFO) Complete! You may want to add $(BIN_PATH) to your PATH environment $(_END)
105

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

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


liuzhe-lz's avatar
liuzhe-lz committed
114
# All-in-one target for non-expert users
liuzhe-lz's avatar
liuzhe-lz committed
115
116
117
118
119
# 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
120
easy-install: install
liuzhe-lz's avatar
liuzhe-lz committed
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
easy-install: update-bashrc
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


# 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
148
149
	-$(PIP_UNINSTALL) -y nni
	-$(PIP_UNINSTALL) -y nnictl
liuzhe-lz's avatar
liuzhe-lz committed
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
	-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
182
	
liuzhe-lz's avatar
liuzhe-lz committed
183
184
185
	#$(_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
186
	
liuzhe-lz's avatar
liuzhe-lz committed
187
188
189
	#$(_INFO) Extracting Yarn $(_END)
	tar -xf $(YARN_TARBALL)
	mv -fT yarn-$(YARN_VERSION) $(YARN_PATH)
Deshui Yu's avatar
Deshui Yu committed
190
	
liuzhe-lz's avatar
liuzhe-lz committed
191
192
	#$(_INFO) Installing serve $(_END)
	PATH=$${PATH}:$(NODE_PATH)/bin npm install --prefix $(SERVE_PATH) $(SERVE_TARBALL)
Deshui Yu's avatar
Deshui Yu committed
193
	
liuzhe-lz's avatar
liuzhe-lz committed
194
195
196
197
	#$(_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
198
199


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

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
256
257
258
	install -Dm644 tools/bash-completion $(BASH_COMP_SCRIPT)
ifndef _ROOT
	echo '[[ -f $(BASH_COMP_SCRIPT) ]] && source $(BASH_COMP_SCRIPT)' >> ~/.bash_completion
endif
Deshui Yu's avatar
Deshui Yu committed
259
260


liuzhe-lz's avatar
liuzhe-lz committed
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
.PHONY: install-examples
install-examples:
	mkdir -p $(EXAMPLES_PATH)
	[ $(EXAMPLES_PATH) = ${PWD}/examples ] || cp -rT examples $(EXAMPLES_PATH)


.PHONY: update-bashrc
ifeq (, $(shell echo $$PATH | tr ':' '\n' | grep -x '$(BIN_PATH)'))  # $(BIN_PATH) not in PATH
    ifdef _ROOT
        $(error $(BIN_PATH) not in PATH as root, which should never happen)
    endif
update-bashrc:
	#$(_WARNING) NOTE: adding $(BIN_PATH) to PATH in bashrc $(_END)
	echo 'export PATH="$$PATH:$(BIN_PATH)"' >> ~/.bashrc
else  # $(BIN_PATH) already in PATH
update-bashrc: ;
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
299
#	$(error Please install Node.js, Yarn, and Serve to develop NNI)
liuzhe-lz's avatar
liuzhe-lz committed
300
301
302
303
endif
	#$(_INFO) Pass! $(_END)

# Helper targets end