From 1900351515ae740a93000dd4bfbb2431a7e864fa Mon Sep 17 00:00:00 2001 From: Alexey Brodkin Date: Sun, 12 Jul 2020 16:29:26 +0300 Subject: [PATCH] Fix building on CentOS 7.x With C++14 the following error happens on CentOS 7.x: ================================== $ clang++ -std=c++1y -Wall -Wextra -pedantic -Wno-missing-field-initializers \ -I. -O2 -DOSXCROSS_VERSION="\"1.2\"" -DOSXCROSS_TARGET="\"darwin14\"" \ -DOSXCROSS_OSX_VERSION_MIN="\"10.6\"" -DOSXCROSS_LINKER_VERSION="\"530\"" \ -DOSXCROSS_LIBLTO_PATH="\"/usr/lib64/llvm\"" \ -DOSXCROSS_BUILD_DIR="\"/osxcross/build\"" -isystem quirks/include \ -c -o target.o target.cpp In file included from target.cpp:24: In file included from /usr/bin/../lib/gcc/x86_64-redhat-linux/4.8.5/../../../../include/c++/4.8.5/iostream:39: In file included from /usr/bin/../lib/gcc/x86_64-redhat-linux/4.8.5/../../../../include/c++/4.8.5/ostream:38: In file included from /usr/bin/../lib/gcc/x86_64-redhat-linux/4.8.5/../../../../include/c++/4.8.5/ios:42: In file included from /usr/bin/../lib/gcc/x86_64-redhat-linux/4.8.5/../../../../include/c++/4.8.5/bits/ios_base.h:41: In file included from /usr/bin/../lib/gcc/x86_64-redhat-linux/4.8.5/../../../../include/c++/4.8.5/bits/locale_classes.h:40: In file included from /usr/bin/../lib/gcc/x86_64-redhat-linux/4.8.5/../../../../include/c++/4.8.5/string:52: In file included from /usr/bin/../lib/gcc/x86_64-redhat-linux/4.8.5/../../../../include/c++/4.8.5/bits/basic_string.h:2815: In file included from /usr/bin/../lib/gcc/x86_64-redhat-linux/4.8.5/../../../../include/c++/4.8.5/ext/string_conversions.h:43: /usr/bin/../lib/gcc/x86_64-redhat-linux/4.8.5/../../../../include/c++/4.8.5/cstdio:120:11: error: no member named 'gets' in the global namespace using ::gets; ~~^ 1 error generated. ================================== That's a known issue with older C++ headers, see https://bugs.llvm.org/show_bug.cgi?id=30277 With C++11 we then get another problem: ================================== $ clang++ -std=c++0x -Wall -Wextra -pedantic -Wno-missing-field-initializers \ -I. -O2 -DOSXCROSS_VERSION="\"1.2\"" -DOSXCROSS_TARGET="\"darwin14\"" \ -DOSXCROSS_OSX_VERSION_MIN="\"10.6\"" -DOSXCROSS_LINKER_VERSION="\"530\"" \ -DOSXCROSS_LIBLTO_PATH="\"/usr/lib64/llvm\"" \ -DOSXCROSS_BUILD_DIR="\"/osxcross/build\"" -isystem quirks/include \ -c -o programs/osxcross-conf.o programs/osxcross-conf.cpp programs/osxcross-conf.cpp:50:49: error: 'auto' not allowed in lambda parameter static auto print = [](const char *var, const auto &val) { ^~~~ programs/osxcross-conf.cpp:50:55: warning: unused parameter 'val' [-Wunused-parameter] static auto print = [](const char *var, const auto &val) { ^ programs/osxcross-conf.cpp:54:3: error: no matching function for call to object of type '' print("VERSION", getOSXCrossVersion()); ================================== That last issue requires a move from a lambda to more ugly template solution. But in the end we get all built! --- wrapper/Makefile | 2 +- wrapper/programs/osxcross-conf.cpp | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/wrapper/Makefile b/wrapper/Makefile index 0b0c87b..a7921bd 100644 --- a/wrapper/Makefile +++ b/wrapper/Makefile @@ -9,7 +9,7 @@ LINKER_VERSION ?= 134.9 LIBLTO_PATH ?= ADDITIONAL_CXXFLAGS ?= -override CXXFLAGS=-std=c++1y -Wall -Wextra -pedantic +override CXXFLAGS=-std=c++0x -Wall -Wextra override CXXFLAGS+=-Wno-missing-field-initializers override CXXFLAGS+=-I. -O$(OPTIMIZE) diff --git a/wrapper/programs/osxcross-conf.cpp b/wrapper/programs/osxcross-conf.cpp index 7692b63..1adcabf 100644 --- a/wrapper/programs/osxcross-conf.cpp +++ b/wrapper/programs/osxcross-conf.cpp @@ -27,6 +27,12 @@ using namespace target; namespace program { namespace osxcross { +template + +void print(const char *var, const A &val) { + std::cout << "export OSXCROSS_" << var << "=" << val << std::endl; +}; + int conf(Target &target) { std::string SDKPath; OSVersion OSXVersionMin = getDefaultMinTarget(); @@ -47,10 +53,6 @@ int conf(Target &target) { if (!ltopath) ltopath = ""; - auto print = [](const char *var, const auto &val) { - std::cout << "export OSXCROSS_" << var << "=" << val << std::endl; - }; - print("VERSION", getOSXCrossVersion()); print("OSX_VERSION_MIN", OSXVersionMin.shortStr()); print("TARGET", getDefaultTarget());