#!/usr/bin/make -f include /usr/share/dpkg/architecture.mk # We do not care about distro's LTO preferences. DEB_BUILD_MAINT_OPTIONS += optimize=-lto HALIDE_VERSION = 14 HALIDE_SOVERSION = 0 LLVM_VERSION = 14 WITH_LTO = OFF WITH_TESTS = ON WITH_PGO = OFF WITH_LLD = OFF ifeq ($(DEB_HOST_ARCH),amd64) WITH_LTO = ON WITH_TESTS = ON WITH_PGO = ON WITH_LLD = ON endif ifeq ($(DEB_HOST_ARCH),i386) WITH_LTO = ON WITH_TESTS = ON WITH_PGO = ON WITH_LLD = ON endif ifeq ($(DEB_HOST_ARCH),arm64) WITH_LTO = ON WITH_TESTS = ON WITH_PGO = ON WITH_LLD = ON endif ifneq (,$(filter nolto,$(DEB_BUILD_OPTIONS))) # Respect nolto. WITH_LTO = OFF endif ifneq (,$(filter nocheck,$(DEB_BUILD_OPTIONS))) # Respect nocheck. WITH_TESTS = OFF # If we aren't allowed to run tests, then certainly no PGO either. WITH_PGO = OFF endif ifneq (,$(filter nopgo,$(DEB_BUILD_OPTIONS))) # Respect nopgo. WITH_PGO = OFF endif CC = clang-$(LLVM_VERSION) CXX = clang++-$(LLVM_VERSION) SOURCE_DIR = $(CURDIR) BUILD_STAGE ?= 2 STAGE_COMPILE_FLAGS ?= CFLAGS = -g # DWZ supports, at most, DWARF4, while the default is DWARF5. CFLAGS += -fdebug-default-version=4 CFLAGS += $(STAGE_COMPILE_FLAGS) ifneq ($(WITH_LLD),OFF) CFLAGS += -fuse-ld=lld-$(LLVM_VERSION) -Wl,--build-id=sha1 endif CXXFLAGS = $(CFLAGS) PROFILE_DIR = $(SOURCE_DIR)/build-profile PROFILE_TMP_DIR = $(PROFILE_DIR)/raw LLVM_PROFILE_FILE = "$(PROFILE_TMP_DIR)/stage-$(BUILD_STAGE)-%p-%m.profraw" PROFILE = $(PROFILE_DIR)/default.profdata BUILD_DIR_PREFIX = $(SOURCE_DIR)/build STAGE_BUILD_DIR_PREFIX = $(BUILD_DIR_PREFIX)/stage-$(BUILD_STAGE) BUILD_DIR = $(STAGE_BUILD_DIR_PREFIX)/halide INSTALL_DIR = $(STAGE_BUILD_DIR_PREFIX)/halide-install APPS_BUILD_DIR = $(STAGE_BUILD_DIR_PREFIX)/halide-test-apps # Certain halide tests are sensitive to system load, and may be flaky. TEST_GROUPS_FLAKY = performance|auto_schedule %: dh $@ --with python3 --buildsystem=cmake+ninja perform_stage_build: LLVM_PROFILE_FILE=$(LLVM_PROFILE_FILE) dh_auto_configure --sourcedir=$(SOURCE_DIR) --builddir=$(BUILD_DIR) -- \ -DCMAKE_C_COMPILER=$(CC) \ -DCMAKE_CXX_COMPILER=$(CXX) \ -DCMAKE_C_FLAGS="$(CFLAGS)" \ -DCMAKE_CXX_FLAGS="$(CXXFLAGS)" \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=$(WITH_LTO) \ -DCMAKE_POSITION_INDEPENDENT_CODE=ON \ -DHalide_ENABLE_RTTI=ON \ -DHalide_ENABLE_EXCEPTIONS=ON \ -DWITH_PYTHON_BINDINGS=ON \ -DHalide_REQUIRE_LLVM_VERSION=$(LLVM_VERSION) \ -DLLVM_DIR=/usr/lib/llvm-$(LLVM_VERSION)/lib/cmake/llvm \ -DHalide_SOVERSION_OVERRIDE=$(HALIDE_SOVERSION) \ -DHalide_SHARED_LLVM=ON \ -DTARGET_WEBASSEMBLY=OFF \ -DWITH_TESTS=$(WITH_TESTS) \ -DWITH_TEST_PYTHON=$(WITH_TESTS) \ -DWITH_DOCS=ON \ -DCMAKE_INSTALL_LIBDIR=lib/$(DEB_HOST_MULTIARCH)/ \ -DHalide_INSTALL_PLUGINDIR=lib/$(DEB_HOST_MULTIARCH)/halide$(HALIDE_VERSION)/ \ -DCMAKE_INSTALL_INCLUDEDIR=include/halide$(HALIDE_VERSION)/ \ -DHalide_INSTALL_CMAKEDIR=lib/$(DEB_HOST_MULTIARCH)/cmake/Halide$(HALIDE_VERSION)/ \ -DHalide_INSTALL_HELPERSDIR=lib/$(DEB_HOST_MULTIARCH)/cmake/HalideHelpers$(HALIDE_VERSION)/ \ -DCMAKE_INSTALL_BINDIR=lib/$(DEB_HOST_MULTIARCH)/halide$(HALIDE_VERSION)/ \ -DHalide_INSTALL_TOOLSDIR=src/halide$(HALIDE_VERSION)/ \ -DHalide_INSTALL_PYTHONDIR=lib/python3/dist-packages/ \ -DCMAKE_INSTALL_DOCDIR=share/doc/halide$(HALIDE_VERSION)/ LLVM_PROFILE_FILE=$(LLVM_PROFILE_FILE) dh_auto_build --builddir=$(BUILD_DIR) # Remove files that won't be needed anymore. # This reduces the total amount of disk space used during build. find $(BUILD_DIR) \( -name '*.o' -or -name '*.a' \) -delete ifneq ($(WITH_TESTS),OFF) # WARNING: running multiple halide tests in parallel is unsupported! LLVM_PROFILE_FILE=$(LLVM_PROFILE_FILE) ctest -j1 --exclude-regex "$(TEST_GROUPS_FLAKY)" --output-on-failure --test-dir $(BUILD_DIR) LLVM_PROFILE_FILE=$(LLVM_PROFILE_FILE) ctest -j1 --label-regex "$(TEST_GROUPS_FLAKY)" --repeat until-pass:5 --output-on-failure --test-dir $(BUILD_DIR) endif dh_auto_install --builddir=$(BUILD_DIR) --destdir=$(INSTALL_DIR) # Remove the whole build directory. We no longer need it. rm -rf $(BUILD_DIR) ifneq ($(WITH_TESTS),OFF) LLVM_PROFILE_FILE=$(LLVM_PROFILE_FILE) dh_auto_configure --sourcedir=$(SOURCE_DIR)/apps/ --builddir=$(APPS_BUILD_DIR) -- \ -DCMAKE_C_COMPILER=$(CC) -DCMAKE_CXX_COMPILER=$(CXX) \ -DCMAKE_C_FLAGS="$(CFLAGS)" -DCMAKE_CXX_FLAGS="$(CXXFLAGS)" \ -DCMAKE_BUILD_TYPE=Release -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=$(WITH_LTO) \ -DENABLE_APPS_HANNK=OFF \ -DHalide_DIR=$(INSTALL_DIR)/usr/lib/$(DEB_HOST_MULTIARCH)/cmake/Halide$(HALIDE_VERSION)/ \ -DHalideHelpers_DIR=$(INSTALL_DIR)/usr/lib/$(DEB_HOST_MULTIARCH)/cmake/HalideHelpers$(HALIDE_VERSION)/ LLVM_PROFILE_FILE=$(LLVM_PROFILE_FILE) dh_auto_build --builddir=$(APPS_BUILD_DIR) # Remove files that won't be needed anymore. # This reduces the total amount of disk space used during build. find $(APPS_BUILD_DIR) \( -name '*.o' -or -name '*.a' \) -delete # WARNING: running multiple halide tests in parallel is unsupported! LLVM_PROFILE_FILE=$(LLVM_PROFILE_FILE) ctest -j1 --output-on-failure --test-dir $(APPS_BUILD_DIR) # Remove the whole build directory. We no longer need it. rm -rf $(APPS_BUILD_DIR) endif override_dh_auto_configure: # Nothing to do. Because of multi-stage build, everything happens in override_dh_auto_build. override_dh_auto_build: ifneq ($(WITH_PGO),OFF) BUILD_STAGE=0 STAGE_COMPILE_FLAGS="-fprofile-generate -Xclang -mllvm -Xclang -vp-counters-per-site=10.0" $(MAKE) -f debian/rules perform_stage_build rm -rf $(BUILD_DIR_PREFIX) llvm-profdata-$(LLVM_VERSION) merge -output=$(PROFILE) $(PROFILE_TMP_DIR) rm -rf $(PROFILE_TMP_DIR) BUILD_STAGE=1 STAGE_COMPILE_FLAGS="-fprofile-use=$(PROFILE) -fcs-profile-generate -Xclang -mllvm -Xclang -vp-counters-per-site=100.0" $(MAKE) -f debian/rules perform_stage_build rm -rf $(BUILD_DIR_PREFIX) mv $(PROFILE) $(PROFILE).old llvm-profdata-$(LLVM_VERSION) merge -output=$(PROFILE) $(PROFILE_TMP_DIR) $(PROFILE).old rm -rf $(PROFILE_TMP_DIR) rm -rf $(PROFILE).old STAGE_COMPILE_FLAGS="-fprofile-use=$(PROFILE)" $(MAKE) -f debian/rules perform_stage_build else $(MAKE) -f debian/rules perform_stage_build endif override_dh_auto_test: # Nothing to do. Because of multi-stage build, everything happens in override_dh_auto_build. override_dh_auto_install: # Nothing to do. Because of multi-stage build, everything happens in override_dh_auto_build. override_dh_install: dh_install --sourcedir=$(INSTALL_DIR)