#48331: x265 fails to install due to CMAKE_CXX_COMPILER_ID being unset -------------------------+------------------------- Reporter: jeremyhu@… | Owner: michaelld@… Type: defect | Status: new Priority: Normal | Milestone: Component: ports | Version: 2.3.3 Resolution: | Keywords: Port: cmake | -------------------------+------------------------- Comment (by ryandesign@…): I have reported this problem to the [http://public.kitware.com/pipermail /cmake-developers/2015-September/026586.html cmake-developers mailing list]. Reproducing the relevant parts of my message here:
I found that in CMakeDetermineCompilerId.cmake, cmake compiles a test program (CMAKE_DETERMINE_COMPILER_ID_BUILD) which defines certain strings that describe the compiler, and then examines the strings in the compiled a.out file (CMAKE_DETERMINE_COMPILER_ID_CHECK). If the file contains more than one "INFO:compiler[...]" string, cmake assumes something went wrong and sets COMPILER_ID_TWICE to 1 which causes the compiler id to be forgotten.
The problem is that when building universal, the a.out file produced by the test will contain multiple copies of the strings -- once for each architecture. What the compiler does for you when you use multiple -arch flags is to compile the file separately, once for each architecture, then glue the separate files together into a single file (using the lipo program), so naturally such a file will contain multiple copies of any strings. This is not a bug; this is how universal binaries work. The bug is that cmake considers this valid condition to be erroneous.
Here is an example of the duplicated strings:
{{{ $ lipo -info build/CMakeFiles/3.3.2/CompilerIdC/a.out Architectures in the fat file: work/build/CMakeFiles/3.3.2/CompilerIdC/a.out are: x86_64 i386 $ strings -arch all build/CMakeFiles/3.3.2/CompilerIdC/a.out INFO:compiler[AppleClang] INFO:platform[Darwin] INFO:arch[] INFO:compiler_version[00000007.00000000.00000000.07000072] INFO:compiler[AppleClang] INFO:platform[Darwin] INFO:arch[] INFO:compiler_version[00000007.00000000.00000000.07000072] }}}
(I know cmake uses its internal FILE(STRINGS) command, not the strings program, but I presume they are similar.)
I was able to get cmake to correctly identify the compilers even when building universal by simply removing the COMPILER_ID_TWICE stuff from CMakeDetermineCompilerId.cmake, but perhaps you want something more elegant that verifies that if there are multiple definitions of a particular info line, all the definitions are the same.
Before making [attachment:cmake.diff such a change] to the cmake port, I'll wait and see if the developers have a better suggestion. -- Ticket URL: <https://trac.macports.org/ticket/48331#comment:5> MacPorts <https://www.macports.org/> Ports system for OS X