summaryrefslogtreecommitdiff
path: root/solenv
diff options
context:
space:
mode:
authorJan-Marek Glogowski <glogow@fbihome.de>2020-07-14 23:06:03 +0200
committerJan-Marek Glogowski <glogow@fbihome.de>2020-09-11 18:43:48 +0200
commit4108665b63ab432732b8b351568c255d872cc3ff (patch)
tree79c890b3d999e6e6bfd631b8df72ae18947719aa /solenv
parent63972e79bbb9ea9654e755381641052632b0402c (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>
Diffstat (limited to 'solenv')
-rw-r--r--solenv/clang-format/excludelist2
-rw-r--r--solenv/gbuild/platform/com_MSC_class.mk4
-rw-r--r--solenv/gbuild/platform/com_MSC_defs.mk8
-rw-r--r--solenv/gcc-wrappers/g++.cxx16
-rw-r--r--solenv/gcc-wrappers/gcc.cxx16
-rw-r--r--solenv/gcc-wrappers/wrapper.cxx56
-rw-r--r--solenv/gcc-wrappers/wrapper.hxx4
7 files changed, 81 insertions, 25 deletions
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