#!/usr/bin/make -f export DH_VERBOSE = 1 export DEB_BUILD_MAINT_OPTIONS = hardening=+all DPKG_EXPORT_BUILDFLAGS = 1 include /usr/share/dpkg/buildflags.mk export VERBOSE = yes # Bypass ccache export CCACHE_DISABLE = 1 export CCACHE_TEMPDIR = ${CURDIR}/debian/ccachetmp # Set locale for reproducible builds export LC_ALL = C # Ensure packages build with no Internet access export http_proxy=127.0.0.1:9 export https_proxy=127.0.0.1:9 # BAZEL_CXXOPTS and BAZEL_LINKOPTS take a list of flags seperated by colon export space = $() $() export BAZEL_CXXOPTS = $(subst $(space),:,-std=c++0x ${CPPFLAGS} ${CXXFLAGS}) export BAZEL_LINKOPTS = $(subst $(space),:,-lstdc++ -lm ${LDFLAGS}) %: dh $@ override_dh_auto_build: # Copy bazel source tree to a writable location mkdir -p build-tree cp -r /usr/src/bazel-bootstrap/* build-tree/ # Copy mock generator and templates from our debian/ to build-tree/debian/ mkdir -p build-tree/debian cp debian/generate_mock_repos.py build-tree/debian/ cp -r debian/mock_repos build-tree/debian/ # Delete lockfile to avoid GSON crash rm -f build-tree/MODULE.bazel.lock # Apply patches to build-tree patch -p1 -d build-tree < debian/patches-bazel/remove_graalvm.patch patch -p1 -d build-tree < debian/patches-bazel/jacoco_0.8.14_compat.patch patch -p1 -d build-tree < debian/patches-bazel/disable_errorprone.patch patch -p1 -d build-tree < debian/patches-bazel/jacoco_agent_rt.patch # Overwrite jarjar BUILD to use system jarjar cp debian/bootstrap-resources/BUILD.jarjar build-tree/third_party/jarjar/BUILD # Symlink system jarjar ln -s /usr/share/java/jarjar.jar build-tree/third_party/jarjar/jarjar.jar # Run mock generator to create the directory structure and other mocks cd build-tree && python3 debian/generate_mock_repos.py # Compile bootstrap tools from source ./debian/compile_ijar.sh build-tree build-tree/mock_repos/remote_java_tools_linux/ijar_bin ./debian/compile_singlejar.sh build-tree build-tree/mock_repos/remote_java_tools_linux/singlejar_bin ./debian/compile_javabuilder.sh build-tree build-tree/mock_repos/remote_java_tools/JavaBuilder_deploy.jar # Copy/symlink compiled tools to other mock locations cp build-tree/mock_repos/remote_java_tools_linux/ijar_bin build-tree/mock_repos/remote_java_tools/ijar_bin cp build-tree/mock_repos/remote_java_tools_linux/singlejar_bin build-tree/mock_repos/remote_java_tools/singlejar_bin cp build-tree/mock_repos/remote_java_tools/JavaBuilder_deploy.jar build-tree/mock_repos/remote_java_tools_linux/JavaBuilder_deploy.jar # Use JavaBuilder as VanillaJavaBuilder for bootstrap cp build-tree/mock_repos/remote_java_tools/JavaBuilder_deploy.jar build-tree/mock_repos/remote_java_tools/VanillaJavaBuilder_deploy.jar cp build-tree/mock_repos/remote_java_tools/JavaBuilder_deploy.jar build-tree/mock_repos/remote_java_tools_linux/VanillaJavaBuilder_deploy.jar # Use system turbine for bootstrap ln -sf /usr/share/java/turbine.jar build-tree/mock_repos/remote_java_tools/TurbineDirect_deploy.jar ln -sf /usr/share/java/turbine.jar build-tree/mock_repos/remote_java_tools_linux/TurbineDirect_deploy.jar # Dummy files for targets that are not used but must exist cp build-tree/mock_repos/remote_java_tools_linux/ijar_bin build-tree/mock_repos/remote_java_tools/turbine_direct_graal_bin cp build-tree/mock_repos/remote_java_tools_linux/ijar_bin build-tree/mock_repos/remote_java_tools_linux/turbine_direct_graal_bin cp build-tree/mock_repos/remote_java_tools_linux/ijar_bin build-tree/mock_repos/remote_java_tools/one_version_tool_bin cp build-tree/mock_repos/remote_java_tools_linux/ijar_bin build-tree/mock_repos/remote_java_tools_linux/one_version_tool_bin # Dummy jars for other targets touch build-tree/mock_repos/remote_java_tools/jacoco_coverage_runner_deploy.jar touch build-tree/mock_repos/remote_java_tools_linux/jacoco_coverage_runner_deploy.jar touch build-tree/mock_repos/remote_java_tools/Runner_deploy.jar touch build-tree/mock_repos/remote_java_tools_linux/Runner_deploy.jar touch build-tree/mock_repos/remote_java_tools/GenClass_deploy.jar touch build-tree/mock_repos/remote_java_tools_linux/GenClass_deploy.jar touch build-tree/mock_repos/remote_java_tools/xmldoclet_deploy.jar touch build-tree/mock_repos/remote_java_tools_linux/xmldoclet_deploy.jar touch build-tree/mock_repos/remote_java_tools/javac-9+181-rxtx.jar touch build-tree/mock_repos/remote_java_tools_linux/javac-9+181-rxtx.jar # Dynamically add overrides to .bazelrc for mod in $$(ls build-tree/mock_repos); do \ if [ -f build-tree/mock_repos/$${mod}/MODULE.bazel ]; then \ echo "build --override_module=$${mod}=%workspace%/mock_repos/$${mod}" >> build-tree/.bazelrc; \ fi; \ done echo "build --override_repository=rules_java~~toolchains~remote_java_tools=%workspace%/mock_repos/remote_java_tools" >> build-tree/.bazelrc echo "build --override_repository=rules_java~~toolchains~remote_java_tools_linux=%workspace%/mock_repos/remote_java_tools_linux" >> build-tree/.bazelrc for jdk in $$(ls build-tree/mock_repos | grep -E '^remote_?jdk'); do \ echo "build --override_repository=rules_java~~toolchains~$$jdk=%workspace%/mock_repos/$$jdk" >> build-tree/.bazelrc; \ echo "build --override_repository=$$jdk=%workspace%/mock_repos/$$jdk" >> build-tree/.bazelrc; \ done # Setup symlinks for missing third-party jars mkdir -p build-tree/third_party/asm ln -s /usr/share/java/asm.jar build-tree/third_party/asm/asm-9.6.jar ln -s /usr/share/java/asm-tree.jar build-tree/third_party/asm/asm-tree-9.6.jar ln -s /usr/share/java/asm-commons.jar build-tree/third_party/asm/asm-commons-9.6.jar # Setup symlinks and dummy files for Jacoco mkdir -p build-tree/third_party/java/jacoco ln -s /usr/share/java/org.jacoco.agent.jar build-tree/third_party/java/jacoco/jacocoagent-0.8.11.jar ln -s /usr/share/java/org.jacoco.core.jar build-tree/third_party/java/jacoco/org.jacoco.core-0.8.11.jar ln -s /usr/share/java/org.jacoco.report.jar build-tree/third_party/java/jacoco/org.jacoco.report-0.8.11.jar touch build-tree/third_party/java/jacoco/LICENSE # Setup symlinks and dummy files for Proguard mkdir -p build-tree/third_party/java/proguard/proguard6.2.2/docs mkdir -p build-tree/third_party/java/proguard/proguard6.2.2/lib ln -s /usr/share/java/proguard.jar build-tree/third_party/java/proguard/proguard6.2.2/lib/proguard.jar touch build-tree/third_party/java/proguard/proguard6.2.2/docs/GPL.md # Build the targets inside the copy cd build-tree && bazel \ --output_user_root=/tmp/bazel-debian-build \ build \ --lockfile_mode=off \ --spawn_strategy=local \ --java_header_compilation=false \ --java_runtime_version=local_jdk \ --tool_java_runtime_version=local_jdk \ --javabase=@bazel_tools//tools/jdk:local_jdk \ --host_javabase=@bazel_tools//tools/jdk:local_jdk \ --verbose_failures \ --subcommands \ --compilation_mode=dbg \ --define=distribution=debian \ //src:java_tools_zip \ //src:java_tools_prebuilt_zip || ( \ echo "=== BUILD FAILED, printing params files ==="; \ find bazel-out/ -name "*JarOwner*.params" -o -name "*statistics*.params" -o -name "*JacocoCoverageLib*.params" | while read f; do \ echo "=== $$f ==="; \ cat "$$f"; \ done; \ exit 1 \ ) # Copy the outputs back cp build-tree/bazel-bin/src/java_tools.zip debian/ cp build-tree/bazel-bin/src/java_tools_prebuilt.zip debian/ override_dh_auto_test: dh_auto_test # Test the compiled JavaBuilder echo "DEBUG: Running manual test of JavaBuilder..." echo "public class Test {}" > build-tree/Test.java java -jar build-tree/mock_repos/remote_java_tools/JavaBuilder_deploy.jar \ --output build-tree/Test.jar \ --sources build-tree/Test.java echo "DEBUG: Manual test of JavaBuilder successful!" # Debug: check if JacocoCoverageRunner.java exists ls -l build-tree/src/java_tools/junitrunner/java/com/google/testing/coverage/JacocoCoverageRunner.java || true echo "DEBUG: Listing system ASM jars:" ls -l /usr/share/java/asm* || true echo "DEBUG: Listing system Jacoco jars:" ls -l /usr/share/java/*jacoco* || true # Debug: list contents of the zip files echo "=== java_tools.zip ===" python3 -m zipfile -l debian/java_tools.zip echo "=== java_tools_prebuilt.zip ===" python3 -m zipfile -l debian/java_tools_prebuilt.zip override_dh_auto_install: # Extract prebuilt tools for dh_install mkdir -p debian/tmp/usr/share/bazel/tools/java_tools mkdir -p debian/tmp_prebuilt unzip -q debian/java_tools_prebuilt.zip -d debian/tmp_prebuilt cp debian/tmp_prebuilt/java_tools/ijar/ijar debian/tmp/usr/share/bazel/tools/java_tools/ cp debian/tmp_prebuilt/java_tools/src/tools/singlejar/singlejar_local debian/tmp/usr/share/bazel/tools/java_tools/singlejar chmod 755 debian/tmp/usr/share/bazel/tools/java_tools/ijar debian/tmp/usr/share/bazel/tools/java_tools/singlejar rm -rf debian/tmp_prebuilt # Extract jars for dh_install mkdir -p debian/tmp_jars unzip -q debian/java_tools.zip -d debian/tmp_jars cp debian/tmp_jars/java_tools/*.jar debian/tmp/usr/share/bazel/tools/java_tools/ # Remove the packaged turbine jar and replace with symlink to system one rm -f debian/tmp/usr/share/bazel/tools/java_tools/turbine_direct_binary_deploy.jar ln -sf /usr/share/java/turbine.jar debian/tmp/usr/share/bazel/tools/java_tools/turbine_direct_binary_deploy.jar # Fix permissions, excluding the symlink find debian/tmp/usr/share/bazel/tools/java_tools/ -type f -name "*.jar" -exec chmod 644 {} + rm -rf debian/tmp_jars execute_before_dh_auto_clean: rm -rf build-tree rm -f debian/java_tools.zip rm -f debian/java_tools_prebuilt.zip