[CMake] ExternalProject_Add() macro does not set CMAKE_COMPILER_IS_GNUCXX
fkillus
fkillus at googlemail.com
Thu Jan 21 09:27:10 EST 2016
Thanks for clarifying that external projects are not aware of the project
they are embedded in.
The CMAKE_COMPILER_IS_GNUCXX variable should be set automatically by CMake
as far
as I understand it (see https://cmake.org/Wiki/CMake_Useful_Variables).
I narrowed down the problem by creating a minimal setup which still
reproduces the issue.
In this case the super project is simply a wrapper around an external dummy
project.
external/CMakeLists.txt:
cmake_minimum_required( VERSION 3.4 )
project( external )
message( "External - CMAKE_COMPILER_IS_GNUCXX: "
${CMAKE_COMPILER_IS_GNUCXX} )
message( "External - CMAKE_CXX_COMPILER_ID: " ${CMAKE_CXX_COMPILER_ID} )
message( "External - CMAKE_CXX_FLAGS: " ${CMAKE_CXX_FLAGS} )
super/CMakeLists.txt:
cmake_minimum_required( VERSION 3.4 )
project( super )
message( "Super - CMAKE_COMPILER_IS_GNUCXX: " ${CMAKE_COMPILER_IS_GNUCXX}
)
message( "Super - CMAKE_CXX_COMPILER_ID: " ${CMAKE_CXX_COMPILER_ID} )
message( "Super - CMAKE_CXX_FLAGS: " ${CMAKE_CXX_FLAGS} )
include( ExternalProject )
ExternalProject_Add(
external
DOWNLOAD_COMMAND ""
SOURCE_DIR ${CMAKE_SOURCE_DIR}/../external
CMAKE_ARGS
-DCMAKE_CXX_FLAGS="-march=native"
INSTALL_COMMAND ""
)
The problem occurs when the CMAKE_CXX_FLAGS variable is set inside the
ExternalProject_Add
command using quotes (i.e. "-march=native" in this example). The output
obtained when configuring
the super project with 'cmake ../super' is:
-- The C compiler identification is GNU 5.2.0
-- The CXX compiler identification is GNU 5.2.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
Super - CMAKE_COMPILER_IS_GNUCXX: 1
Super - CMAKE_CXX_COMPILER_ID: GNU
Super - CMAKE_CXX_FLAGS:
-- Configuring done
-- Generating done
Afterwards building with 'make' results in:
[ 12%] Creating directories for 'external'
[ 25%] No download step for 'external'
[ 37%] No patch step for 'external'
[ 50%] No update step for 'external'
[ 62%] Performing configure step for 'external'
-- The C compiler identification is GNU 5.2.0
-- The CXX compiler identification is unknown
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
External - CMAKE_COMPILER_IS_GNUCXX:
External - CMAKE_CXX_COMPILER_ID:
External - CMAKE_CXX_FLAGS: "-march=native"
-- Configuring done
-- Generating done
This shows the compiler is not correctly identified for the external
project. Directly configuring
the external project with 'cmake -DCMAKE_CXX_FLAGS="-march=native"
../external' works though:
-- The C compiler identification is GNU 5.2.0
-- The CXX compiler identification is GNU 5.2.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
External - CMAKE_COMPILER_IS_GNUCXX: 1
External - CMAKE_CXX_COMPILER_ID: GNU
External - CMAKE_CXX_FLAGS: -march=native
-- Configuring done
-- Generating done
It also works if the quotations marks in the super project listfile are
removed. I.e. changing
CMAKE_ARGS
-DCMAKE_CXX_FLAGS="-march=native"
to
CMAKE_ARGS
-DCMAKE_CXX_FLAGS=-march=native
The question is now, is it still possible to add mutiple compile flags if
one cannot use quotation marks?
On Wed, Jan 20, 2016 at 6:58 PM, Nicholas Braden <nicholas11braden at gmail.com
> wrote:
> Where/how is that variable normally set? External projects have no
> awareness of the project they are in, they just run CMake as usual the
> same way you would. If the variable is normally set by CMake itself,
> make sure that your containing project and the external project both
> find the same compiler. (They each do their own automatic search for
> compilers)
>
> On Wed, Jan 20, 2016 at 11:41 AM, fkillus via CMake <cmake at cmake.org>
> wrote:
> > I have been trying to compile Ogre [1] as external dependency with
> > ExternalProject_Add(). In theory this should be straightforward since
> Ogre
> > itself also uses CMake as buildsystem. However, in the process I
> encountered
> > the following problem:
> >
> > Ogre checks the value of the CMAKE_COMPILER_IS_GNUCXX variable in some
> > places (e.g. [2]). I am running Linux and compiling with g++ and
> everything
> > works fine if I manually configure Ogre with cmake or cmake-gui.
> > Unfortunately, after wrapping everything inside ExternalProject_Add(),
> the
> > CMAK_COMPILER_IS_GNUCXX variable is no longer being set correctly.
> >
> > A simple workaround is to manually set this variable, i.e.:
> >
> > ExternalProject_Add(
> > ogre
> > URL https://bitbucket.org/sinbad/ogre/get/v1-9-0.zip
> > CMAKE_ARGS
> > -DCMAKE_INSTALL_PREFIX=${DEPENDENCIES_OUTPUT_DIR}
> > -DCMAKE_COMPILER_IS_GNUCXX=${CMAKE_COMPILER_IS_GNUCXX} #
> workaround
> > )
> >
> > This works, but I'm uncertain if this should be necessary. Is this a bug
> or
> > a feature?
> >
> >
> > [1] https://bitbucket.org/sinbad/ogre
> > [2]
> >
> https://bitbucket.org/sinbad/ogre/src/0d580c7216abe27fafe41cb43e31d8ed86ded591/CMake/Utils/OgreConfigTargets.cmake?at=default&fileviewer=file-view-default#OgreConfigTargets.cmake-277
> >
> > --
> >
> > Powered by www.kitware.com
> >
> > Please keep messages on-topic and check the CMake FAQ at:
> > http://www.cmake.org/Wiki/CMake_FAQ
> >
> > Kitware offers various services to support the CMake community. For more
> > information on each offering, please visit:
> >
> > CMake Support: http://cmake.org/cmake/help/support.html
> > CMake Consulting: http://cmake.org/cmake/help/consulting.html
> > CMake Training Courses: http://cmake.org/cmake/help/training.html
> >
> > Visit other Kitware open-source projects at
> > http://www.kitware.com/opensource/opensource.html
> >
> > Follow this link to subscribe/unsubscribe:
> > http://public.kitware.com/mailman/listinfo/cmake
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20160121/afa7d886/attachment-0001.html>
More information about the CMake
mailing list