#!/usr/bin/make -f HOST_ARCH?=$(shell uname -m) TARGET_ARCH?=$(shell uname -m) BUILD_TYPE?=Debug CROSS_BUILD?=0 HOST_OS?=linux TARGET_OS?=linux COVERAGE_BUILD?=0 OPTIONS?= # make TARGET and TYPE to lowercase HOST_ARCH_LC=$(shell echo $(HOST_ARCH) | tr A-Z a-z) TARGET_ARCH_LC=$(shell echo $(TARGET_ARCH) | tr A-Z a-z) BUILD_TYPE_LC=$(shell echo $(BUILD_TYPE) | tr A-Z a-z) # we need base name 'arm` for all arm arch TARGET_ARCH_BASE=$(TARGET_ARCH_LC) ifneq (,$(findstring arm64,$(TARGET_ARCH_BASE))) TARGET_ARCH_LC=aarch64 else ifneq (,$(findstring arm,$(TARGET_ARCH_BASE))) TARGET_ARCH_LC=armv7l else ifneq (,$(findstring aarch64,$(TARGET_ARCH_BASE))) TARGET_ARCH_LC=aarch64 endif ifneq (,$(findstring android,$(TARGET_OS))) # Android only allow aarch64 target-arch TARGET_ARCH_LC=aarch64 endif # Set CROSS_BUILD=1 when ROOTFS_DIR is given, and TARGET_ARCH is different to HOST_ARCH. ifneq ($(ROOTFS_DIR),) ifneq ($(TARGET_ARCH_LC),$(HOST_ARCH_LC)) CROSS_BUILD=$(if $(wildcard $(ROOTFS_DIR)),1,0) endif endif # the toolchain file, only for cross build ifeq ($(CROSS_BUILD),1) TOOLCHAIN_FILE=cmake/buildtool/cross/toolchain_$(TARGET_ARCH_LC)-$(TARGET_OS).cmake OPTIONS+= -DCMAKE_TOOLCHAIN_FILE=$(TOOLCHAIN_FILE) endif ifneq ($(filter create-covsuite,$(MAKECMDGOALS)),) OPTIONS+= -DENABLE_COVERAGE=ON else ifeq ($(COVERAGE_BUILD),1) OPTIONS+= -DENABLE_COVERAGE=ON else OPTIONS+= -DENABLE_COVERAGE=OFF endif endif ifneq ($(EXTERNAL_VOLUME),) OPTIONS+= -DNNAS_EXTERNALS_DIR=$(EXTERNAL_VOLUME) endif ifeq ($(TARGET_OS),android) OPTIONS+= -DNDK_DIR=$(NDK_DIR) endif ifneq ($(ANDROID_BUILD_TOOLS_DIR),) OPTIONS+= -DANDROID_BUILD_TOOLS_DIR=$(ANDROID_BUILD_TOOLS_DIR) endif ifneq ($(ANDROID_SDK_DIR),) OPTIONS+= -DANDROID_SDK_DIR=$(ANDROID_SDK_DIR) endif ifneq ($(TFLITE_MODEL_PATH),) OPTIONS+= -DTFLITE_MODEL_PATH=$(TFLITE_MODEL_PATH) endif ifneq ($(ANDROID_BOOST_ROOT),) OPTIONS+= -DANDROID_BOOST_ROOT=$(ANDROID_BOOST_ROOT) endif ifeq ($(HOST_OS),linux) NPROCS?=$(shell grep -c ^processor /proc/cpuinfo) else NPROCS?=1 endif WORKHOME=$(CURDIR)/Product WORKFOLDER=$(TARGET_ARCH_LC)-$(TARGET_OS).$(BUILD_TYPE_LC) WORKSPACE=$(WORKHOME)/$(WORKFOLDER) INSTALL_PATH?=$(WORKSPACE)/out OVERLAY_FOLDER?=$(WORKSPACE)/overlay INSTALL_ALIAS=$(WORKHOME)/out TIMESTAMP_CONFIGURE=$(WORKSPACE)/CONFIGURE TIMESTAMP_BUILD=$(WORKSPACE)/BUILD TIMESTAMP_INSTALL=$(WORKSPACE)/INSTALL ### ### Common environment variable ### export NNFW_WORKSPACE=$(WORKSPACE) ### ### Common environment variable for compiler module ### NNCC_FOLDER=Product/$(WORKFOLDER)/nncc export NNCC_WORKSPACE=$(NNCC_FOLDER) ### ### Default target ### all: install ### ### Command (public) ### prepare-nncc: prepare_nncc_internal configure: configure_internal build: build_internal install: install_all_internal create-package: runtime_tar_internal create-aclpack: acl_tar_internal create-testsuite: test_suite_internal create-covsuite: coverage_suite_internal clean: rm -rf $(WORKSPACE) distclean: rm -rf Product rm -rf externals rm -rf tests/nnapi/src/generated/ # create_package, create_acl_tar: to be removed create_package: runtime_tar_internal create_acl_tar: acl_tar_internal ### ### Command (internal) ### $(WORKSPACE): mkdir -p $@ prepare_nncc_internal: $(WORKSPACE) ifneq ($(CROSS_BUILD),1) ./nncc configure -DBUILD_GTEST=OFF -DENABLE_TEST=OFF -DEXTERNALS_BUILD_THREADS=$(NPROCS) -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) \ -DCMAKE_INSTALL_PREFIX=$(OVERLAY_FOLDER) \ -DBUILD_WHITELIST="luci;foder;pepper-csv2vec;loco;locop;logo;logo-core;mio-circle06;luci-compute;oops;hermes;hermes-std;angkor;pp;pepper-strcast;pepper-str" ./nncc build -j$(NPROCS) cmake --install $(NNCC_FOLDER) # install angkor TensorIndex and oops InternalExn header (TODO: Remove this) @mkdir -p ${OVERLAY_FOLDER}/include/nncc/core/ADT/tensor @mkdir -p ${OVERLAY_FOLDER}/include/oops @cp compiler/angkor/include/nncc/core/ADT/tensor/Index.h ${OVERLAY_FOLDER}/include/nncc/core/ADT/tensor @cp compiler/oops/include/oops/InternalExn.h ${OVERLAY_FOLDER}/include/oops endif @echo "Done prepare-nncc" configure_internal: $(WORKSPACE) ifneq ($(DEBIAN_BUILD),) test -d externals || mkdir -p externals find packaging/ -type f -name "*.tar.gz" | xargs -i tar xf {} -C externals endif NNFW_INSTALL_PREFIX=$(INSTALL_PATH) ./nnfw configure \ -DCMAKE_BUILD_TYPE=$(BUILD_TYPE_LC) \ -DNNFW_OVERLAY_DIR=$(OVERLAY_FOLDER) \ -DEXTERNALS_BUILD_THREADS=$(NPROCS) \ $(OPTIONS) build_internal: configure_internal ./nnfw build -j $(NPROCS) install_internal: build_internal ./nnfw install rm -rf $(INSTALL_ALIAS) ln -s $(INSTALL_PATH) $(INSTALL_ALIAS) runtime_tar_internal: build_internal install_internal tar -zcf $(WORKSPACE)/onert-package.tar.gz -C $(INSTALL_PATH) lib tar -zcf $(WORKSPACE)/onert-devel-package.tar.gz -C $(INSTALL_PATH) include/nnfw tar -zcf $(WORKSPACE)/onert-plugin-devel-package.tar.gz -C $(INSTALL_PATH) include/onert tar -zcf $(WORKSPACE)/onert-test-package.tar.gz -C $(INSTALL_PATH) $(shell ls $(INSTALL_PATH) -I lib -I include) acl_tar_internal: configure_internal tar -zcf $(WORKSPACE)/onert-acl.tar.gz -C ${OVERLAY_FOLDER} lib/libarm_compute.so lib/libarm_compute_core.so lib/libarm_compute_graph.so install_acl_internal: # Workaround to install acl for test (ignore error when there is no file to copy) @cp $(OVERLAY_FOLDER)/lib/libarm_compute*.so $(INSTALL_ALIAS)/lib 2>/dev/null || true install_luci_internal: @mkdir -p $(INSTALL_ALIAS)/lib/nnfw/odc @cp $(OVERLAY_FOLDER)/lib/libluci*.so $(INSTALL_ALIAS)/lib/nnfw/odc 2>/dev/null || true @cp $(OVERLAY_FOLDER)/lib/libloco*.so $(INSTALL_ALIAS)/lib/nnfw/odc 2>/dev/null || true install_all_internal: install_internal install_acl_internal install_luci_internal test_suite_internal: install_all_internal @echo "packaging test suite" @rm -rf $(INSTALL_PATH)/test-suite.tar.gz # TODO Divide runtime package, external library package, and test suite @tar -zcf test-suite.tar.gz tests/scripts infra Product/out --dereference @mv test-suite.tar.gz $(INSTALL_PATH)/. coverage_suite_internal: install_all_internal @echo "packaging test-coverage suite" @rm -rf $(INSTALL_PATH)/coverage-suite.tar.gz @find Product -name "*.gcno" > include_lists.txt @pwd | grep -o '/' | wc -l > tests/scripts/build_path_depth.txt @tar -zcf coverage-suite.tar.gz tests/scripts infra Product/out --dereference -T include_lists.txt @rm -rf include_lists.txt tests/scripts/build_path_depth.txt @mv coverage-suite.tar.gz $(INSTALL_PATH)/.