#!/usr/bin/make -f include /usr/share/dpkg/pkg-info.mk include /usr/share/dpkg/buildflags.mk PACKAGE := ocaml ALL_PACKAGES := $(shell dh_listpackages) # Can't use /usr/share/ocaml/ocamlvars.mk because it tries to run ocamlc include $(CURDIR)/debian/ocamlvars.mk # Use ccache if pkg.ocaml.ccache build-profile is active. ifneq (,$(filter pkg.ocaml.ccache,$(DEB_BUILD_PROFILES))) export PATH := /usr/lib/ccache:$(PATH) export CCACHE_DIR := $(CURDIR)/debian/ccache #export CCACHE_BASEDIR := $(CURDIR)/debian/build $(shell mkdir -p "$(CCACHE_DIR)") endif # Build cache (for Debian debugging) BUILDCACHE := $(wildcard ../ocaml.cache) MD5SUMSDIR = /var/lib/ocaml/md5sums INSTDIR = $(CURDIR)/debian/tmp/usr DISTDIR = $(PACKAGE)-$(OCAML_ABI) UPSTREAM_VERSION = $(shell dpkg-parsechangelog | awk '/^Version:/{print $$2}' | { read u; echo $${u%-*}; }) UPSTREAM_TARBALL = $(wildcard ../$(PACKAGE)_$(UPSTREAM_VERSION).orig.tar.*) SRCTARBALL = $(PACKAGE)-source-$(OCAML_ABI).tar TESTDIR := debian/test-build TESTRULES := debian/rules DEB_TEST_BUILD_PREFIX=$(CURDIR)/$(TESTDIR) BUILD_DATE := $(shell dpkg-parsechangelog --show-field=Date) ifeq (,$(DEB_TEST_BUILD_PREFIX)) ifneq (,$(findstring ocaml-source,$(ALL_PACKAGES))) TARBALL_TARGET = debian/$(SRCTARBALL) endif endif # Environment variable for dh_ocaml export OCAMLOBJINFO = OCAMLLIB=tools boot/ocamlrun tools/ocamlobjinfo # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 export DH_OPTIONS # This has to be exported to make gen_modules work export OCAML_OPT_ARCH export OCAML_STDLIB_DIR export DEB_BUILD_MAINT_OPTIONS=hardening=+bindnow export CCLINKFLAGS=$(shell dpkg-buildflags --get LDFLAGS) CONFIGURE_OPTS := \ --host $(DEB_BUILD_GNU_TYPE)\ --with-pthread -prefix $(DEB_TEST_BUILD_PREFIX)/usr \ -libdir $(DEB_TEST_BUILD_PREFIX)$(OCAML_STDLIB_DIR) \ -x11lib "$(shell pkg-config --variable=libdir x11)" \ -mandir $(DEB_TEST_BUILD_PREFIX)/usr/share/man \ CONFIGURE_SED := \ -e "/LIBBFD_LINK/s%-lbfd%-Wl,-Bstatic -lbfd -Wl,-Bdynamic%" \ -e "s%MANDIR=.*$$%MANDIR=\$$(PREFIX)/share/man%g" \ -e "s%LIBDIR=.*$$%LIBDIR=\$$(PREFIX)/lib/ocaml%g" \ -e "s%STUBLIBDIR=.*$$%STUBLIBDIR=\$$(PREFIX)/lib/ocaml/stublibs%g" # Upstream recommends dropping support, see https://caml.inria.fr/mantis/view.php?id=7642 ifneq (,$(filter $(DEB_HOST_ARCH),armel)) CONFIGURE_OPTS += --no-native-compiler endif %: dh $@ # Needed because there is a "build" in the upstream tarball .PHONY: build build: dh $@ # Generate ocaml-native-compilers' Architecture field. # Should never be called automatically. .PHONY: debian/control debian/control: sed -e 's/@OCamlNativeArchs@/$(OCAML_NATIVE_ARCHS)/g' debian/control.in > $@ pre-config-stamp: $(TARBALL_TARGET) chmod +x debian/gen_modules.pl # Backup upstream config.{sub,guess}, and use most up-to-date ones set -e; for ext in sub guess; do \ if [ -f /usr/share/misc/config.$$ext ] && \ ! [ -f debian/config.orig.$$ext ]; then \ mv config/gnu/config.$$ext debian/config.orig.$$ext; \ cp -f /usr/share/misc/config.$$ext config/gnu/config.$$ext; \ fi; \ done # Debian kfreebsd has non-working shims for dup3/pipe2, see #827935. Upstream # ./configure isn't sophisticated enough to detect this so patch it out here. ifeq (kfreebsd,$(DEB_HOST_ARCH_OS)) sed -i -e '/HAS_DUP3/d' -e '/HAS_PIPE2/d' ./configure endif # Create empty directory present in upstream tarball mkdir -p compilerlibs touch $@ ifneq (,$(TARBALL_TARGET)) $(TARBALL_TARGET): $(UPSTREAM_TARBALL) mkdir -p debian/$(DISTDIR) # Copy upstream tarball cp $< debian/$(DISTDIR) # Copy debian/patches cp -a debian/patches debian/$(DISTDIR)/debian-patches # Set permissions (workaround for #796257) chmod 755 debian/$(DISTDIR)/debian-patches chmod 644 debian/$(DISTDIR)/debian-patches/* # Create the tarball and cleanup cd debian && find $(DISTDIR) -not -type d -print0 | \ LC_ALL=C sort --zero-terminated | \ tar --create --null --files-from=- \ --file=$(abspath $@) --mtime="$(BUILD_DATE)" \ --owner=root --group=root --numeric-owner rm -Rf debian/$(DISTDIR) endif .PHONY: override_dh_auto_configure override_dh_auto_configure: config-stamp ocamlinit-stamp config-stamp: pre-config-stamp ./configure $(CONFIGURE_OPTS) sed -i $(CONFIGURE_SED) config/Makefile touch $@ ocamlinit-stamp: $(TARBALL_TARGET) config-stamp $(MAKE) -f $(CURDIR)/debian/ocamlinit.mk ocamlinit-stamp .PHONY: override_dh_auto_build override_dh_auto_build: build-stamp build-stamp: config-stamp if test ! -d boot.debian; then \ cp -xa boot boot.debian; \ fi rm -Rf debian/examples && mkdir debian/examples ifeq ($(BUILDCACHE),) $(MAKE) world $(MAKE) bootstrap $(MAKE) -C tools dumpobj ifeq (,$(OCAML_OPT_ARCH)) # As of 3.11.0, manpages are made only in `make opt.opt' make -C ocamldoc manpages \ OCAMLDOC_RUN="../boot/ocamlrun -I ../otherlibs/unix -I ../otherlibs/str ./ocamldoc" else @echo "Building native compilers" $(MAKE) opt opt.opt touch opt-built-stamp endif else @echo "===> WARNING: $(BUILDCACHE) detected, compilation skipped! <===" rsync -a --exclude=debian --exclude=.git $(BUILDCACHE)/ . rm -f build-stamp install-stamp-arch install-stamp-indep endif touch $@ .PHONY: override_dh_auto_clean override_dh_auto_clean: ifneq ($(wildcard $(CURDIR)/config/Makefile),) $(MAKE) clean $(MAKE) -C emacs clean endif $(MAKE) -f $(CURDIR)/debian/ocamlinit.mk ocamlinit-clean # Restore files altered by the build process if test -d boot.debian; then \ rm -Rf boot; \ mv boot.debian boot; \ fi set -e; for ext in sub guess; do \ if [ -f debian/config.orig.$$ext ] ; then \ mv -f debian/config.orig.$$ext config/gnu/config.$$ext; \ fi; \ done if head -n 1 emacs/ocamltags.in | grep -q '^#!/bin/sh'; then \ sed -i 1d emacs/ocamltags.in; \ fi # Remaining stuff -rm -Rf debian/$(SRCTARBALL) debian/examples $(TESTDIR) .PHONY: override_dh_auto_install-arch override_dh_auto_install-indep override_dh_auto_install-arch: install-stamp-arch override_dh_auto_install-indep: install-stamp-indep install-stamp-indep: ifneq (,$(findstring ocaml-mode,$(ALL_PACKAGES))) # Install Emacs files $(MAKE) -C emacs \ EMACSDIR=$(CURDIR)/debian/ocaml-mode/usr/share/emacs/site-lisp/ocaml-mode \ NOCOMPILE=true simple-install if ! head -n 1 emacs/ocamltags.in | grep -q '^#!/bin/sh'; then \ sed -i -e '1 i #!/bin/sh' emacs/ocamltags.in; \ fi $(MAKE) -C emacs SCRIPTDIR=$(CURDIR)/debian/ocaml-mode/usr/bin install-ocamltags endif touch $@ install-stamp-arch: # Install OCaml $(MAKE) install PREFIX=$(INSTDIR) ifeq (,$(DEB_TEST_BUILD_PREFIX)) # Remove uninstalled files rm -f \ $(INSTDIR)/share/man/man1/ocamlopt.opt.1 \ $(INSTDIR)/share/man/man1/ocamlc.opt.1 ifeq ($(OCAML_HAVE_OCAMLOPT),no) # Remove files that make no sense without ocamlopt rm -f \ $(INSTDIR)/share/man/man1/ocamloptp.1 \ $(INSTDIR)/share/man/man1/ocamlopt.1 \ $(INSTDIR)/bin/ocamloptp.* \ $(INSTDIR)/bin/ocamloptp endif # Dispatch files with dh_install cd debian && \ set -e; for u in ocaml ocaml-nox; do \ DESTDIR=tmp ./gen_modules.pl $$u.install > $$u.install.new; \ mv $$u.install.new $$u.install; \ done if ! dh_install --fail-missing; then \ echo "===> dh_install has failed <==="; \ find debian/tmp; \ exit 1; \ fi # Install additional files not handled by dh_install # Beware: dh_install does not handle renamings, please pay attention set -e; for u in dumpobj; do \ if [ -f tools/$$u ]; then \ cp tools/$$u debian/ocaml-nox/usr/bin/ocaml$$u; \ fi \ done set -e; for pkg in ocaml ocaml-nox ocaml-base; do ( \ mkdir -p debian/$$pkg/usr/share/doc/$$pkg && \ cd debian/$$pkg/usr/share/doc/$$pkg && \ ln -sf ../ocaml-base-nox/README.gz . && \ ln -sf ../ocaml-base-nox/README.Debian .; \ ); done endif # Remaining stuff touch $@ .PHONY: override_dh_gencontrol override_dh_gencontrol: set -e; for u in ocaml-source ocaml-interp ocaml-compiler-libs; do \ echo 'F:OCamlABI=$(OCAML_ABI)' >> debian/$$u.substvars; \ done ifeq (,$(OCAML_OPT_ARCH)) echo 'F:NativeProvides=' >> debian/ocaml-nox.substvars else echo 'F:NativeProvides=ocaml-native-compilers (= $${binary:Version})' >> debian/ocaml-nox.substvars endif # Create .md5sums files and compute dependencies. Use $(OCAML_ABI) # because we know that OCaml ABI represents best dependencies for # OCaml package. dh_ocaml -Xcompiler-libs \ --runtime-map ocaml-nox:ocaml-base-nox,ocaml:ocaml-base \ --checksum $(OCAML_ABI) dh_gencontrol # Check that OCAML_ABI is correct if [ "$(OCAML_ABI)" != "$(shell boot/ocamlrun ./ocamlc -version | { read a && echo $${a%%_*}; })" ]; then \ echo "Please adjust OCAML_ABI in debian/rules"; \ exit 2; \ fi .PHONY: regenerate regenerate: debian/control git ls-tree --name-only -r HEAD debian \ | grep -v '^debian/\(patches/\|source/local-\)' \ > debian/MANIFEST # Architectures where running the test suite completely makes the # whole build last more than 30 minutes on buildds. Originally, # because some tests do not even finish on mips. SLOW_ARCHITECTURES := armel armhf ia64 mips mipsel powerpc powerpcspe sparc .PHONY: override_dh_auto_test override_dh_auto_test: ifeq (,$(findstring nocheck,$(DEB_BUILD_OPTIONS))) : # tries to connect the net rm -f testsuite/tests/lib-threads/testsocket.* : # FIXME: the following tests fail, we temporarily disable them rm -rf testsuite/tests/tool-debugger/basic/ rm -rf testsuite/tests/tool-debugger/find-artifacts/ rm -rf testsuite/tests/tool-debugger/no_debug_event/ ifneq (,$(filter $(DEB_BUILD_ARCH),$(SLOW_ARCHITECTURES))) rm -f testsuite/tests/misc-unsafe/almabench.ml endif ifeq (,$(DEB_TEST_BUILD_PREFIX)) cd testsuite && make all endif endif .PHONY: override_dh_installdocs override_dh_installdocs: dh_installdocs --ignore debian/README.Debian