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
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
easy-install: update-bash-config

liuzhe-lz's avatar
liuzhe-lz committed
123
124
125
126
127
128
129
130
131
132
133
134
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
135
pip-install: update-bash-config
liuzhe-lz's avatar
liuzhe-lz committed
136
137
138
139
140
141
142
143
144
145
146
147
148
149


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


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

210

liuzhe-lz's avatar
liuzhe-lz committed
211
212
.PHONY: install-node-modules
install-node-modules:
213
214
	mkdir -p $(INSTALL_PREFIX)/nni
	
liuzhe-lz's avatar
liuzhe-lz committed
215
	#$(_INFO) Installing NNI Manager $(_END)
216
217
218
	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
219
220
	#$(_INFO) Installing Web UI $(_END)
	cp -rT src/webui/build $(INSTALL_PREFIX)/nni/webui
Deshui Yu's avatar
Deshui Yu committed
221
222


liuzhe-lz's avatar
liuzhe-lz committed
223
224
225
.PHONY: install-dev-modules
install-dev-modules:
	#$(_INFO) Installing Python SDK $(_END)
Zejun Lin's avatar
Zejun Lin committed
226
	cd src/sdk/pynni && $(PIP_INSTALL) $(PIP_MODE) -e .
227
	
liuzhe-lz's avatar
liuzhe-lz committed
228
	#$(_INFO) Installing nnictl $(_END)
Zejun Lin's avatar
Zejun Lin committed
229
	cd tools && $(PIP_INSTALL) $(PIP_MODE) -e .
230
	
liuzhe-lz's avatar
liuzhe-lz committed
231
	mkdir -p $(INSTALL_PREFIX)/nni
232
	
liuzhe-lz's avatar
liuzhe-lz committed
233
234
235
	#$(_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
236
	
liuzhe-lz's avatar
liuzhe-lz committed
237
238
239
240
241
242
243
	#$(_INFO) Installing Web UI $(_END)
	ln -sf $(PWD)/src/webui/build $(INSTALL_PREFIX)/nni/webui


.PHONY: install-scripts
install-scripts:
	mkdir -p $(BIN_PATH)
244
245
	
	echo '#!/bin/sh' > $(BIN_PATH)/nnimanager
liuzhe-lz's avatar
liuzhe-lz committed
246
247
	echo 'cd $(INSTALL_PREFIX)/nni/nni_manager' >> $(BIN_PATH)/nnimanager
	echo '$(NODE) main.js $$@' >> $(BIN_PATH)/nnimanager
248
249
250
	chmod +x $(BIN_PATH)/nnimanager
	
	echo '#!/bin/sh' > $(BIN_PATH)/nnictl
liuzhe-lz's avatar
liuzhe-lz committed
251
252
253
254
	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
255
256
	chmod +x $(BIN_PATH)/nnictl
	
liuzhe-lz's avatar
liuzhe-lz committed
257
	install -Dm644 tools/bash-completion $(BASH_COMP_SCRIPT)
Deshui Yu's avatar
Deshui Yu committed
258
259


liuzhe-lz's avatar
liuzhe-lz committed
260
261
262
263
264
265
.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
266
267
268
269
270
.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
271
272
	#$(_WARNING) NOTE: adding $(BIN_PATH) to PATH in bashrc $(_END)
	echo 'export PATH="$$PATH:$(BIN_PATH)"' >> ~/.bashrc
liuzhe-lz's avatar
liuzhe-lz committed
273
274
275
276
277
278
279
    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
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
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
302
#	$(error Please install Node.js, Yarn, and Serve to develop NNI)
liuzhe-lz's avatar
liuzhe-lz committed
303
304
305
306
endif
	#$(_INFO) Pass! $(_END)

# Helper targets end