#!/usr/bin/make -f
# debian/rules for libgtkada
# Copyright (c) 2003-2011 Ludovic Brenta <lbrenta@debian.org>
# Copyright (c) 2011 Nicolas Boulenguez <nicolas.boulenguez@free.fr>
#
# 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.
#
# The full text of the GNU General Public License is in the file
# /usr/share/common-licenses/GPL-3 on Debian systems.

# Uncomment for debugging settings.
# DEB_BUILD_OPTIONS := noopt
# GPRBUILD_VERBOSE := -v
# SKIP_STATIC := true
# export DH_VERBOSE := 1

######################################################################

.SUFFIXES:

binary binary-arch binary-indep build-arch build-indep clean:
	dh $@

build: # do nothing

# Ignore upstream's build system
override_dh_auto_configure:

# In order to ease cleaning and avoid name conflicts, put as many
# generated files as possible into a specific directory.
# debian/*.gpr projects rely on this name.
GEN_DIR := debian/build

$(GEN_DIR):
	mkdir $@

override_dh_auto_clean::
	dh_clean
	rm -f -r $(GEN_DIR)

######################################################################

DEB_HOST_MULTIARCH := $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)

GPRBUILD := gprbuild \
   -cargs -Wall -fstack-check \
   -cargs:Ada -gnatVa -gnata -gnatf -gnatn -gnato \
      $(shell DEB_BUILD_MAINT_OPTIONS=hardening=-format \
              DEB_BUILD_OPTIONS="$(DEB_BUILD_OPTIONS)" dpkg-buildflags --get CFLAGS) \
   -cargs:C -Wextra \
      $(shell DEB_BUILD_OPTIONS="$(DEB_BUILD_OPTIONS)" dpkg-buildflags --get CFLAGS) \
      $(shell pkg-config --cflags-only-I gtk+-2.0 libgnomeui-2.0 gl x11) \
   -bargs:Ada -E \
   -largs -Wl,--as-needed \
      $(shell DEB_BUILD_OPTIONS="$(DEB_BUILD_OPTIONS)" dpkg-buildflags --get LDFLAGS) \
   -gargs -R -p -s -we $(GPRBUILD_VERBOSE)


.NOTPARALLEL:
ifeq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
   GPRBUILD += -j$(shell getconf _NPROCESSORS_ONLN)
else
   GPRBUILD += -j$(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
endif


# We have to override the default gprbuild configuration, as we want
# to compile C sources with gnatgcc, which may be distinct from gcc.
GPRBUILD_CONFIG := $(GEN_DIR)/default.cgpr
GPRBUILD += --config=$(GPRBUILD_CONFIG)
$(GPRBUILD_CONFIG): | $(GEN_DIR)
	gprconfig --batch -o $@ \
          --target=$(shell gnatgcc -dumpmachine) \
          --config=C,$(shell gnatgcc -dumpversion) \
          --config=Ada


# Template to avoid redundant code for libraries.

define library_template
# 1: library name, as in libNAME.so.xxx
# 1_LDFLAGS: as in "-lfoo -lbar"
# 1_SOURCE_DIRS: as in src/generated src
# 1_WITHED_PROJECTS: for installed project, as in "gtkada otherproject"
# 1_TRAMPOLINE_LINTIAN_OVERRIDE: if not empty, a lintian override is generated
# 1_VERSIONED_GPR: if not empty, a versioned link points to the system gpr file
# 1_LANGUAGES: as in "Ada", "C"

$(1)_SOVERSION  := $(shell sed -n -r 's/^Package: lib$(1)([[:digit:].]+)$$/\1/p' debian/control)
$(1)_DEV_PKG    := $(shell sed -n -r 's/^Package: (lib$(1)[[:digit:].]+-dev)$$/\1/p' debian/control)
$(1)_LIB_PKG    := lib$(1)$$($(1)_SOVERSION)
$(1)_DBG_PKG    := lib$(1)-dbg
$(1)_SONAME     := lib$(1).so.$$($(1)_SOVERSION)


# Static library
$(1)_STATIC_LIB := $(GEN_DIR)/$(1)_static_lib/lib$(1).a

ifeq (,$(SKIP_STATIC))
override_dh_auto_build-arch: $$($(1)_STATIC_LIB)
override_dh_auto_install-arch::
	dh_install --package=$$($(1)_DEV_PKG) $$($(1)_STATIC_LIB) usr/lib/$(DEB_HOST_MULTIARCH)
	dh_strip --package=$$($(1)_DEV_PKG) --exclude=.a
endif

.PHONY: $$($(1)_STATIC_LIB) # always call gprbuild
$$($(1)_STATIC_LIB): $(GEN_DIR)/$(1)_static.gpr $(GPRBUILD_CONFIG) $$(patsubst %,$(GEN_DIR)/%_static.gpr,$$($(1)_WITHED_PROJECTS))
	$(GPRBUILD) $$<


# Dynamic library and ALI files.
$(1)_DYNAMIC_LIB := $(GEN_DIR)/$(1)_dynamic_lib/$$($(1)_SONAME)

override_dh_auto_build-arch: $$($(1)_DYNAMIC_LIB)
override_dh_auto_install-arch::
	dh_install --package=$$($(1)_LIB_PKG) $$($(1)_DYNAMIC_LIB) usr/lib/$(DEB_HOST_MULTIARCH)
	dh_install --package=$$($(1)_DEV_PKG) $(GEN_DIR)/$(1)_dynamic_lib/*.ali usr/lib/$(DEB_HOST_MULTIARCH)/ada/adalib/$(1)
	dh_link --package=$$($(1)_DEV_PKG) $(addprefix usr/lib/$(DEB_HOST_MULTIARCH)/,$$($(1)_SONAME) lib$(1).so)
	dh_strip --package=$$($(1)_LIB_PKG) --dbg-package=$$($(1)_DBG_PKG)

.PHONY: $$($(1)_DYNAMIC_LIB) # always call gprbuild
$$($(1)_DYNAMIC_LIB): $(GEN_DIR)/$(1)_dynamic.gpr $(GPRBUILD_CONFIG) $$(patsubst %,$(GEN_DIR)/%_dynamic.gpr,$$($(1)_WITHED_PROJECTS))
	$(GPRBUILD) $$<


# Sources
$(1)_SOURCES := $$(wildcard $$(foreach dir,$$($(1)_SOURCE_DIRS),$$(dir)/*.ad[sb] $$(dir)/*.[ch]))

override_dh_auto_install-arch::
	dh_install --package=$$($(1)_DEV_PKG) $$($(1)_SOURCES) usr/share/ada/adainclude/$(1)


# Build-time project files.

$(GEN_DIR)/$(1)_static.gpr $(GEN_DIR)/$(1)_dynamic.gpr: $(GEN_DIR)/$(1)_%.gpr : | $(GEN_DIR)
	rm -f $$@
	$$(patsubst %,echo 'with "%_$$*.gpr";' >> $$@;,$$($(1)_WITHED_PROJECTS))
	echo 'project $(1)_$$* is' >> $$@
	echo '  for Library_Name use "$(1)";' >> $$@
	echo '  for Library_Kind use "$$*";' >> $$@
	echo '  for Library_Dir use "$(1)_$$*_lib";' >> $$@
	echo '  for Source_Dirs use ("$$(shell echo $$(addprefix ../../,$$($(1)_SOURCE_DIRS)) | sed 's@ \+@", "@g')");' >> $$@
	echo '  for Object_Dir use "$(1)_$$*_obj";' >> $$@
	echo '  for Languages use ($$($(1)_LANGUAGES));' >> $$@
	echo '  for Library_Options use ("$$(shell echo $$($(1)_LDFLAGS) | sed 's@ \+@", "@g')");' >> $$@
	if test "$$*" = "dynamic"; then \
        echo '  for Library_Version use "$$($(1)_SONAME)";' >> $$@; \
        fi
	echo 'end $(1)_$$*;' >> $$@


# system-wide gnat project file

override_dh_auto_build-arch: $(GEN_DIR)/$(1).gpr
override_dh_auto_install-arch::
	dh_install --package=$$($(1)_DEV_PKG) $(GEN_DIR)/$(1).gpr usr/share/ada/adainclude

ifneq (,$$($(1)_VERSIONED_GPR))
override_dh_auto_build-arch: $(GEN_DIR)/$(1)2.gpr
override_dh_auto_install-arch::
	dh_install --package=$$($(1)_DEV_PKG) $(GEN_DIR)/$(1)2.gpr usr/share/ada/adainclude
endif

$(GEN_DIR)/$(1).gpr $(GEN_DIR)/$(1)2.gpr: $(GEN_DIR)/%.gpr: | $(GEN_DIR)
	rm -f $$@
	echo '--  This project file is designed to help build applications that use' >> $$@
	echo '--  $(1). Here is an example of how to use this project file:' >> $$@
	echo '--' >> $$@
	echo '--  with "$(1)";' >> $$@
	echo '--  project Example is' >> $$@
	echo '--     for Object_Dir use "obj";' >> $$@
	echo '--     for Exec_Dir use ".";' >> $$@
	echo '--     for Main use ("example");' >> $$@
	echo '--  end Example;' >> $$@
	echo '' >> $$@
	$$(patsubst %,echo 'with "%.gpr";' >> $$@;,$$($(1)_WITHED_PROJECTS))
	echo 'project $$* is' >> $$@
	echo '   for Library_Name use "$(1)";' >> $$@
	echo '   for Library_Kind use "dynamic";' >> $$@
	echo '   for Library_Dir use "/usr/lib/$(DEB_HOST_MULTIARCH)";' >> $$@
	echo '   for Source_Dirs use ("/usr/share/ada/adainclude/$(1)");' >> $$@
	echo '   for Library_ALI_Dir use "/usr/lib/$(DEB_HOST_MULTIARCH)/ada/adalib/$(1)";' >> $$@
	echo '   for Externally_Built use "true";' >> $$@
	echo '   package Linker is' >> $$@
	echo '      for Linker_Options use ("$$(shell echo $$($(1)_LDFLAGS) | sed 's@ \+@", "@g')");' >> $$@
	echo '   end Linker;' >> $$@
	echo 'end $$*;' >> $$@


# lintian override for executable stack

ifneq (,$$($(1)_TRAMPOLINE_LINTIAN_OVERRIDE))
override_dh_auto_build-arch: $(GEN_DIR)/$$($(1)_LIB_PKG)
override_dh_auto_install-arch::
	dh_install --package=$$($(1)_LIB_PKG) $(GEN_DIR)/$$($(1)_LIB_PKG) usr/share/lintian/overrides
endif

$(GEN_DIR)/$$($(1)_LIB_PKG): | $(GEN_DIR)
	echo '# gnat uses trampolines to implement Ada exceptions' >> $$@
	echo '$$($(1)_LIB_PKG) binary: shlib-with-executable-stack usr/lib/*/$$($(1)_SONAME)' >> $$@


endef # library_template

######################################################################

gtkada_LDFLAGS := -lgtk-x11-2.0 -lgdk-x11-2.0 -lgio-2.0 \
   -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 \
   -lgmodule-2.0 -lgobject-2.0 -lglib-2.0 -lX11
# Note that this is *smaller* than "pkg-config --libs-only-l" output
gtkada_SOURCE_DIRS := src/generated src
gtkada_VERSIONED_GPR := true
gtkada_LANGUAGES := "C", "Ada"

$(eval $(call library_template,gtkada))

# Some more prerequisites for generated sources.

$(gtkada_STATIC_LIB) $(gtkada_DYNAMIC_LIB): src/gtkada-intl.adb src/config.h

src/gtkada-intl.adb: src/gtkada-intl.gpb
	gnatprep -DGETTEXT_INTL=False -DHAVE_GETTEXT=True $< $@
override_dh_auto_clean::
	rm -f src/gtkada-intl.adb

src/config.h: src/config.h.in
	touch $@
override_dh_auto_clean::
	rm -f src/config.h

######################################################################

gtkglada_LDFLAGS := -lgtk-x11-2.0 -lgdk-x11-2.0 -lgobject-2.0 -lglib-2.0 -lX11 -lGL
# Note that this is *smaller* than "pkg-config --libs-only-l" output
gtkglada_SOURCE_DIRS := src/opengl
gtkglada_WITHED_PROJECTS := gtkada
gtkglada_LANGUAGES := "C", "Ada"

$(eval $(call library_template,gtkglada))

######################################################################

gnomeada_LDFLAGS := -lgnomeui-2 -lbonoboui-2 -lgobject-2.0
# Note that this is *smaller* than "pkg-config --libs-only-l" output
gnomeada_TRAMPOLINE_LINTIAN_OVERRIDE := true
gnomeada_SOURCE_DIRS := src/gnome
gnomeada_WITHED_PROJECTS := gtkada
gnomeada_VERSIONED_GPR := true
gnomeada_LANGUAGES := "Ada"

$(eval $(call library_template,gnomeada))

######################################################################

TOOLS := $(GEN_DIR)/tools_obj/gtkada-dialog

override_dh_auto_build-arch: $(TOOLS)
override_dh_auto_install-arch::
	dh_install --package=libgtkada-bin $(TOOLS) usr/bin
	dh_installman --package=libgtkada-bin docs/gtkada-dialog.1

.PHONY: $(TOOLS) # always call gprbuild
$(TOOLS): debian/tools.gpr $(GPRBUILD_CONFIG)
	$(GPRBUILD) $<

######################################################################

GTKADA_CONFIG := $(GEN_DIR)/gtkada-config

override_dh_auto_build-arch: $(GTKADA_CONFIG)
override_dh_auto_install-arch::
	dh_install --package=libgtkada-bin $(GTKADA_CONFIG) usr/bin
	dh_installman --package=libgtkada-bin docs/gtkada-config.1

$(GTKADA_CONFIG): debian/template_gtkada-config | $(GEN_DIR)
	sed $< \
           -e 's/DEB_HOST_MULTIARCH/$(DEB_HOST_MULTIARCH)/g' \
           -e 's/GTKADA_LDFLAGS/$(gtkada_LDFLAGS)/g' \
           -e 's/GTKADA_VERSION/$(gtkada_SOVERSION)/g' \
           > $@

######################################################################

TESTGTK_TGZ := $(GEN_DIR)/testgtk.tgz

override_dh_auto_build-indep: $(TESTGTK_TGZ)
override_dh_auto_install-indep::
	dh_installexamples --package=libgtkada-doc $(TESTGTK_TGZ)

$(TESTGTK_TGZ): | $(GEN_DIR)
	tar czf $@ testgtk

######################################################################

UG_DIR := docs/gtkada_ug


UG_TXT  := $(UG_DIR)/gtkada_ug.txt
override_dh_auto_build-indep: $(UG_TXT)
override_dh_auto_install-indep::
	dh_installdocs --package=libgtkada-doc $(UG_TXT)

$(UG_TXT): %/gtkada_ug.txt: %/gtkada_ug.texi %/hierarchy.txt
	makeinfo --plaintext -I $* -o $@ $<
override_dh_auto_clean::
	rm -f $(UG_TXT)


UG_INFO := $(UG_DIR)/gtkada_ug.info
override_dh_auto_build-indep: $(UG_INFO)
override_dh_auto_install-indep::
	dh_installinfo --package=libgtkada-doc $(UG_INFO)

# Generated in situ so that makeinfo references the images. This does
# not change much as long dh_installinfo dose not embed them.
$(UG_INFO): %/gtkada_ug.info: %/gtkada_ug.texi %/boxes.jpg %/hierarchy.jpg %/hierarchy.txt
	cd $* && makeinfo -o $(notdir $@) $(notdir $<)
override_dh_auto_clean::
	rm -f $(UG_INFO)


UG_PDF  := $(UG_DIR)/gtkada_ug.pdf
override_dh_auto_build-indep: $(UG_PDF)
override_dh_auto_install-indep::
	dh_installdocs --package=libgtkada-doc $(UG_PDF)

# Generated in situ so that texi2pdf embeds images.
$(UG_PDF): %/gtkada_ug.pdf: %/gtkada_ug.texi %/boxes.jpg %/hierarchy.jpg
	cd $* && texi2pdf --silent -o $(notdir $@) $(notdir $<)
override_dh_auto_clean::
	rm -f $(addprefix $(UG_DIR)/gtkada_ug.,aux cp fn ky log pdf pg toc tp vr)


UG_HTML := $(UG_DIR)/gtkada_ug.html
override_dh_auto_build-indep: $(UG_HTML)
override_dh_auto_install-indep::
	dh_installdocs --package=libgtkada-doc $(UG_HTML) $(UG_DIR)/boxes.jpg $(UG_DIR)/hierarchy.jpg

$(UG_DIR)/gtkada_ug.html: %/gtkada_ug.html: %/gtkada_ug.texi %/boxes.jpg %/hierarchy.jpg
	makeinfo --no-validate --no-split --html -I $* -o $@ $<
override_dh_auto_clean::
	rm -f $(UG_HTML)


# fig2dev correctly embeds boxes.gif even from another directory.
$(UG_DIR)/boxes.jpg: %.jpg: %.fig %.gif
	fig2dev -L jpeg $< $@
override_dh_auto_clean::
	rm -f $(UG_DIR)/boxes.jpg

######################################################################

# TODO: the reference manual needs generated parts:
# docs/gtkada_rm/generated.texi docs/gtkada_rm/generated_menu.texi:
# cd docs/gtkada_rm && \ ./generate_doc.pl `find
# $(addprefix ../../src/, . generated gnome opengl) -name "*.ads"`

######################################################################

# All arch packages depend on gtkada_LIB_PKG. This only has effect if
# it is the first call to dh_installdocs for such packages.
override_dh_installdocs:
	dh_installdocs --package=$(gtkada_LIB_PKG) debian/README.Debian debian/README.source
	dh_installdocs --arch --link-doc=$(gtkada_LIB_PKG)
	dh_installdocs --remaining-packages

######################################################################

override_dh_compress:
	dh_compress --package=libgtkada-doc \
           --exclude=.glade \
           --exclude=.adb --exclude=.ads \
           --exclude=.c --exclude=.h \
           --exclude=Makefile \
           --exclude=.pdf
	dh_compress --remaining-packages

######################################################################

GET_ORIG_MTN := mtn://www.ada-france.org?com.adacore.gtkada.debian
GET_ORIG_DIR := libgtkada
GET_ORIG_TGZ := libgtkada.tgz
GET_ORIG_TMP := libgtkada-get-orig-XXXXXXXXXX

get-orig-source:
	TMPDIR=$$(mktemp --tmpdir --directory $(GET_ORIG_TMP)) && \
        mtn clone -d $$TMPDIR/db.mtn $(GET_ORIG_MTN) -k "" $$TMPDIR/$(GET_ORIG_DIR) && \
        (cd $$TMPDIR && tar --create --gzip --exclude="_MTN" $(GET_ORIG_DIR)) > $(GET_ORIG_TGZ) ; \
        rm -f -r $$TMPDIR
	@echo "The file $(GET_ORIG_TGZ) contains the latest Debian snapshot of upstream sources."

######################################################################

RUN_TESTS_TMP := libgtkada-run-tests-XXXXXXXXXX

run-tests:
	TMPDIR=$$(mktemp --tmpdir --directory $(RUN_TESTS_TMP)) && \
        export TMPDIR && \
        (cd $$TMPDIR && sh $(CURDIR)/debian/tests/link_with_shared); \
        if test $$? = 0; then echo ok; else echo ko; fi; \
        rm -f -r $$TMPDIR
