[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: The state of cross building



Hi Timo,

On Sun, Jan 31, 2016 at 12:24:29PM +0100, Timo Weingärtner wrote:
> The build log has an interesting line:
> > dpkg-architecture: warning: specified GNU system type powerpc64le-linux-gnu does not match CC system type x86_64-linux-gnu, try setting a correct CC environment variable
> 
> And the build fails because the packages's Makefile uses $(CC) and it is not
> set correctly.
> 
> I don't think it should be each package's responsibility to set variables
> like CC, CXX, AR, etc. Instead they should be set by dpkg-buildpackage or
> perhaps dh_auto_*.

You raise an important issue here. Whose responsibility is setting up
the CC variable?

Thus far, I have assumed that packages should not assume CC to be set.
In principle, dpkg-buildpackage could set up this variable, but policy
still mandates that e.g. ./debian/rules binary-arch should be usable.
Furthermore, quite a pile of packages support using a different compiler
(e.g. clang) by setting CC to clang before building.

Of course, this reasoning does not imply that there should be no tools
for helping with this situation and the sheer number of affected
packages makes it obvious that we need to improve tooling here.

As for your suggestion that dh_auto_* should help here, I can tell that
it already does. dh_auto_configure does pass
--build=$(DEB_BUILD_GNU_TYPE) --host=$(DEB_HOST_GNU_TYPE) to configure
in a cross build setting and this very much makes autotools-based cross
builds just work. I hope that the same can be said for cmake in a not
too distant future.

Unfortunately, for Makefile based build systems we cannot simply pass CC
to the build. Exporting it as an environment variable, will not help
much as make defines CC as a builtin variable, which overrides the
environment. In the vast majority of cases, exporting is not enough.  In
particular, libpam-pwdfile is an example where this is happening and
where having dpkg-buildpackage export CC does not fix the build.

What could be done is passing CC= as a command line argument to the make
invocation from dh_auto_build. Unfortunately, this invocation is also
used by autotools, where it should not pass CC=, because configure gets
that right already. Additionally, my own experience is that Makefile
based packages tend to be so old that they don't use dh_auto_build.

So I don't see an obvious way to safely introduce this CC= setting
without breaking too many builds. I very much welcome suggestions to
improve this situation as it can save considerable amount of effort here
and I already noticed that adding CC= to make invocations is becoming
repetitive for me.

Here is the debian/rules snippet, that I tend to use for fixing these
issues:

include /usr/share/dpkg/architecture.mk
ifeq ($(origin CC),default)
CC := $(DEB_HOST_GNU_TYPE)-gcc
endif

Then add CC=$(CC) to the recursive make invocation. I have been talking
to Guillem Jover about easing the first part, but this has not landed in
the archive yet.

Helmut


Reply to: