[debhelper-devel] Bug#794396: CMake cross compilation support

Helmut Grohne helmut at subdivi.de
Sun Aug 2 15:27:39 UTC 2015


Package: debhelper
Version: 9.20150628
Severity: wishlist
Tags: patch
User: helmutg at debian.org
Usertags: rebootstrap

I tried to cross build src:libical. It fails, because cmake selects "cc"
as its compiler. I saw very similar failures for src:attica,
src:automoc, src:charls, src:clucene-core, src:cutecom, src:ebook-tools,
src:game-music-emu, src:garmindev, src:gflags, src:grantlee,
src:graphite2, src:libbluedevil, src:libgooglepinyin, src:libmsn,
src:librabbitmq, src:libsoxr, src:lucene++, src:mppenc,
src:mysql-connector-c++, src:nmapsi4, src:pkg-kde-tools, src:prison,
src:q4wine, src:qimageblitz, src:qjson, src:qzion, src:read-edid,
src:rtl-sdr, src:smokegen, src:taglib, src:taglib-extras, src:thinkfan,
src:tinyxml2, src:v42lucp, src:wbxml2, src:wildmidi, src:x265, src:yagf,
src:yaml-cpp, and src:yaml-cpp0.3. So instead of fixing all of these
packages (and more), I'd like to fix this in debhelper.

I took src:libical as my example and developed a patch that makes it
cross build. The patch is attached and it basically adds lots of flags
to CMake. The flags one should set are explained at
http://www.cmake.org/Wiki/CMake_Cross_Compiling. The good thing is that
this patch actually makes src:libical build.

So I worked from this patch and tried to implement the same approach
into debhelper itself. The result is the other attached patch. Like the
autoconf.pm counterpart, it is only active when the build architecture
and the host architecture differ, so I do note expect any regressions
for native compilation. Yet, cross compilation never worked with CMake,
so I think it is safe to change the behaviour of the build system.

What do you think about the approach?

Helmut
-------------- next part --------------
diff -Nru libical-1.0/debian/changelog libical-1.0/debian/changelog
--- libical-1.0/debian/changelog	2015-01-03 14:58:53.000000000 +0100
+++ libical-1.0/debian/changelog	2015-08-02 16:39:10.000000000 +0200
@@ -1,3 +1,10 @@
+libical (1.0-1.4) UNRELEASED; urgency=medium
+
+  * Non-maintainer upload.
+  * Fix FTCBFS. (Closes: #-1)
+
+ -- Helmut Grohne <helmut at subdivi.de>  Sun, 02 Aug 2015 16:39:04 +0200
+
 libical (1.0-1.3) unstable; urgency=medium
 
   * Non-maintainer upload.
diff -Nru libical-1.0/debian/rules libical-1.0/debian/rules
--- libical-1.0/debian/rules	2015-01-03 14:58:53.000000000 +0100
+++ libical-1.0/debian/rules	2015-08-02 16:57:22.000000000 +0200
@@ -1,4 +1,34 @@
 #!/usr/bin/make -f
 
+DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH)
+DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH)
+DEB_HOST_ARCH_OS ?= $(shell dpkg-architecture -qDEB_HOST_ARCH_OS)
+DEB_HOST_GNU_CPU ?= $(shell dpkg-architecture -qDEB_HOST_GNU_CPU)
+DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+ifeq ($(origin CC),default)
+CC=$(DEB_HOST_GNU_TYPE)-cc
+endif
+ifeq ($(origin CXX),default)
+CXX=$(DEB_HOST_GNU_TYPE)-c++
+endif
+ifneq ($(DEB_BUILD_ARCH),$(DEB_HOST_ARCH_OS))
+ifeq ($(DEB_HOST_ARCH_OS),linux)
+CMAKE_FLAGS += -DCMAKE_SYSTEM_NAME=Linux
+else
+ifeq ($(DEB_HOST_ARCH_OS),freebsd)
+CMAKE_FLAGS += -DCMAKE_SYSTEM_NAME=FreeBSD
+else
+ifeq ($(DEB_HOST_ARCH_OS),hurd)
+CMAKE_FLAGS += -DCMAKE_SYSTEM_NAME=GNU
+endif
+endif
+endif
+CMAKE_FLAGS += -DCMAKE_SYSTEM_PROCESSOR=$(DEB_HOST_GNU_CPU)
+CMAKE_FLAGS += -DCMAKE_C_COMPILER=$(CC) -DCMAKE_CXX_COMPILER=$(CXX)
+endif
+
 %:
 	dh $@ --buildsystem=cmake --parallel --list-missing --dbg-package=libical-dbg
+
+override_dh_auto_configure:
+	dh_auto_configure -- $(CMAKE_FLAGS)
-------------- next part --------------
diff -Nru debhelper-9.20150628/Debian/Debhelper/Buildsystem/cmake.pm debhelper-9.20150628+nmu1/Debian/Debhelper/Buildsystem/cmake.pm
--- debhelper-9.20150628/Debian/Debhelper/Buildsystem/cmake.pm	2015-05-15 18:20:39.000000000 +0200
+++ debhelper-9.20150628+nmu1/Debian/Debhelper/Buildsystem/cmake.pm	2015-08-02 17:26:43.000000000 +0200
@@ -7,7 +7,7 @@
 package Debian::Debhelper::Buildsystem::cmake;
 
 use strict;
-use Debian::Debhelper::Dh_Lib qw(compat);
+use Debian::Debhelper::Dh_Lib qw(compat dpkg_architecture_value);
 use base 'Debian::Debhelper::Buildsystem::makefile';
 
 sub DESCRIPTION {
@@ -45,6 +45,28 @@
 	push @flags, "-DCMAKE_VERBOSE_MAKEFILE=ON";
 	push @flags, "-DCMAKE_BUILD_TYPE=None";
 
+	if (dpkg_architecture_value("DEB_BUILD_GNU_TYPE")
+	    ne dpkg_architecture_value("DEB_HOST_GNU_TYPE")) {
+		if (dpkg_architecture_value("DEB_HOST_GNU_OS") eq "linux") {
+			push @flags, "-DCMAKE_SYSTEM_NAME=Linux";
+		} elsif (dpkg_architecture_value("DEB_HOST_GNU_OS") eq "freebsd") {
+			push @flags, "-DCMAKE_SYSTEM_NAME=FreeBSD";
+		} elsif (dpkg_architecture_value("DEB_HOST_GNU_OS") eq "hurd") {
+			push @flags, "-DCMAKE_SYSTEM_NAME=GNU";
+		}
+		push @flags, "-DCMAKE_SYSTEM_PROCESSOR=" . dpkg_architecture_value("DEB_HOST_GNU_CPU");
+		if ($ENV{CC}) {
+			push @flags, "-DCMAKE_C_COMPILER=" . $ENV{CC};
+		} else {
+			push @flags, "-DCMAKE_C_COMPILER=" . dpkg_architecture_value("DEB_HOST_GNU_TYPE") . "-cc";
+		}
+		if ($ENV{CXX}) {
+			push @flags, "-DCMAKE_CXX_COMPILER=" . $ENV{CXX};
+		} else {
+			push @flags, "-DCMAKE_CXX_COMPILER=" . dpkg_architecture_value("DEB_HOST_GNU_TYPE") . "-c++";
+		}
+	}
+
 	# CMake doesn't respect CPPFLAGS, see #653916.
 	if ($ENV{CPPFLAGS} && ! compat(8)) {
 		$ENV{CFLAGS}   .= ' ' . $ENV{CPPFLAGS};
diff -Nru debhelper-9.20150628/debian/changelog debhelper-9.20150628+nmu1/debian/changelog
--- debhelper-9.20150628/debian/changelog	2015-06-28 13:56:15.000000000 +0200
+++ debhelper-9.20150628+nmu1/debian/changelog	2015-08-02 17:10:43.000000000 +0200
@@ -1,3 +1,10 @@
+debhelper (9.20150628+nmu1) UNRELEASED; urgency=medium
+
+  * Non-maintainer upload.
+  * Support cross compilation in CMake buildsystem. (Closes: #-1)
+
+ -- Helmut Grohne <helmut at subdivi.de>  Sun, 02 Aug 2015 17:10:22 +0200
+
 debhelper (9.20150628) unstable; urgency=medium
 
   * Upload to unstable with ddebs support disabled by default.


More information about the debhelper-devel mailing list