#!/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
export BAZDIR = ${CURDIR}/debian/bazel-bootstrap
export BAZDATADIR = ${CURDIR}/debian/bazel-bootstrap-data
export BAZSRCDIR = ${CURDIR}/debian/bazel-bootstrap-source

# 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

# Force Bazel to write its output base inside the workspace so it is preserved across sbuild namespaces
export BAZEL_DIR_STARTUP_OPTIONS = --output_base=$(CURDIR)/output/out

# Detect the Bazel output directory dynamically (varies by architecture, e.g., k8-dbg, aarch64-dbg)
BAZEL_OUT_DIR = $(firstword $(wildcard output/out/execroot/_main/bazel-out/*-dbg))

# BAZEL_CXXOPTS and BAZEL_LINKOPTS take a list of flags seperated by colon
export space = $() $()
export BAZEL_CXXOPTS = $(subst $(space),:,-std=c++17 ${CPPFLAGS} ${CXXFLAGS})
export BAZEL_LINKOPTS = $(subst $(space),:,-lstdc++ -lm ${LDFLAGS})

# Use the local JDK
export EXTRA_BAZEL_ARGS = \
	--host_javabase=@local_jdk//:jdk \
	--java_runtime_version=local_jdk \
	--tool_java_runtime_version=local_jdk \
	--host_javacopt=-proc:full \
	--host_javacopt=-Acom.google.auto.value.AutoBuilderIsUnstable \
	--javacopt=-proc:full \
	--javacopt=-Acom.google.auto.value.AutoBuilderIsUnstable \
	--strategy=Javac=local \
	--worker_max_instances=0 \
	--curses=no \
	--color=no \
	--define=distribution=debian \
	--noremote_accept_cached \
	--verbose_failures \
	--subcommands \
	--compilation_mode dbg \
	--action_env=CCACHE_DISABLE \
	--action_env=CCACHE_TEMPDIR \
	--action_env=LC_ALL \
	--host_action_env=CCACHE_DISABLE \
	--host_action_env=CCACHE_TEMPDIR \
	--host_action_env=LC_ALL \
	--sandbox_debug \
	--sandbox_writable_path=${CCACHE_TEMPDIR} \
	--override_module=rules_license=$(CURDIR)/mock_repos/rules_license \
	--override_module=bazel_skylib=$(CURDIR)/mock_repos/bazel_skylib \
	--override_module=bazel_features=$(CURDIR)/mock_repos/bazel_features \
	--override_module=platforms=$(CURDIR)/mock_repos/platforms \
	--override_module=protobuf=$(CURDIR)/mock_repos/protobuf \
	--override_module=grpc=$(CURDIR)/mock_repos/grpc \
	--override_module=rules_pkg=$(CURDIR)/mock_repos/rules_pkg \
	--override_module=stardoc=$(CURDIR)/mock_repos/stardoc \
	--override_module=zstd-jni=$(CURDIR)/mock_repos/zstd-jni \
	--override_module=blake3=$(CURDIR)/mock_repos/blake3 \
	--override_module=zlib=$(CURDIR)/mock_repos/zlib \
	--override_module=rules_cc=$(CURDIR)/mock_repos/rules_cc \
	--override_module=rules_java=$(CURDIR)/mock_repos/rules_java \
	--override_module=rules_graalvm=$(CURDIR)/mock_repos/rules_graalvm \
	--override_module=rules_proto=$(CURDIR)/mock_repos/rules_proto \
	--override_module=rules_jvm_external=$(CURDIR)/mock_repos/rules_jvm_external \
	--override_module=rules_python=$(CURDIR)/mock_repos/rules_python \
	--override_module=rules_testing=$(CURDIR)/mock_repos/rules_testing \
	--override_module=googletest=$(CURDIR)/mock_repos/googletest \
	--override_module=with_cfg.bzl=$(CURDIR)/mock_repos/with_cfg.bzl \
	--override_module=apple_support=$(CURDIR)/mock_repos/apple_support \
	--override_module=abseil-cpp=$(CURDIR)/mock_repos/abseil-cpp \
	--override_module=c-ares=$(CURDIR)/mock_repos/c-ares \
	--override_module=rules_go=$(CURDIR)/mock_repos/rules_go \
	--override_module=rules_kotlin=$(CURDIR)/mock_repos/rules_kotlin \
	--override_module=upb=$(CURDIR)/mock_repos/upb \
	--override_module=buildozer=$(CURDIR)/mock_repos/buildozer

export PROTOC = /usr/bin/protoc
export GRPC_JAVA_PLUGIN = /usr/bin/grpc_java_plugin
export JAVA_VERSION = 21

# Prevent Out-of-Memory failures on some architectures, enable annotation processing
export BAZEL_JAVAC_OPTS = -J-Xmx4096m --add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED -proc:full -Acom.google.auto.value.AutoBuilderIsUnstable
# Strip Ubuntu-specific metadata, bazel tries to parse it as json and fails.
LDFLAGS:=$(shell echo $(LDFLAGS) | sed 's/-Wl,--package-metadata=[^ ]*//g')

%:
	dh $@ --with python3

override_dh_auto_build:
	mkdir -p ${CCACHE_TEMPDIR}
	# Copy missing WORKSPACE resource files for bootstrap
	cp debian/bootstrap-resources/coverage.WORKSPACE src/main/java/com/google/devtools/build/lib/bazel/rules/
	# Setup android_databinding system library redirection
	mkdir -p third_party/java/android_databinding
	ln -sf /usr/share/java/com.android.databinding.compilerCommon.jar third_party/java/android_databinding/
	ln -sf /usr/share/java/com.android.databinding.baseLibrary.jar third_party/java/android_databinding/
	cp debian/bootstrap-resources/android_databinding.BUILD third_party/java/android_databinding/BUILD
	cp debian/bootstrap-resources/rules_license.WORKSPACE src/main/java/com/google/devtools/build/lib/bazel/rules/
	cp debian/bootstrap-resources/jdk.WORKSPACE src/main/java/com/google/devtools/build/lib/bazel/rules/java/
	cp debian/bootstrap-resources/cc_configure.WORKSPACE src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/
	# Compile builtins_bzl.zip using upstream script
	./src/zip_builtins.sh "" src/main/java/com/google/devtools/build/lib/bazel/rules/builtins_bzl.zip src/main/starlark/builtins_bzl $$(find src/main/starlark/builtins_bzl -name '*.bzl')

	# Generate Bzlmod mock stubs
	python3 debian/generate_mock_repos.py

	./compile.sh
	# Copy the generated classpath file to debian/ for the client launcher to find during the build
	cp $$(find output/out/ -name "bazel_classpath_debian_depends.txt" | head -n 1) debian/

override_dh_auto_clean:
	dh_auto_clean
	rm -rf derived
	rm -rf output
	rm -rf bazel-*
	rm -rf mock_repos

override_dh_install:
	@if [ -z "$(BAZEL_OUT_DIR)" ]; then echo "Error: BAZEL_OUT_DIR is empty"; exit 1; fi
	# Create target directories for the installation layout
	mkdir -p output/etc/bazel
	mkdir -p output/etc/bash_completion.d
	mkdir -p output/usr/bin
	mkdir -p output/usr/share/bazel/embedded_tools
	mkdir -p output/usr/share/zsh/vendor-completions

	# Copy the main Bazel binary
	cp output/bazel output/usr/bin/bazel

	# Generate bash completion dynamically using the compiled binary
	mkdir -p output/tmp
	env HOME=$(CURDIR)/output/tmp output/bazel --batch help completion > output/etc/bash_completion.d/bazel

	# Copy zsh completion static template
	cp scripts/zsh_completion/_bazel output/usr/share/zsh/vendor-completions/_bazel

	# Copy default bazelrc
	cp debian/bazelrc output/etc/bazel/bazelrc

	# Harvest helper binaries and libraries from persistent output base
	cp $(BAZEL_OUT_DIR)/bin/src/main/tools/build-runfiles output/usr/share/bazel/build-runfiles
	cp $(BAZEL_OUT_DIR)/bin/src/main/tools/process-wrapper output/usr/share/bazel/process-wrapper
	cp $(BAZEL_OUT_DIR)/bin/src/main/tools/linux-sandbox output/usr/share/bazel/linux-sandbox
	cp $(BAZEL_OUT_DIR)/bin/src/main/tools/daemonize output/usr/share/bazel/daemonize
	cp $(BAZEL_OUT_DIR)/bin/src/main/java/net/starlark/java/eval/libcpu_profiler.so output/usr/share/bazel/libcpu_profiler.so
	cp $(BAZEL_OUT_DIR)/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar output/usr/share/bazel/A-server.jar
	cp $(BAZEL_OUT_DIR)/bin/src/install_base_key_nojdk output/usr/share/bazel/install_base_key

	# Extract the embedded tools archive
	unzip -q $(BAZEL_OUT_DIR)/bin/src/embedded_tools_nojdk.zip -d output/usr/share/bazel/embedded_tools

	# Extract platforms tarball and copy builtins_bzl to satisfy install paths
	mkdir -p output/usr/share/bazel/platforms
	tar -xf $(BAZEL_OUT_DIR)/bin/platforms-srcs.tar -C output/usr/share/bazel/platforms/
	cp -r src/main/starlark/builtins_bzl output/usr/share/bazel/

	# Generate version label
	echo "7.7.1" > output/usr/share/bazel/build-label.txt

	# Clean up intermediate build caches so they do not end up in leftovers
	-chmod -R +w output/out 2>/dev/null || true
	-chmod -R +w output/tmp 2>/dev/null || true
	rm -rf output/out
	rm -rf output/tmp
	rm -f output/bazel

	# Original debian/rules install flow
	mkdir -p debian/tmp/usr/src/bazel-bootstrap
	ls | sed -r '/(debian|derived|examples|output|site|bazel-|mock_repos)/d' | \
		xargs cp -r -t debian/tmp/usr/src/bazel-bootstrap
	rm -f debian/tmp/usr/src/bazel-bootstrap/scripts/packages/chocolatey/.gitignore
	rm -rf mock_repos
	rm -f output/usr/share/bazel/xcode-locator
	rm -rf output/usr/share/bazel/embedded_tools/tools/jdk/nosystemjdk
	mv output/etc debian/tmp
	mv output/usr/bin debian/tmp/usr
	mv output/usr/share debian/tmp/usr
# Fail build (and show culprits) if Bazel components are not properly installed
	mv output debian/tmp/leftovers
	ls -laR debian/tmp/leftovers
	dh_install
	rm -rf ${BAZDATADIR}/usr/share/bazel/embedded_tools/tools/zip/zipper

override_dh_installdocs-arch:
	dh_installdocs --package=bazel-bootstrap -XREADME.Debian

override_dh_installdocs-indep:
	dh_installdocs --package=bazel-bootstrap-data \
		--doc-main-package=bazel-bootstrap
	dh_installdocs --package=bazel-bootstrap-source \
		--doc-main-package=bazel-bootstrap -XREADME.Debian

override_dh_link-indep:
	jdupes -rl ${BAZDATADIR}/usr
	find ${BAZDATADIR}/usr/share/bazel/embedded_tools -type f -name \
		'*.h' -printf '%h\n' | sort -u | sed 's@/build.*embedded_tools/@@' | \
		xargs -I% mkdir -p ${BAZDATADIR}/usr/include/bazel/%
	find ${BAZDATADIR}/usr/share/bazel/embedded_tools -name '*.h' | \
		sed 's@/build.*/embedded_tools/@@g' | xargs -I% ln -rs \
		${BAZDATADIR}/usr/share/bazel/embedded_tools/% \
		${BAZDATADIR}/usr/include/bazel/%
	dh_link

override_dh_fixperms-indep:
	find ${BAZDATADIR}/usr/share -type f -print0 2>/dev/null | xargs -0r chmod a-x
	find ${BAZSRCDIR}/usr/src -type f -not -name '*.sh' -print0 2>/dev/null | \
		xargs -0r chmod a-x
	find ${BAZDATADIR}/usr/share/doc/bazel/examples -type f \
		-not -name '*.sh' -print0 2>/dev/null | xargs -0r chmod a-x
	find ${BAZDATADIR}/usr/share/bazel/embedded_tools/tools \
		-type f -name '*.sh*' -print0 2>/dev/null | xargs -0r chmod a+x
	chmod a+x ${BAZDATADIR}/usr/share/bazel/embedded_tools/tools/buildstamp/get_workspace_status
	chmod a+x ${BAZDATADIR}/usr/share/bazel/embedded_tools/tools/cpp/build_interface_so
	chmod a+x ${BAZDATADIR}/usr/share/bazel/embedded_tools/tools/cpp/linux_cc_wrapper.sh.tpl
	chmod a+x ${BAZDATADIR}/usr/share/bazel/embedded_tools/tools/cpp/osx_cc_wrapper.sh.tpl
	chmod a+x ${BAZDATADIR}/usr/share/bazel/embedded_tools/tools/objc/gcov_stub
	chmod a+x ${BAZDATADIR}/usr/share/bazel/embedded_tools/tools/objc/mcov_stub
	chmod a+x ${BAZDATADIR}/usr/share/bazel/embedded_tools/tools/python/pywrapper_template.txt
	dh_fixperms
