cmake-utils.eclass: Split multi-arg CC/CXX/FC correctly, #542530
authorMichał Górny <mgorny@gentoo.org>
Fri, 2 Dec 2016 10:43:16 +0000 (11:43 +0100)
committerMichał Górny <mgorny@gentoo.org>
Thu, 8 Dec 2016 08:00:17 +0000 (09:00 +0100)
Split multi-argument CC/CXX/FC into a CMake array consisting of one
element containing the compiler path (name) and the other containing all
command-line options, space-separated. This is how CMake splits
the environment variables CC/CXX/FC internally.

The alternative would be to set CC/CXX/FC directly, and let CMake handle
the splitting. However, changing that had unforeseen consequences like
assembler not being set correctly (#601292) which in turn was impossible
to set via environment variables due to bugs in CMake.

Therefore, splitting the values into CMAKE_*_COMPILER correctly seems
the simplest and safest way forward, at least until we can rely on fixed
CMake versions being sufficiently deployed.

eclass/cmake-utils.eclass

index f2b210392682e9f91aca82c4e304ca4a6070313a..c53666e2c0fa1d4b51976725fe18c35a22d19c8b 100644 (file)
@@ -523,11 +523,18 @@ enable_cmake-utils_src_configure() {
                SET (CMAKE_Fortran_COMPILE_OBJECT "<CMAKE_Fortran_COMPILER> <DEFINES> ${includes} ${FCFLAGS} <FLAGS> -o <OBJECT> -c <SOURCE>" CACHE STRING "Fortran compile command" FORCE)
        _EOF_
 
+       local myCC=$(tc-getCC) myCXX=$(tc-getCXX) myFC=$(tc-getFC)
+
+       # !!! IMPORTANT NOTE !!!
+       # Single slash below is intentional. CMake is weird and wants the
+       # CMAKE_*_VARIABLES split into two elements: the first one with
+       # compiler path, and the second one with all command-line options,
+       # space separated.
        local toolchain_file=${BUILD_DIR}/gentoo_toolchain.cmake
        cat > ${toolchain_file} <<- _EOF_ || die
-               SET (CMAKE_C_COMPILER $(tc-getCC))
-               SET (CMAKE_CXX_COMPILER $(tc-getCXX))
-               SET (CMAKE_Fortran_COMPILER $(tc-getFC))
+               SET (CMAKE_C_COMPILER "${myCC/ /;}")
+               SET (CMAKE_CXX_COMPILER "${myCXX/ /;}")
+               SET (CMAKE_Fortran_COMPILER "${myFC/ /;}")
                SET (CMAKE_AR $(type -P $(tc-getAR)) CACHE FILEPATH "Archive manager" FORCE)
                SET (CMAKE_RANLIB $(type -P $(tc-getRANLIB)) CACHE FILEPATH "Archive index generator" FORCE)
        _EOF_