Skip to content

Commit b40d318

Browse files
committed
Fixed cross compilations with the Autotools build
Pull request protocolbuffers#2517 caused cross compilations to start failing, because the js_embed binary was being built to run on the target platform instead of on the build machine. This change updates the Autotools build to use the AX_PROG_CXX_FOR_BUILD macro to find a suitable compiler for the build machine and always use that when building js_embed.
1 parent 4cb113a commit b40d318

File tree

4 files changed

+242
-3
lines changed

4 files changed

+242
-3
lines changed

configure.ac

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ AC_ARG_WITH([protoc],
6060
# Checks for programs.
6161
AC_PROG_CC
6262
AC_PROG_CXX
63+
AC_PROG_CXX_FOR_BUILD
6364
AC_LANG([C++])
6465
ACX_USE_SYSTEM_EXTENSIONS
6566
m4_ifdef([AM_PROG_AR], [AM_PROG_AR])

m4/ax_prog_cc_for_build.m4

+125
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
# ===========================================================================
2+
# http://www.gnu.org/software/autoconf-archive/ax_prog_cc_for_build.html
3+
# ===========================================================================
4+
#
5+
# SYNOPSIS
6+
#
7+
# AX_PROG_CC_FOR_BUILD
8+
#
9+
# DESCRIPTION
10+
#
11+
# This macro searches for a C compiler that generates native executables,
12+
# that is a C compiler that surely is not a cross-compiler. This can be
13+
# useful if you have to generate source code at compile-time like for
14+
# example GCC does.
15+
#
16+
# The macro sets the CC_FOR_BUILD and CPP_FOR_BUILD macros to anything
17+
# needed to compile or link (CC_FOR_BUILD) and preprocess (CPP_FOR_BUILD).
18+
# The value of these variables can be overridden by the user by specifying
19+
# a compiler with an environment variable (like you do for standard CC).
20+
#
21+
# It also sets BUILD_EXEEXT and BUILD_OBJEXT to the executable and object
22+
# file extensions for the build platform, and GCC_FOR_BUILD to `yes' if
23+
# the compiler we found is GCC. All these variables but GCC_FOR_BUILD are
24+
# substituted in the Makefile.
25+
#
26+
# LICENSE
27+
#
28+
# Copyright (c) 2008 Paolo Bonzini <bonzini@gnu.org>
29+
#
30+
# Copying and distribution of this file, with or without modification, are
31+
# permitted in any medium without royalty provided the copyright notice
32+
# and this notice are preserved. This file is offered as-is, without any
33+
# warranty.
34+
35+
#serial 8
36+
37+
AU_ALIAS([AC_PROG_CC_FOR_BUILD], [AX_PROG_CC_FOR_BUILD])
38+
AC_DEFUN([AX_PROG_CC_FOR_BUILD], [dnl
39+
AC_REQUIRE([AC_PROG_CC])dnl
40+
AC_REQUIRE([AC_PROG_CPP])dnl
41+
AC_REQUIRE([AC_EXEEXT])dnl
42+
AC_REQUIRE([AC_CANONICAL_HOST])dnl
43+
44+
dnl Use the standard macros, but make them use other variable names
45+
dnl
46+
pushdef([ac_cv_prog_CPP], ac_cv_build_prog_CPP)dnl
47+
pushdef([ac_cv_prog_gcc], ac_cv_build_prog_gcc)dnl
48+
pushdef([ac_cv_prog_cc_works], ac_cv_build_prog_cc_works)dnl
49+
pushdef([ac_cv_prog_cc_cross], ac_cv_build_prog_cc_cross)dnl
50+
pushdef([ac_cv_prog_cc_g], ac_cv_build_prog_cc_g)dnl
51+
pushdef([ac_cv_exeext], ac_cv_build_exeext)dnl
52+
pushdef([ac_cv_objext], ac_cv_build_objext)dnl
53+
pushdef([ac_exeext], ac_build_exeext)dnl
54+
pushdef([ac_objext], ac_build_objext)dnl
55+
pushdef([CC], CC_FOR_BUILD)dnl
56+
pushdef([CPP], CPP_FOR_BUILD)dnl
57+
pushdef([CFLAGS], CFLAGS_FOR_BUILD)dnl
58+
pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl
59+
pushdef([LDFLAGS], LDFLAGS_FOR_BUILD)dnl
60+
pushdef([host], build)dnl
61+
pushdef([host_alias], build_alias)dnl
62+
pushdef([host_cpu], build_cpu)dnl
63+
pushdef([host_vendor], build_vendor)dnl
64+
pushdef([host_os], build_os)dnl
65+
pushdef([ac_cv_host], ac_cv_build)dnl
66+
pushdef([ac_cv_host_alias], ac_cv_build_alias)dnl
67+
pushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl
68+
pushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl
69+
pushdef([ac_cv_host_os], ac_cv_build_os)dnl
70+
pushdef([ac_cpp], ac_build_cpp)dnl
71+
pushdef([ac_compile], ac_build_compile)dnl
72+
pushdef([ac_link], ac_build_link)dnl
73+
74+
save_cross_compiling=$cross_compiling
75+
save_ac_tool_prefix=$ac_tool_prefix
76+
cross_compiling=no
77+
ac_tool_prefix=
78+
79+
AC_PROG_CC
80+
AC_PROG_CPP
81+
AC_EXEEXT
82+
83+
ac_tool_prefix=$save_ac_tool_prefix
84+
cross_compiling=$save_cross_compiling
85+
86+
dnl Restore the old definitions
87+
dnl
88+
popdef([ac_link])dnl
89+
popdef([ac_compile])dnl
90+
popdef([ac_cpp])dnl
91+
popdef([ac_cv_host_os])dnl
92+
popdef([ac_cv_host_vendor])dnl
93+
popdef([ac_cv_host_cpu])dnl
94+
popdef([ac_cv_host_alias])dnl
95+
popdef([ac_cv_host])dnl
96+
popdef([host_os])dnl
97+
popdef([host_vendor])dnl
98+
popdef([host_cpu])dnl
99+
popdef([host_alias])dnl
100+
popdef([host])dnl
101+
popdef([LDFLAGS])dnl
102+
popdef([CPPFLAGS])dnl
103+
popdef([CFLAGS])dnl
104+
popdef([CPP])dnl
105+
popdef([CC])dnl
106+
popdef([ac_objext])dnl
107+
popdef([ac_exeext])dnl
108+
popdef([ac_cv_objext])dnl
109+
popdef([ac_cv_exeext])dnl
110+
popdef([ac_cv_prog_cc_g])dnl
111+
popdef([ac_cv_prog_cc_cross])dnl
112+
popdef([ac_cv_prog_cc_works])dnl
113+
popdef([ac_cv_prog_gcc])dnl
114+
popdef([ac_cv_prog_CPP])dnl
115+
116+
dnl Finally, set Makefile variables
117+
dnl
118+
BUILD_EXEEXT=$ac_build_exeext
119+
BUILD_OBJEXT=$ac_build_objext
120+
AC_SUBST(BUILD_EXEEXT)dnl
121+
AC_SUBST(BUILD_OBJEXT)dnl
122+
AC_SUBST([CFLAGS_FOR_BUILD])dnl
123+
AC_SUBST([CPPFLAGS_FOR_BUILD])dnl
124+
AC_SUBST([LDFLAGS_FOR_BUILD])dnl
125+
])

m4/ax_prog_cxx_for_build.m4

+110
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
# ===========================================================================
2+
# http://www.gnu.org/software/autoconf-archive/ax_prog_cxx_for_build.html
3+
# ===========================================================================
4+
#
5+
# SYNOPSIS
6+
#
7+
# AX_PROG_CXX_FOR_BUILD
8+
#
9+
# DESCRIPTION
10+
#
11+
# This macro searches for a C++ compiler that generates native
12+
# executables, that is a C++ compiler that surely is not a cross-compiler.
13+
# This can be useful if you have to generate source code at compile-time
14+
# like for example GCC does.
15+
#
16+
# The macro sets the CXX_FOR_BUILD and CXXCPP_FOR_BUILD macros to anything
17+
# needed to compile or link (CXX_FOR_BUILD) and preprocess
18+
# (CXXCPP_FOR_BUILD). The value of these variables can be overridden by
19+
# the user by specifying a compiler with an environment variable (like you
20+
# do for standard CXX).
21+
#
22+
# LICENSE
23+
#
24+
# Copyright (c) 2008 Paolo Bonzini <bonzini@gnu.org>
25+
# Copyright (c) 2012 Avionic Design GmbH
26+
#
27+
# Based on the AX_PROG_CC_FOR_BUILD macro by Paolo Bonzini.
28+
#
29+
# Copying and distribution of this file, with or without modification, are
30+
# permitted in any medium without royalty provided the copyright notice
31+
# and this notice are preserved. This file is offered as-is, without any
32+
# warranty.
33+
34+
#serial 2
35+
36+
AU_ALIAS([AC_PROG_CXX_FOR_BUILD], [AX_PROG_CXX_FOR_BUILD])
37+
AC_DEFUN([AX_PROG_CXX_FOR_BUILD], [dnl
38+
AC_REQUIRE([AX_PROG_CC_FOR_BUILD])dnl
39+
AC_REQUIRE([AC_PROG_CXX])dnl
40+
AC_REQUIRE([AC_PROG_CXXCPP])dnl
41+
AC_REQUIRE([AC_CANONICAL_HOST])dnl
42+
43+
dnl Use the standard macros, but make them use other variable names
44+
dnl
45+
pushdef([ac_cv_prog_CXXCPP], ac_cv_build_prog_CXXCPP)dnl
46+
pushdef([ac_cv_prog_gxx], ac_cv_build_prog_gxx)dnl
47+
pushdef([ac_cv_prog_cxx_works], ac_cv_build_prog_cxx_works)dnl
48+
pushdef([ac_cv_prog_cxx_cross], ac_cv_build_prog_cxx_cross)dnl
49+
pushdef([ac_cv_prog_cxx_g], ac_cv_build_prog_cxx_g)dnl
50+
pushdef([CXX], CXX_FOR_BUILD)dnl
51+
pushdef([CXXCPP], CXXCPP_FOR_BUILD)dnl
52+
pushdef([CXXFLAGS], CXXFLAGS_FOR_BUILD)dnl
53+
pushdef([CPPFLAGS], CPPFLAGS_FOR_BUILD)dnl
54+
pushdef([CXXCPPFLAGS], CXXCPPFLAGS_FOR_BUILD)dnl
55+
pushdef([host], build)dnl
56+
pushdef([host_alias], build_alias)dnl
57+
pushdef([host_cpu], build_cpu)dnl
58+
pushdef([host_vendor], build_vendor)dnl
59+
pushdef([host_os], build_os)dnl
60+
pushdef([ac_cv_host], ac_cv_build)dnl
61+
pushdef([ac_cv_host_alias], ac_cv_build_alias)dnl
62+
pushdef([ac_cv_host_cpu], ac_cv_build_cpu)dnl
63+
pushdef([ac_cv_host_vendor], ac_cv_build_vendor)dnl
64+
pushdef([ac_cv_host_os], ac_cv_build_os)dnl
65+
pushdef([ac_cxxcpp], ac_build_cxxcpp)dnl
66+
pushdef([ac_compile], ac_build_compile)dnl
67+
pushdef([ac_link], ac_build_link)dnl
68+
69+
save_cross_compiling=$cross_compiling
70+
save_ac_tool_prefix=$ac_tool_prefix
71+
cross_compiling=no
72+
ac_tool_prefix=
73+
74+
AC_PROG_CXX
75+
AC_PROG_CXXCPP
76+
77+
ac_tool_prefix=$save_ac_tool_prefix
78+
cross_compiling=$save_cross_compiling
79+
80+
dnl Restore the old definitions
81+
dnl
82+
popdef([ac_link])dnl
83+
popdef([ac_compile])dnl
84+
popdef([ac_cxxcpp])dnl
85+
popdef([ac_cv_host_os])dnl
86+
popdef([ac_cv_host_vendor])dnl
87+
popdef([ac_cv_host_cpu])dnl
88+
popdef([ac_cv_host_alias])dnl
89+
popdef([ac_cv_host])dnl
90+
popdef([host_os])dnl
91+
popdef([host_vendor])dnl
92+
popdef([host_cpu])dnl
93+
popdef([host_alias])dnl
94+
popdef([host])dnl
95+
popdef([CXXCPPFLAGS])dnl
96+
popdef([CPPFLAGS])dnl
97+
popdef([CXXFLAGS])dnl
98+
popdef([CXXCPP])dnl
99+
popdef([CXX])dnl
100+
popdef([ac_cv_prog_cxx_g])dnl
101+
popdef([ac_cv_prog_cxx_cross])dnl
102+
popdef([ac_cv_prog_cxx_works])dnl
103+
popdef([ac_cv_prog_gxx])dnl
104+
popdef([ac_cv_prog_CXXCPP])dnl
105+
106+
dnl Finally, set Makefile variables
107+
dnl
108+
AC_SUBST([CXXFLAGS_FOR_BUILD])dnl
109+
AC_SUBST([CXXCPPFLAGS_FOR_BUILD])dnl
110+
])

src/Makefile.am

+6-3
Original file line numberDiff line numberDiff line change
@@ -484,13 +484,16 @@ libprotoc_la_SOURCES = \
484484
google/protobuf/compiler/csharp/csharp_wrapper_field.cc \
485485
google/protobuf/compiler/csharp/csharp_wrapper_field.h
486486

487-
bin_PROGRAMS = protoc js_embed
487+
bin_PROGRAMS = protoc
488488
protoc_LDADD = $(PTHREAD_LIBS) libprotobuf.la libprotoc.la
489489
protoc_SOURCES = google/protobuf/compiler/main.cc
490490

491491
# The special JS code for the well-known types is linked into the compiler via
492-
# well_known_types_embed.cc, which is generated from .js source files.
493-
js_embed_SOURCES = google/protobuf/compiler/js/embed.cc
492+
# well_known_types_embed.cc, which is generated from .js source files. We have
493+
# to build the js_embed binary using $(CXX_FOR_BUILD) so that it is executable
494+
# on the build machine in a cross-compilation setup.
495+
js_embed$(EXEEXT): google/protobuf/compiler/js/embed.cc
496+
$(CXX_FOR_BUILD) -o $@ $<
494497
js_well_known_types_sources = \
495498
google/protobuf/compiler/js/well_known_types/any.js \
496499
google/protobuf/compiler/js/well_known_types/struct.js \

0 commit comments

Comments
 (0)