# Setting variables SHELL := /bin/bash PIP_INSTALL := python3 -m pip install PIP_UNINSTALL := python3 -m pip uninstall ## Colorful output _INFO := $(shell echo -e '\e[1;36m') _WARNING := $(shell echo -e '\e[1;33m') _END := $(shell echo -e '\e[0m') ## Install directories ifeq ($(shell id -u), 0) # is root _ROOT := 1 BIN_FOLDER ?= /usr/local/bin NNI_PKG_PATH ?= /usr/local/nni_pkg BASH_COMP_SCRIPT ?= /usr/share/bash-completion/completions/nnictl else # is normal user BIN_FOLDER ?= ${HOME}/.local/bin NNI_PKG_PATH ?= ${HOME}/.local/nni_pkg ifndef VIRTUAL_ENV PIP_MODE ?= --user endif BASH_COMP_SCRIPT ?= ${HOME}/.bash_completion.d/nnictl endif ## Dependency information $(info $(_INFO) Installing dependencies, use local toolchain $(_END)) NNI_NODE_TARBALL ?= /tmp/nni-node-linux-x64.tar.xz NNI_NODE_FOLDER = /tmp/nni-node-linux-x64 NNI_NODE ?= $(BIN_FOLDER)/node NNI_YARN_TARBALL ?= /tmp/nni-yarn.tar.gz NNI_YARN_FOLDER ?= /tmp/nni-yarn NNI_YARN := PATH=$(BIN_FOLDER):$${PATH} $(NNI_YARN_FOLDER)/bin/yarn # Main targets .PHONY: build build: #$(_INFO) Building NNI Manager $(_END) cd src/nni_manager && $(NNI_YARN) && $(NNI_YARN) build #$(_INFO) Building WebUI $(_END) cd src/webui && $(NNI_YARN) && $(NNI_YARN) build #$(_INFO) Building Python SDK $(_END) cd src/sdk/pynni && python3 setup.py build #$(_INFO) Building nnictl $(_END) cd tools && python3 setup.py build # Standard installation target # Must be invoked after building .PHONY: install install: install-python-modules install: install-node-modules install: install-scripts install: #$(_INFO) Complete! You may want to add $(BIN_FOLDER) to your PATH environment $(_END) # Target for remote machine workers # Only installs core SDK module .PHONY: remote-machine-install remote-machine-install: cd src/sdk/pynni && python3 setup.py install $(PIP_MODE) # All-in-one target for non-expert users # 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 easy-install: install easy-install: update-bash-config 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: update-bash-config # 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_FOLDER) to your PATH environment $(_END) .PHONY: uninstall uninstall: -$(PIP_UNINSTALL) -y nni -$(PIP_UNINSTALL) -y nnictl -rm -rf $(NNI_PKG_PATH) -rm -f $(BIN_FOLDER)/node -rm -f $(BIN_FOLDER)/nnictl -rm -f $(BASH_COMP_SCRIPT) # Main targets end # Helper targets $(NNI_NODE_TARBALL): #$(_INFO) Downloading Node.js $(_END) wget https://aka.ms/nodejs-download -O $(NNI_NODE_TARBALL) $(NNI_YARN_TARBALL): #$(_INFO) Downloading Yarn $(_END) wget https://aka.ms/yarn-download -O $(NNI_YARN_TARBALL) .PHONY: intall-dependencies install-dependencies: $(NNI_NODE_TARBALL) $(NNI_YARN_TARBALL) #$(_INFO) Extracting Node.js $(_END) rm -rf $(NNI_NODE_FOLDER) mkdir $(NNI_NODE_FOLDER) tar -xf $(NNI_NODE_TARBALL) -C $(NNI_NODE_FOLDER) --strip-components 1 mkdir -p $(BIN_FOLDER) rm -f $(NNI_NODE) cp $(NNI_NODE_FOLDER)/bin/node $(NNI_NODE) #$(_INFO) Extracting Yarn $(_END) rm -rf $(NNI_YARN_FOLDER) mkdir $(NNI_YARN_FOLDER) tar -xf $(NNI_YARN_TARBALL) -C $(NNI_YARN_FOLDER) --strip-components 1 .PHONY: install-python-modules install-python-modules: #$(_INFO) Installing Python SDK $(_END) cd src/sdk/pynni && $(PIP_INSTALL) $(PIP_MODE) . #$(_INFO) Installing nnictl $(_END) cd tools && $(PIP_INSTALL) $(PIP_MODE) . .PHONY: install-node-modules install-node-modules: #$(_INFO) Installing NNI Package $(_END) rm -rf $(NNI_PKG_PATH) cp -r src/nni_manager/dist $(NNI_PKG_PATH) cp src/nni_manager/package.json $(NNI_PKG_PATH) $(NNI_YARN) --prod --cwd $(NNI_PKG_PATH) cp -r src/webui/build $(NNI_PKG_PATH)/static .PHONY: install-dev-modules install-dev-modules: #$(_INFO) Installing Python SDK $(_END) cd src/sdk/pynni && $(PIP_INSTALL) $(PIP_MODE) -e . #$(_INFO) Installing nnictl $(_END) cd tools && $(PIP_INSTALL) $(PIP_MODE) -e . rm -rf $(NNI_PKG_PATH) #$(_INFO) Installing NNI Package $(_END) ln -sf ${PWD}/src/nni_manager/dist $(NNI_PKG_PATH) ln -sf ${PWD}/src/nni_manager/node_modules $(NNI_PKG_PATH)/node_modules ln -sf ${PWD}/src/webui/build $(NNI_PKG_PATH)/static .PHONY: install-scripts install-scripts: mkdir -p $(BIN_FOLDER) touch $(BIN_FOLDER)/nnictl echo "#!/usr/bin/python3" >>$(BIN_FOLDER)/nnictl echo "# -*- coding: utf-8 -*-" >>$(BIN_FOLDER)/nnictl echo "import re" >>$(BIN_FOLDER)/nnictl echo "import sys" >>$(BIN_FOLDER)/nnictl echo "from nnicmd.nnictl import parse_args" >>$(BIN_FOLDER)/nnictl echo "if __name__ == '__main__':" >>$(BIN_FOLDER)/nnictl echo " sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$$', '', sys.argv[0])" >>$(BIN_FOLDER)/nnictl echo " sys.exit(parse_args())" >>$(BIN_FOLDER)/nnictl chmod +x $(BIN_FOLDER)/nnictl install -Dm644 tools/bash-completion $(BASH_COMP_SCRIPT) .PHONY: update-bash-config ifndef _ROOT update-bash-config: #$(_INFO) Updating bash configurations $(_END) ifeq (, $(shell echo $$PATH | tr ':' '\n' | grep -x '$(BIN_FOLDER)')) # $(BIN_FOLDER) not in PATH #$(_WARNING) NOTE: adding $(BIN_FOLDER) to PATH in bashrc $(_END) echo 'export PATH="$$PATH:$(BIN_FOLDER)"' >> ~/.bashrc 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: ; 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 #$(_INFO) Pass! $(_END) # Helper targets end