Makefile 8.1 KB
Newer Older
liuzhe-lz's avatar
liuzhe-lz committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Setting variables

SHELL := /bin/bash

## 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
20
endif
Deshui Yu's avatar
Deshui Yu committed
21

liuzhe-lz's avatar
liuzhe-lz committed
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
## Dependency information
NODE_VERSION ?= v10.9.0
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
80
build:
liuzhe-lz's avatar
liuzhe-lz committed
81
82
	#$(_INFO) Building NNI Manager $(_END)
	cd src/nni_manager && $(YARN) && $(YARN) build
Deshui Yu's avatar
Deshui Yu committed
83
	
liuzhe-lz's avatar
liuzhe-lz committed
84
85
	#$(_INFO) Building Web UI $(_END)
	cd src/webui && $(YARN) && $(YARN) build
Deshui Yu's avatar
Deshui Yu committed
86
	
liuzhe-lz's avatar
liuzhe-lz committed
87
	#$(_INFO) Building Python SDK $(_END)
Deshui Yu's avatar
Deshui Yu committed
88
89
	cd src/sdk/pynni && python3 setup.py build
	
liuzhe-lz's avatar
liuzhe-lz committed
90
	#$(_INFO) Building nnictl $(_END)
Deshui Yu's avatar
Deshui Yu committed
91
92
93
	cd tools && python3 setup.py build


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

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

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


liuzhe-lz's avatar
liuzhe-lz committed
112
# All-in-one target for non-expert users
liuzhe-lz's avatar
liuzhe-lz committed
113
114
115
116
117
# 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
118
easy-install: install
liuzhe-lz's avatar
liuzhe-lz committed
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
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:
	-pip3 uninstall -y nni
	-pip3 uninstall -y nnictl
	-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
180
	
liuzhe-lz's avatar
liuzhe-lz committed
181
182
183
	#$(_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
184
	
liuzhe-lz's avatar
liuzhe-lz committed
185
186
187
	#$(_INFO) Extracting Yarn $(_END)
	tar -xf $(YARN_TARBALL)
	mv -fT yarn-$(YARN_VERSION) $(YARN_PATH)
Deshui Yu's avatar
Deshui Yu committed
188
	
liuzhe-lz's avatar
liuzhe-lz committed
189
190
	#$(_INFO) Installing serve $(_END)
	PATH=$${PATH}:$(NODE_PATH)/bin npm install --prefix $(SERVE_PATH) $(SERVE_TARBALL)
Deshui Yu's avatar
Deshui Yu committed
191
	
liuzhe-lz's avatar
liuzhe-lz committed
192
193
194
195
	#$(_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
196
197


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

206

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


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


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


liuzhe-lz's avatar
liuzhe-lz committed
259
260
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
299
300
301
.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
	$(error Please install Node.js, Yarn, and Serve to develop NNI)
endif
	#$(_INFO) Pass! $(_END)

# Helper targets end