#!/usr/bin/make -f # Build script for XML/Ada in Debian. # Copyright (c) 2003-2009 Ludovic Brenta # Copyright (c) 2013-2018 Nicolas Boulenguez # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # On Debian systems, the full text of the GPL is in the file # /usr/share/common-licenses/GPL-3. # NOTE: # In order to prevent a circular build-dependency, the Debian packages # for XML/Ada and GPRBuild bother to build without project support. # Please keep the two debian/rules files similar enough to ease # backport of good ideas. ###################################################################### # *_DEV_PKG, *_LIB_PKG and *_SONAME are read from the control file. # To debug, replace eval with error. $(foreach line,$(shell sed -n ' \ s/^Package:\s*\(libxmlada-\([a-z]\+\)\([0-9.]\+\)\)$$/ \ xmlada_\2_LIB_PKG:=\1 \ xmlada_\2_SONAME:=libxmlada_\2.so.\3 \ /p;\ s/^Package:\s*\(libxmlada-\([a-z]\+\)[0-9.]\+-dev\)$$/ \ xmlada_\2_DEV_PKG:=\1 \ /p;\ s/^ gnat, gnat-\([0-9.]\+\),\?$$/ \ GNAT_VERSION:=\1 \ /p;\ ' debian/control),$(eval $(line))) DEB_BUILD_MAINT_OPTIONS := hardening=+all DEB_ADAFLAGS_MAINT_APPEND := -gnatwa -Wall -gnatafno -gnatVa DEB_LDFLAGS_MAINT_APPEND := \ -Wl,--as-needed \ -Wl,--no-undefined \ -Wl,--no-copy-dt-needed-entries \ -Wl,--no-allow-shlib-undefined include /usr/share/dpkg/default.mk include /usr/share/ada/debian_packaging-$(GNAT_VERSION).mk # Ignore gnat.adc in top directory. BUILDER_OPTIONS += -gnatA ###################################################################### %: dh $@ # Rewrite upstream configure/make build system. .PHONY: $(addprefix override_dh_auto_, \ configure build-arch build-indep test install clean) # Rewrite upstream targets without gprbuild or gprclean. # gnatmake does not support projects anymore, we cannot use xmlada.gpr. ###################################################################### # Rewrite unicode/importer/Makefile without network and gprbuild. obj/shared/$(xmlada_unicode_SONAME) \ obj/static/libxmlada_unicode.a : unicode/unicode-names-basic_latin.ads obj/convert: $(wildcard unicode/importer/*.ad[bs]) | obj gnatmake unicode/importer/convert.adb -D obj -o $@ \ $(BUILDER_OPTIONS) \ -cargs $(ADAFLAGS) \ -largs $(LDFLAGS) unicode/unicode-names-basic_latin.ads: obj/convert \ /usr/share/unicode/Blocks.txt \ /usr/share/unicode/NameAliases.txt \ /usr/share/unicode/UnicodeData.txt # Generate unicode-names/* directly in unicode/. ln -s unicode generated $^ rm generated override_dh_auto_clean:: rm -f unicode/unicode-names-* ###################################################################### ADS_DIR := usr/share/ada/adainclude GPR_DIR := usr/share/gpr ALI_DIR := usr/lib/$(DEB_HOST_MULTIARCH)/ada/adalib SO_DIR := usr/lib/$(DEB_HOST_MULTIARCH) A_DIR := usr/lib/$(DEB_HOST_MULTIARCH) define library_template # Parameters: # _SRCDIR: directory containing the sources files # _deps_int : used in -aI -aO -l for libs built by this deb source # _deps_int_direct: subset used for .gpr and ada:Depends # _deps_ext : used in -aI -aO -l for libs from packaged Build-Depends # _deps_ext_direct: subset used for .gpr and ada:Depends # _deps_gnarl : used in -l, should be empty or gnarl-BV # For any dependency d, $(d)_DEV_PKG: deb -dev package for $(d) # For any internal dependency d, $(d)_SRCDIR as above. # Remove pure specifications and separate compilation units. $(library)_unit_bodies := $(foreach s, \ $(wildcard $($(library)_SRCDIR)/*.adb) \ ,$(if $(shell grep -l '^separate ' $(s)),,$(s))) $(library)_c_sources := $(wildcard $($(library)_SRCDIR)/*.c) # Build dynamic library. override_dh_auto_build-arch: obj/shared/$($(library)_SONAME) obj/shared/$($(library)_SONAME): \ $$(patsubst $($(library)_SRCDIR)/%.c,obj/shared_$(library)_obj/%.o,$$($(library)_c_sources)) \ | obj/shared obj/shared_$(library)_ali obj/shared_$(library)_obj # -fPIC/-shared overrides -fPIE/-pie in ADAFLAGS/LDFLAGS. gnatmake -c $$($(library)_unit_bodies) -D obj/shared_$(library)_obj \ $(BUILDER_OPTIONS) \ $(foreach l, $($(library)_deps_int), \ -aI$($(l)_SRCDIR) \ -aOobj/shared_$(l)_ali) \ $(addprefix -aI/$(ADS_DIR)/, $($(library)_deps_ext)) \ $(addprefix -aO/$(ALI_DIR)/, $($(library)_deps_ext)) \ -cargs $(ADAFLAGS) -fPIC gcc-$(GNAT_VERSION) $(LDFLAGS) -shared \ -o $$@ \ -Wl,-soname,$($(library)_SONAME) \ obj/shared_$(library)_obj/*.o \ -Lobj/shared $(addprefix -l, $($(library)_deps_int) \ $($(library)_deps_ext) \ $($(library)_deps_gnarl) \ gnat-$(GNAT_VERSION)) # Create development link so that the other libraries may link with it. ln -fs $($(library)_SONAME) obj/shared/lib$(library).so # Move ALI files to library directory and mark them read-only. mv obj/shared_$(library)_obj/*.ali obj/shared_$(library)_ali chmod 444 obj/shared_$(library)_ali/* # Build static library. override_dh_auto_build-arch: obj/static/lib$(library).a obj/static/lib$(library).a: \ $(patsubst $($(library)_SRCDIR)/%.c,obj/static_$(library)_obj/%.o,$($(library)_c_sources)) \ | obj/static obj/static_$(library)_ali obj/static_$(library)_obj gnatmake -c $$($(library)_unit_bodies) -D obj/static_$(library)_obj \ $(BUILDER_OPTIONS) \ $(foreach l, $($(library)_deps_int), \ -aI$($(l)_SRCDIR) \ -aOobj/static_$(l)_ali) \ $(addprefix -aI/$(ADS_DIR)/, $($(library)_deps_ext)) \ $(addprefix -aO/$(ALI_DIR)/, $($(library)_deps_ext)) \ -cargs $(ADAFLAGS) ar rc $$@ obj/static_$(library)_obj/*.o ranlib $$@ # Move ALI files to library directory and mark them read-only. mv obj/static_$(library)_obj/*.ali obj/static_$(library)_ali chmod 444 obj/static_$(library)_ali/*.ali obj/shared_$(library)_obj/%.o: $($(library)_SRCDIR)/%.c | obj/shared_$(library)_obj gcc-$(GNAT_VERSION) -c $(CFLAGS) $(CPPFLAGS) $$< -o $$@ -fPIC obj/static_$(library)_obj/%.o: $($(library)_SRCDIR)/%.c | obj/static_$(library)_obj gcc-$(GNAT_VERSION) -c $(CFLAGS) $(CPPFLAGS) $$< -o $$@ obj/shared_$(library)_ali obj/shared_$(library)_obj obj/static_$(library)_ali obj/static_$(library)_obj: | obj mkdir $$@ override_dh_install:: # dynamic library dh_install --package=$($(library)_LIB_PKG) \ obj/shared/$($(library)_SONAME) \ $(SO_DIR) # static library dh_install --package=$($(library)_DEV_PKG) \ obj/static/lib$(library).a \ $(A_DIR) # development symbolic link dh_link --package=$($(library)_DEV_PKG) \ $(SO_DIR)/$($(library)_SONAME) \ $(SO_DIR)/lib$(library).so # ALI files dh_install --package=$($(library)_DEV_PKG) \ obj/shared_$(library)_ali/*.ali \ $(ALI_DIR)/$(library) # Sources dh_install --package=$($(library)_DEV_PKG) \ $($(library)_SRCDIR)/*.ad[bs] $$($(library)_c_sources) \ $(ADS_DIR)/$(library) # Substitution variables for the control file. echo 'ada:Depends=gnat, gnat-$(GNAT_VERSION), \ $(foreach l, $($(library)_deps_int_direct), $($(l)_DEV_PKG) (=$$$${binary:Version}),) \ $(foreach l, $($(library)_deps_ext_direct), $($(l)_DEV_PKG),) \ $($(library)_LIB_PKG)' \ >> debian/$($(library)_DEV_PKG).substvars # Externally built project installed for end users. override_dh_auto_build-arch: obj/$(library).gpr obj/$(library).gpr: debian/template.gpr | obj sed ' \ /@IMPORTS@/ { \ s//$(foreach l, $($(library)_deps_int_direct) \ $($(library)_deps_ext_direct) \ ,with "$(l).gpr";\n)/; \ s/\n /\n/g; }; \ $(foreach v,library SO_DIR ADS_DIR ALI_DIR,s|@$(v)@|$($(v))|;) \ ' $$< > $$@ override_dh_install:: dh_install --package=$($(library)_DEV_PKG) \ obj/$(library).gpr \ $(GPR_DIR) endef # The dependency information can be deduced from the sources, and # should match $(library)_SRCDIR/*.gpr. xmlada_unicode_SRCDIR := unicode xmlada_input_SRCDIR := input_sources xmlada_input_deps_int_direct := xmlada_unicode xmlada_input_deps_int := xmlada_unicode xmlada_sax_SRCDIR := sax xmlada_sax_deps_int_direct := xmlada_input xmlada_unicode xmlada_sax_deps_int := xmlada_input xmlada_unicode xmlada_dom_SRCDIR := dom xmlada_dom_deps_int_direct := xmlada_sax xmlada_unicode xmlada_dom_deps_int := xmlada_sax xmlada_input xmlada_unicode xmlada_schema_SRCDIR := schema xmlada_schema_deps_int_direct := xmlada_dom xmlada_sax xmlada_unicode xmlada_schema_deps_int := xmlada_dom xmlada_sax xmlada_input xmlada_unicode # To debug an instantiation, replace eval with error: $(foreach library, \ xmlada_unicode xmlada_input xmlada_sax xmlada_dom xmlada_schema \ ,$(eval $(call library_template))) obj/shared obj/static: | obj obj obj/shared obj/static: mkdir $@ override_dh_auto_clean:: rm -fr obj ###################################################################### # Upstream docs target does not generate text output. override_dh_auto_build-indep: ifeq (,$(filter nodoc,$(DEB_BUILD_OPTIONS))) $(MAKE) -C docs html latexpdf text SPHINXOPTS=-j$(BUILDER_JOBS) endif override_dh_auto_clean:: rm -fr docs/_build # Compatibility project, importing all XMLAda libraries. override_dh_install:: dh_install --package=$(xmlada_schema_DEV_PKG) \ distrib/xmlada.gpr \ $(GPR_DIR) # Remaining install tasks. .PHONY: override_dh_install override_dh_install:: dh_install --remaining-packages ###################################################################### # Mimic 'dh --with sphinxdoc', but without adding sphinx-common to # Build-Depends for arch-only builds. .PHONY: override_dh_installdocs-indep override_dh_installdocs-indep: dh_installdocs -i dh_sphinxdoc # These example sources are executable in version 18. .PHONY: override_dh_fixperms-indep override_dh_fixperms-indep: find debian/libxmlada-doc/usr/share/doc/libxmlada-doc/examples/cross \ -type f -executable | xargs chmod -x dh_fixperms -i ###################################################################### .PHONY: override_dh_compress override_dh_compress: dh_compress --package=libxmlada-doc \ --exclude=.adb --exclude=.ads --exclude=.gpr \ --exclude=.xml --exclude=.xsd dh_compress --remaining-packages