Opened 11 months ago
Closed 11 months ago
#68920 closed defect (fixed)
boost176 @1.76.0_10 broken after rev-update for new version of icu (on older macOS?)
Reported by: | snowflake (Dave Evans) | Owned by: | michaelld (Michael Dickens) |
---|---|---|---|
Priority: | Normal | Milestone: | |
Component: | ports | Version: | |
Keywords: | Cc: | tehcog (tehcog) | |
Port: | boost176 |
Description (last modified by snowflake (Dave Evans))
Lots of ports have received a rev-update after the new version of icu. Most seem to be building OK, but boost176 has some errors, at least on my macOS 10.11.6
Here's one error
...failed darwin.compile.c++ bin.v2/libs/log/build/darwin-16.0.6/release/threadapi-pthread/threading-multi/visibility-hidden/core.o... darwin.compile.c++ bin.v2/libs/log/build/darwin-16.0.6/release/threadapi-pthread/threading-multi/visibility-hidden/severity_level.o "/opt/local/bin/clang++-mp-16" -ftemplate-depth-1024 -fvisibility-inlines-hidden -Os -std=gnu++11 -stdlib=libc++ -arch x86_64 -stdlib=libc++ -fPIC -m64 -O3 -Wall -fvisibility=hidden -dynamic -gdwarf-2 -fexceptions -Wno-inline -DBOOST_ALL_NO_LIB=1 -DBOOST_ATOMIC_DYN_LINK=1 -DBOOST_CHRONO_DYN_LINK=1 -DBOOST_FILESYSTEM_DYN_LINK=1 -DBOOST_HAS_ICU=1 -DBOOST_LOG_BUILDING_THE_LIB=1 -DBOOST_LOG_DLL -DBOOST_LOG_USE_NATIVE_SYSLOG -DBOOST_LOG_USE_SSSE3 -DBOOST_LOG_WITHOUT_DEBUG_OUTPUT -DBOOST_LOG_WITHOUT_EVENT_LOG -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -DBOOST_THREAD_BUILD_DLL=1 -DBOOST_THREAD_DONT_USE_CHRONO=1 -DBOOST_THREAD_POSIX -DBOOST_THREAD_USE_DLL=1 -DNDEBUG -D__STDC_CONSTANT_MACROS -I"." -I"/opt/local/include" -I"libs/log/src" -c -o "bin.v2/libs/log/build/darwin-16.0.6/release/threadapi-pthread/threading-multi/visibility-hidden/severity_level.o" "libs/log/src/severity_level.cpp" In file included from libs/log/src/severity_level.cpp:18: In file included from ./boost/log/sources/severity_feature.hpp:31: In file included from ./boost/log/utility/strictest_lock.hpp:19: In file included from ./boost/mpl/integral_c.hpp:32: ./boost/mpl/aux_/integral_wrapper.hpp:73:31: error: integer value -1 is outside the valid range of values [0, 3] for this enumeration type [-Wenum-constexpr-conversion] typedef AUX_WRAPPER_INST( BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (value - 1)) ) prior; ^ ./boost/mpl/aux_/static_cast.hpp:24:47: note: expanded from macro 'BOOST_MPL_AUX_STATIC_CAST' # define BOOST_MPL_AUX_STATIC_CAST(T, expr) static_cast<T>(expr) ^ 1 error generated.
Change History (13)
comment:1 Changed 11 months ago by snowflake (Dave Evans)
Description: | modified (diff) |
---|
comment:2 Changed 11 months ago by kencu (Ken)
comment:3 Changed 11 months ago by snowflake (Dave Evans)
Building with the clang15 variant works
sudo port -s upgrade --enforce-variants boost176 +no_single +no_static +python311 +clang15
comment:4 Changed 11 months ago by tehcog (tehcog)
broken on mavericks, but builds with:
sudo port upgrade boost176 configure.compiler=macports-clang-15
comment:5 Changed 11 months ago by tehcog (tehcog)
Cc: | tehcog added |
---|
comment:7 Changed 11 months ago by kencu (Ken)
someone thinks this is a fix for this, it seems:
https://github.com/ecatmur/mpl/commit/8499ae7e4ff0cf798367ebe6ea9fb991aa43db6c
worth trying
comment:8 Changed 11 months ago by RobK88
Same problem on Lion and Mtn Lion. But using clang-15 is the workaround.
sudo port upgrade boost176 configure.compiler=macports-clang-15
comment:9 Changed 11 months ago by erikbs
Another workaround is to edit this line in Portfile:
configure.cxxflags-append -std=gnu++11
so that it reads
configure.cxxflags-append -std=gnu++11 -Wno-enum-constexpr-conversion
The constexpr enum warning is now a hard error, but according to the build logs, it was only a soft warning in the LLVM/Clang version on which the latest Xcode/AppleClang version is based on (a 16.0.0 pre-release maybe?). It was made a hard error because doing this is undefined behaviour. Disabling the warning is therefore bad, but is no worse than using a compiler version that does not have this check at all (Clang 15). I suggest suppressing the warning/error instead of blacklisting Clang 16.
comment:10 follow-up: 11 Changed 11 months ago by kencu (Ken)
If the fix in https://trac.macports.org/ticket/68920#comment:7 works that would be desirable...
We could supress the warning if -Wno-enum-constexpr-conversion
accepted by the compilers macports supports that could be used here.
comment:11 Changed 11 months ago by erikbs
Replying to kencu:
If the fix in https://trac.macports.org/ticket/68920#comment:7 works that would be desirable...
We could supress the warning if
-Wno-enum-constexpr-conversion
accepted by the compilers macports supports that could be used here.
I agree. I forgot to take into consideration that adding this flag only for some compilers / compiler versions adds complexity to the Portfile. I will try the fix you mentioned on 10.9 once my battery has charged a bit more and report back.
comment:12 Changed 11 months ago by erikbs
It was C++17 that introduced the requirement that no constexpr enum be set to a value outside its range, but Clang seems to enable this check regardless of C++ standard. The patch thus had no effect in itself. However, it works perfectly if I up the C++ standard from 2011 to 2017, but that raises another question: do we want that? I see that the Portfile sets compiler.cxx_standard
twice, both times to 2011 (in addition, a compiler flag for using the GNU dialect is set once). There is a comment explaining that Boost does not have such a requirement, but that requiring C++11 in MacPorts allows us to build Boost successfully on more platforms.
These are the changes I did to implement the suggestion in comment 7:
-
devel/boost176/Portfile
38 38 distname boost_${distver} 39 39 use_bzip2 yes 40 40 41 compiler.cxx_standard 201 141 compiler.cxx_standard 2017 42 42 compiler.blacklist-append {clang < 1000} 43 43 44 44 depends_lib-append \ … … 144 144 # Further: Building Boost using C++11 compliance does not seem to then 145 145 # require ports depending on Boost to also require C++11 compliance, 146 146 # and requiring it does make such building easier for those ports. 147 configure.cxxflags-append -std=gnu++1 1148 compiler.cxx_standard 201 1147 configure.cxxflags-append -std=gnu++17 148 compiler.cxx_standard 2017 149 149 150 150 # This flag fixes the return type of unsetenv(3) 151 151 # See: https://trac.macports.org/ticket/63121
-
devel/boost176/files/patch-boost-clang16-cpp17-compat.diff
83 83 84 84 // Metafunction: 85 85 // 86 --- boost/mpl/aux_/integral_wrapper.hpp.orig 87 +++ boost/mpl/aux_/integral_wrapper.hpp 88 @@ -56,7 +56,8 @@ struct AUX_WRAPPER_NAME 89 // have to #ifdef here: some compilers don't like the 'N + 1' form (MSVC), 90 // while some other don't like 'value + 1' (Borland), and some don't like 91 // either 92 -#if BOOST_WORKAROUND(__EDG_VERSION__, <= 243) 93 +#if BOOST_WORKAROUND(__EDG_VERSION__, <= 243) \ 94 + || __cplusplus >= 201703L 95 private: 96 BOOST_STATIC_CONSTANT(AUX_WRAPPER_VALUE_TYPE, next_value = BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (N + 1))); 97 BOOST_STATIC_CONSTANT(AUX_WRAPPER_VALUE_TYPE, prior_value = BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (N - 1)));
(The patch hunk I added is missing timestamps for the files, I copied in the diff from GitHub and added the file name lines instead of running diff -u
locally. It works anyway.)
What I do not like about the above solution is that it would require introducing a C++ standard requirement that is much higher than Boost actually needs. One option is enabling C++17 only for compilers that support it (Clang 5 and later) or for compilers affected by the constexpr enum thing (Clang 16 and later), but at the cost of extra complexity in the Portfile. Another solution is to patch in a check for __clang_major__ >= 16
instead of __cplusplus >= 201703L
. That would eliminate the need for raising the C++ standard requirement (and even changing the Portfile at all). It is also clean and safe, so in my opinion this is actually the best solution. It reduces the diff to:
-
devel/boost176/files/patch-boost-clang16-cpp17-compat.diff
83 83 84 84 // Metafunction: 85 85 // 86 --- boost/mpl/aux_/integral_wrapper.hpp.orig 87 +++ boost/mpl/aux_/integral_wrapper.hpp 88 @@ -56,7 +56,8 @@ struct AUX_WRAPPER_NAME 89 // have to #ifdef here: some compilers don't like the 'N + 1' form (MSVC), 90 // while some other don't like 'value + 1' (Borland), and some don't like 91 // either 92 -#if BOOST_WORKAROUND(__EDG_VERSION__, <= 243) 93 +#if BOOST_WORKAROUND(__EDG_VERSION__, <= 243) \ 94 + || __clang_major__ >= 16 95 private: 96 BOOST_STATIC_CONSTANT(AUX_WRAPPER_VALUE_TYPE, next_value = BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (N + 1))); 97 BOOST_STATIC_CONSTANT(AUX_WRAPPER_VALUE_TYPE, prior_value = BOOST_MPL_AUX_STATIC_CAST(AUX_WRAPPER_VALUE_TYPE, (N - 1)));
I verified that it works on my system, so I created a pull request: https://github.com/macports/macports-ports/pull/21839
comment:13 Changed 11 months ago by erikbs
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
might be because it’s rebuilding now with the stricter clang-16
if so, an older clang could be forced via blacklisting.
or better, newer boost versions have probably fixed whatever the issue is, and that fix might be backported