diff options
author | Jan-Marek Glogowski <glogow@fbihome.de> | 2020-07-14 23:06:03 +0200 |
---|---|---|
committer | Jan-Marek Glogowski <glogow@fbihome.de> | 2020-09-11 18:43:48 +0200 |
commit | 4108665b63ab432732b8b351568c255d872cc3ff (patch) | |
tree | 79c890b3d999e6e6bfd631b8df72ae18947719aa | |
parent | 63972e79bbb9ea9654e755381641052632b0402c (diff) |
WIN cross: fix gpg-related library builds
Cross compiling these libraries requires to supply the cross-
compiler via the CC_FOR_BUILD environment variable. Since we have
to use the gcc-wrappers, we now need two different invocations
with different inclues and libraries, but just have fixed
environment variables. Also, the CC_FOR_BUILD clashes with LO's
own variant, but that is easy to fix.
So this change includes:
- gcc-wrappers: new option --wrapper-env-prefix to add a prefix
to the environment variable names
- gcc-wrappers: new option --wrapper-print-cmdline to dump the
real command called, when a verbose build is executed
- gcc-wrappers: default to exe, if the output has no extension
- unify build flags for gpg related libraries
Change-Id: I4e6a6ba3c6e09237c8ffefa40ce61131290a3852
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/102482
Tested-by: Jenkins
Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
-rw-r--r-- | config_host.mk.in | 3 | ||||
-rw-r--r-- | configure.ac | 12 | ||||
-rw-r--r-- | external/gpgmepp/ExternalProject_gpgmepp.mk | 12 | ||||
-rw-r--r-- | external/libassuan/ExternalProject_libassuan.mk | 11 | ||||
-rw-r--r-- | external/libgpg-error/ExternalProject_libgpg-error.mk | 10 | ||||
-rw-r--r-- | solenv/clang-format/excludelist | 2 | ||||
-rw-r--r-- | solenv/gbuild/platform/com_MSC_class.mk | 4 | ||||
-rw-r--r-- | solenv/gbuild/platform/com_MSC_defs.mk | 8 | ||||
-rw-r--r-- | solenv/gcc-wrappers/g++.cxx | 16 | ||||
-rw-r--r-- | solenv/gcc-wrappers/gcc.cxx | 16 | ||||
-rw-r--r-- | solenv/gcc-wrappers/wrapper.cxx | 56 | ||||
-rw-r--r-- | solenv/gcc-wrappers/wrapper.hxx | 4 |
12 files changed, 107 insertions, 47 deletions
diff --git a/config_host.mk.in b/config_host.mk.in index bcebdb669e29..e3014b015a48 100644 --- a/config_host.mk.in +++ b/config_host.mk.in @@ -62,6 +62,7 @@ export BZIP2_LIBS=$(gb_SPACE)@BZIP2_LIBS@ export CAIRO_CFLAGS=$(gb_SPACE)@CAIRO_CFLAGS@ export CAIRO_LIBS=$(gb_SPACE)@CAIRO_LIBS@ export CC=@CC@ +export CC_FOR_BUILD=@CC_FOR_BUILD@ export CCACHE_DEPEND_MODE=@CCACHE_DEPEND_MODE@ export CDR_CFLAGS=$(gb_SPACE)@CDR_CFLAGS@ export CDR_LIBS=$(gb_SPACE)@CDR_LIBS@ @@ -108,6 +109,7 @@ export CURL_LIBS=$(gb_SPACE)@CURL_LIBS@ export CUSTOM_BRAND_DIR=@CUSTOM_BRAND_DIR@ export CUSTOM_BRAND_IMAGES=@CUSTOM_BRAND_IMAGES@ export CXX=@CXX@ +export CXX_FOR_BUILD=@CXX_FOR_BUILD@ export CXX_X64_BINARY=@CXX_X64_BINARY@ export CXX_X86_BINARY=@CXX_X86_BINARY@ @x_CXXFLAGS@ export CXXFLAGS=@CXXFLAGS@ @@ -305,6 +307,7 @@ export ICU_RECLASSIFIED_PREPEND_SET_EMPTY=@ICU_RECLASSIFIED_PREPEND_SET_EMPTY@ export ICU_UCHAR_TYPE=@ICU_UCHAR_TYPE@ export INTROSPECTION_SCANNER=@INTROSPECTION_SCANNER@ export ILIB=@ILIB@ +export ILIB_FOR_BUILD=@ILIB_FOR_BUILD@ export INSTALLDIR=@INSTALLDIR@ export INSTALLDIRNAME=@INSTALLDIRNAME@ export INSTALL_NAME_TOOL=@INSTALL_NAME_TOOL@ diff --git a/configure.ac b/configure.ac index 6b7c4562db8e..6ae8f714e5fa 100644 --- a/configure.ac +++ b/configure.ac @@ -5006,14 +5006,14 @@ if test "$cross_compiling" = "yes"; then mv config_host/*.h ../config_build OLD_PATH=$PATH - . ./bin/get_config_variables CC CXX INSTDIR INSTROOT LIBO_BIN_FOLDER LIBO_LIB_FOLDER LIBO_URE_LIB_FOLDER LIBO_URE_MISC_FOLDER OS PATH SDKDIRNAME SYSTEM_LIBXML SYSTEM_LIBXSLT WORKDIR + . ./bin/get_config_variables CC CXX ILIB INSTDIR INSTROOT LIBO_BIN_FOLDER LIBO_LIB_FOLDER LIBO_URE_LIB_FOLDER LIBO_URE_MISC_FOLDER OS PATH SDKDIRNAME SYSTEM_LIBXML SYSTEM_LIBXSLT WORKDIR BUILD_PATH=$PATH PATH=$OLD_PATH line=`echo "LO_PATH_FOR_BUILD='${BUILD_PATH}'" | sed -e 's,/CONF-FOR-BUILD,,g'` echo "$line" >>build-config - for V in CC CXX LIBO_BIN_FOLDER LIBO_LIB_FOLDER LIBO_URE_LIB_FOLDER LIBO_URE_MISC_FOLDER OS SDKDIRNAME SYSTEM_LIBXML SYSTEM_LIBXSLT; do + for V in CC CXX ILIB LIBO_BIN_FOLDER LIBO_LIB_FOLDER LIBO_URE_LIB_FOLDER LIBO_URE_MISC_FOLDER OS SDKDIRNAME SYSTEM_LIBXML SYSTEM_LIBXSLT; do VV='$'$V VV=`eval "echo $VV"` if test -n "$VV"; then @@ -5065,6 +5065,8 @@ AC_SUBST(LIBO_URE_LIB_FOLDER_FOR_BUILD) AC_SUBST(LIBO_URE_MISC_FOLDER_FOR_BUILD) AC_SUBST(SDKDIRNAME_FOR_BUILD) AC_SUBST(WORKDIR_FOR_BUILD) +AC_SUBST(CC_FOR_BUILD) +AC_SUBST(CXX_FOR_BUILD) dnl =================================================================== dnl Check for syslog header @@ -13361,8 +13363,12 @@ if test "$build_os" = "cygwin"; then ILIB="$ILIB;$DOTNET_FRAMEWORK_HOME/Lib/um/$WIN_HOST_ARCH" fi - AC_SUBST(ILIB) + if test "$cross_compiling" != "yes"; then + ILIB_FOR_BUILD="$ILIB" + fi fi +AC_SUBST(ILIB) +AC_SUBST(ILIB_FOR_BUILD) # =================================================================== # Creating bigger shared library to link against diff --git a/external/gpgmepp/ExternalProject_gpgmepp.mk b/external/gpgmepp/ExternalProject_gpgmepp.mk index c2263413ee18..313f1e41be83 100644 --- a/external/gpgmepp/ExternalProject_gpgmepp.mk +++ b/external/gpgmepp/ExternalProject_gpgmepp.mk @@ -21,12 +21,11 @@ $(eval $(call gb_ExternalProject_use_externals,gpgmepp,\ )) ifeq ($(COM),MSC) -gb_ExternalProject_gpgmepp_host := $(if $(filter INTEL,$(CPUNAME)),i686-mingw32,x86_64-w64-mingw32) -gb_ExternalProject_gpgmepp_target := $(if $(filter INTEL,$(CPUNAME)),pe-i386,pe-x86-64) -$(call gb_ExternalProject_get_state_target,gpgmepp,build): $(call gb_Executable_get_target,cpp) +$(call gb_ExternalProject_get_state_target,gpgmepp,build): $(call gb_Executable_get_target_for_build,cpp) $(call gb_Trace_StartRange,gpgmepp,EXTERNAL) - $(call gb_ExternalProject_run,build,\ - autoreconf \ + $(call gb_ExternalProject_run,build, \ + $(gb_WIN_GPG_cross_setup_exports) \ + && autoreconf \ && ./configure \ --disable-shared \ --disable-languages \ @@ -38,8 +37,7 @@ $(call gb_ExternalProject_get_state_target,gpgmepp,build): $(call gb_Executable_ $(if $(ENABLE_OPTIMIZED), \ $(gb_COMPILEROPTFLAGS),$(gb_COMPILERNOOPTFLAGS)) \ $(if $(call gb_Module__symbols_enabled,gpgmepp),$(gb_DEBUGINFO_FLAGS))' \ - --host=$(gb_ExternalProject_gpgmepp_host) \ - RC='windres -O COFF --target=$(gb_ExternalProject_gpgmepp_target) --preprocessor='\''$(call gb_Executable_get_target,cpp) -+ -DRC_INVOKED -DWINAPI_FAMILY=0 $(SOLARINC)'\' \ + $(gb_WIN_GPG_platform_switches) \ MAKE=$(MAKE) \ && $(MAKE) \ ) diff --git a/external/libassuan/ExternalProject_libassuan.mk b/external/libassuan/ExternalProject_libassuan.mk index 565d38ff9a1c..e4e24aeac7fd 100644 --- a/external/libassuan/ExternalProject_libassuan.mk +++ b/external/libassuan/ExternalProject_libassuan.mk @@ -19,13 +19,13 @@ $(eval $(call gb_ExternalProject_use_externals,libassuan,\ libgpg-error \ )) + ifeq ($(COM),MSC) -gb_ExternalProject_libassuan_host := $(if $(filter INTEL,$(CPUNAME)),i686-mingw32,x86_64-w64-mingw32) -gb_ExternalProject_libassuan_target := $(if $(filter INTEL,$(CPUNAME)),pe-i386,pe-x86-64) -$(call gb_ExternalProject_get_state_target,libassuan,build): $(call gb_Executable_get_target,cpp) +$(call gb_ExternalProject_get_state_target,libassuan,build): $(call gb_Executable_get_target_for_build,cpp) $(call gb_Trace_StartRange,libassuan,EXTERNAL) $(call gb_ExternalProject_run,build,\ - autoreconf \ + $(gb_WIN_GPG_cross_setup_exports) \ + && autoreconf \ && ./configure \ --enable-static \ --disable-shared \ @@ -34,8 +34,7 @@ $(call gb_ExternalProject_get_state_target,libassuan,build): $(call gb_Executabl CXXFLAGS="$(CXXFLAGS)" \ GPG_ERROR_CFLAGS="$(GPG_ERROR_CFLAGS)" \ GPG_ERROR_LIBS="$(GPG_ERROR_LIBS)" \ - --host=$(gb_ExternalProject_libassuan_host) \ - RC='windres -O COFF --target=$(gb_ExternalProject_libassuan_target) --preprocessor='\''$(call gb_Executable_get_target,cpp) -+ -DRC_INVOKED -DWINAPI_FAMILY=0 $(SOLARINC)'\' \ + $(gb_WIN_GPG_platform_switches) \ MAKE=$(MAKE) \ && $(MAKE) \ ) diff --git a/external/libgpg-error/ExternalProject_libgpg-error.mk b/external/libgpg-error/ExternalProject_libgpg-error.mk index cf0b594dca24..736079c77aec 100644 --- a/external/libgpg-error/ExternalProject_libgpg-error.mk +++ b/external/libgpg-error/ExternalProject_libgpg-error.mk @@ -16,20 +16,18 @@ $(eval $(call gb_ExternalProject_register_targets,libgpg-error,\ $(eval $(call gb_ExternalProject_use_autoconf,libgpg-error,build)) ifeq ($(COM),MSC) -gb_ExternalProject_libgpg-error_host := $(if $(filter INTEL,$(CPUNAME)),i686-mingw32,x86_64-w64-mingw32) -gb_ExternalProject_libgpg-error_target := $(if $(filter INTEL,$(CPUNAME)),pe-i386,pe-x86-64) -$(call gb_ExternalProject_get_state_target,libgpg-error,build): $(call gb_Executable_get_target,cpp) +$(call gb_ExternalProject_get_state_target,libgpg-error,build): $(call gb_Executable_get_target_for_build,cpp) $(call gb_Trace_StartRange,libgpg-error,EXTERNAL) $(call gb_ExternalProject_run,build,\ - MAKE=$(MAKE) ./configure \ + $(gb_WIN_GPG_cross_setup_exports) \ + && MAKE=$(MAKE) ./configure \ --enable-static \ --disable-shared \ --disable-rpath \ --disable-languages \ --disable-doc \ --disable-tests \ - --host=$(gb_ExternalProject_libgpg-error_host) \ - RC='windres -O COFF --target=$(gb_ExternalProject_libgpg-error_target) --preprocessor='\''$(call gb_Executable_get_target,cpp) -+ -DRC_INVOKED -DWINAPI_FAMILY=0 $(SOLARINC)'\' \ + $(gb_WIN_GPG_platform_switches) \ && $(MAKE) \ ) $(call gb_Trace_EndRange,libgpg-error,EXTERNAL) diff --git a/solenv/clang-format/excludelist b/solenv/clang-format/excludelist index e78748adc6a8..ee51f6caf2a1 100644 --- a/solenv/clang-format/excludelist +++ b/solenv/clang-format/excludelist @@ -12573,8 +12573,6 @@ smoketest/libtest.cxx smoketest/smoketest.cxx solenv/bin/concat-deps.c solenv/gbuildtojson/gbuildtojson.cxx -solenv/gcc-wrappers/g++.cxx -solenv/gcc-wrappers/gcc.cxx solenv/gcc-wrappers/wrapper.cxx soltools/cpp/_cpp.c soltools/cpp/_eval.c diff --git a/solenv/gbuild/platform/com_MSC_class.mk b/solenv/gbuild/platform/com_MSC_class.mk index 996c5a4b06c5..c27fc0c95446 100644 --- a/solenv/gbuild/platform/com_MSC_class.mk +++ b/solenv/gbuild/platform/com_MSC_class.mk @@ -598,10 +598,10 @@ endef gb_AUTOCONF_WRAPPERS = \ REAL_CC="$(shell cygpath -w $(filter-out -%,$(CC)))" \ REAL_CC_FLAGS="$(filter -%,$(CC))" \ - CC="$(call gb_Executable_get_target_for_build,gcc-wrapper)" \ + CC="$(call gb_Executable_get_target_for_build,gcc-wrapper) $(if $(verbose),--wrapper-print-cmdline)" \ REAL_CXX="$(shell cygpath -w $(filter-out -%,$(CXX)))" \ REAL_CXX_FLAGS="$(filter -%,$(CXX))" \ - CXX="$(call gb_Executable_get_target_for_build,g++-wrapper)" \ + CXX="$(call gb_Executable_get_target_for_build,g++-wrapper) $(if $(verbose),--wrapper-print-cmdline)" \ LD="$(shell cygpath -w $(COMPATH)/bin/link.exe) -nologo" gb_ExternalProject_INCLUDE := \ diff --git a/solenv/gbuild/platform/com_MSC_defs.mk b/solenv/gbuild/platform/com_MSC_defs.mk index 05de2691a03e..5a02731bac7b 100644 --- a/solenv/gbuild/platform/com_MSC_defs.mk +++ b/solenv/gbuild/platform/com_MSC_defs.mk @@ -361,4 +361,12 @@ define gb_Helper_extend_ld_path $(gb_Helper_set_ld_path)';$(shell cygpath $(gb_MAKE_CYGPATH) $(1))' endef +# common macros to build GPG related libraries +# we explicitly have to replace cygwin with mingw32 for the host, but the build must stay cygwin, or cmd.exe processes will be spawned +gb_WIN_GPG_WINDRES_target := $(if $(filter INTEL,$(CPUNAME)),pe-i386,pe-x86-64) +gb_WIN_GPG_platform_switches := --build=$(BUILD_PLATFORM) --host=$(subst cygwin,mingw32,$(HOST_PLATFORM)) +gb_WIN_GPG_cross_setup_exports = export REAL_BUILD_CC="$(CC_FOR_BUILD)" \ + && export CC_FOR_BUILD="$(call gb_Executable_get_target_for_build,gcc-wrapper) $(if $(verbose),--wrapper-print-cmdline) --wrapper-env-prefix=REAL_BUILD_ $(SOLARINC) -L$(subst ;, -L,$(ILIB_FOR_BUILD))" \ + && export RC='windres -O COFF --target=$(gb_WIN_GPG_WINDRES_target) --preprocessor='\''$(call gb_Executable_get_target_for_build,cpp) -+ -DRC_INVOKED -DWINAPI_FAMILY=0 $(SOLARINC)'\' + # vim: set noet sw=4: diff --git a/solenv/gcc-wrappers/g++.cxx b/solenv/gcc-wrappers/g++.cxx index 626b1643590c..2f99d4606ac7 100644 --- a/solenv/gcc-wrappers/g++.cxx +++ b/solenv/gcc-wrappers/g++.cxx @@ -9,19 +9,21 @@ #include "wrapper.hxx" -int main(int argc, char *argv[]) { +int main(int argc, char* argv[]) +{ vector<string> rawargs(argv + 1, argv + argc); - string command=getexe("REAL_CXX"); - string flags=getexe("REAL_CXX_FLAGS", true); + string env_prefix; // defaults to REAL_ + bool verbose = false; + string args = processccargs(rawargs, env_prefix, verbose); - string args=flags.empty() ? string() : flags + " "; - args += processccargs(rawargs); + string command = getexe(env_prefix + "CXX"); + string flags = getexe(env_prefix + "CXX_FLAGS", true); + args.insert(0, flags.empty() ? string() : flags + " "); setupccenv(); - return startprocess(command,args); - + return startprocess(command, args, verbose); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/solenv/gcc-wrappers/gcc.cxx b/solenv/gcc-wrappers/gcc.cxx index f34c2dba8c99..8accb8216a11 100644 --- a/solenv/gcc-wrappers/gcc.cxx +++ b/solenv/gcc-wrappers/gcc.cxx @@ -9,19 +9,21 @@ #include "wrapper.hxx" -int main(int argc, char *argv[]) { +int main(int argc, char* argv[]) +{ vector<string> rawargs(argv + 1, argv + argc); - string command=getexe("REAL_CC"); - string flags=getexe("REAL_CC_FLAGS", true); + string env_prefix; // defaults to REAL_ + bool verbose = false; + string args = processccargs(rawargs, env_prefix, verbose); - string args=flags.empty() ? string() : flags + " "; - args += processccargs(rawargs); + string command = getexe(env_prefix + "CC"); + string flags = getexe(env_prefix + "CC_FLAGS", true); + args.insert(0, flags.empty() ? string() : flags + " "); setupccenv(); - return startprocess(command,args); - + return startprocess(command, args, verbose); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/solenv/gcc-wrappers/wrapper.cxx b/solenv/gcc-wrappers/wrapper.cxx index b156c89dc220..56936155fa47 100644 --- a/solenv/gcc-wrappers/wrapper.cxx +++ b/solenv/gcc-wrappers/wrapper.cxx @@ -82,7 +82,13 @@ void setupccenv() { } } -string processccargs(vector<string> rawargs) { +string processccargs(vector<string> rawargs, string &env_prefix, bool &verbose) +{ + // default env var prefix + env_prefix = "REAL_"; + verbose = false; + bool env_prefix_next_arg = false; + // suppress the msvc banner string args=" -nologo"; // TODO: should these options be enabled globally? @@ -101,6 +107,13 @@ string processccargs(vector<string> rawargs) { string linkargs(" -link -debug"); for(vector<string>::iterator i = rawargs.begin(); i != rawargs.end(); ++i) { + if (env_prefix_next_arg) + { + env_prefix = *i; + env_prefix_next_arg = false; + continue; + } + args.append(" "); if(*i == "-o") { // TODO: handle more than just exe output @@ -121,10 +134,15 @@ string processccargs(vector<string> rawargs) { linkargs.append(" -dll -out:"); linkargs.append(*i); } + else if (dot == string::npos) + { + args.append("-Fe"); + args.append(*i + ".exe"); + } else { cerr << "unknown -o argument - please adapt gcc-wrapper for \"" - << (*i) << "\""; + << (*i) << "\"" << endl; exit(1); } } @@ -159,14 +177,41 @@ string processccargs(vector<string> rawargs) { } else if(*i == "-Werror") args.append("-WX"); + else if (*i == "--wrapper-print-cmdline") + verbose = true; else - args.append(*i); + { + size_t pos = i->find("="); + if (0 == i->compare(0, pos, "--wrapper-env-prefix")) + { + if (pos == string::npos) + env_prefix_next_arg = true; + else if (pos + 1 == i->length()) + { + // bailout - missing arg + env_prefix_next_arg = true; + break; + } + else + env_prefix = i->substr(pos + 1); + } + else + args.append(*i); + } } + + if (env_prefix_next_arg) + { + cerr << "wrapper-env-prefix needs an argument!" << endl; + exit(1); + } + args.append(linkargs); return args; } -int startprocess(string command, string args) { +int startprocess(string command, string args, bool verbose) +{ STARTUPINFO si; PROCESS_INFORMATION pi; SECURITY_ATTRIBUTES sa; @@ -200,7 +245,8 @@ int startprocess(string command, string args) { auto cmdline = "\"" + command + "\" " + args; - //cerr << "CMD= " << command << " " << args << endl; + if (verbose) + cerr << "CMD= " << command << " " << args << endl; // Commandline may be modified by CreateProcess char* cmdlineBuf=_strdup(cmdline.c_str()); diff --git a/solenv/gcc-wrappers/wrapper.hxx b/solenv/gcc-wrappers/wrapper.hxx index 789bc9280267..208d9b82c449 100644 --- a/solenv/gcc-wrappers/wrapper.hxx +++ b/solenv/gcc-wrappers/wrapper.hxx @@ -20,9 +20,9 @@ string getexe(string exename, bool maybeempty = false); void setupccenv(); -string processccargs(vector<string> rawargs); +string processccargs(vector<string> rawargs, string& env_prefix, bool& verbose); -int startprocess(string command, string args); +int startprocess(string command, string args, bool verbose); #endif // INCLUDED_SOLENV_GCC_WRAPPERS_WRAPPER_HXX |