[CMake] Relaying all command line arguments from SuperBuild to ExternalProject_Add

Saad Khattak saadrustam at gmail.com
Wed Jan 31 22:51:14 EST 2018


Thank you Don, that was it. Querying and storing the args before a call to
'project' and your loop and your conditional were the key.

On Wed, Jan 31, 2018 at 10:14 PM Don Hinton <hintonda at gmail.com> wrote:

> Hi Saad:
>
> On Wed, Jan 31, 2018 at 6:47 PM, Saad Khattak <saadrustam at gmail.com>
> wrote:
>
>> Thanks J. I could use that to add preprocessor definitions.
>>
>> However, my question was how I could forward 'all' the command line
>> options that the user uses to generate the SuperBuild project. Suppose I
>> somehow managed to capture all the command line arguments which can include
>> variables specific to CMake and/or projects (i.e. nothing to do with
>> preprocessor definitions) in a variable called CL_CMAKE_ARGS.
>>
>
> The example you are using is close, but not quite correct.
>
> You need to harvest the comandline arguments before calling `project()`,
> just note that it won't work if CMakeCache.txt already exists.
>
> Some CMAKE variables will still have HELPSTRINGS, even if passed via the
> command line, and users can also set a random or blank HELPSTRING if they
> use a cache file.  To overcome these issues, just harvest all cache
> variables and exclude the invariant ones, e.g., CMAKE_COMMAND, etc., e.g.:
>
> $ cat ../CMakeLists.txt
> cmake_minimum_required(VERSION 3.5)
>
> message(STATUS "*** All CACHE_VARIABLES ***")
> get_cmake_property(vars CACHE_VARIABLES)
> foreach(var ${vars})
>   get_property(currentHelpString CACHE "${var}" PROPERTY HELPSTRING)
>         message("${var} = [${${var}}]  --  ${currentHelpString}")
> endforeach()
>
> project(xxx)
> message(STATUS "project() called.")
>
> message(STATUS "*** Only CACHE_VARIABLES with HELPSTRING empty or matching
> \"No help,...\" ***")
> get_cmake_property(vars CACHE_VARIABLES)
> foreach(var ${vars})
>   get_property(currentHelpString CACHE "${var}" PROPERTY HELPSTRING)
>         if("${currentHelpString}" MATCHES "No help, variable specified on
> the command line." OR "${currentHelpString}" STREQUAL "")
>                 message("${var} = [${${var}}]  --  ${currentHelpString}")
>         endif()
> endforeach()
>
> $ rm -rf * && cmake -DFOO=1 -DCMAKE_BUILD_TYPE=Release -GNinja ..
> -- *** All CACHE_VARIABLES ***
> CMAKE_BUILD_TYPE = [Release]  --  No help, variable specified on the
> command line.
> CMAKE_COMMAND = [/opt/local/bin/cmake]  --  Path to CMake executable.
> CMAKE_CPACK_COMMAND = [/opt/local/bin/cpack]  --  Path to cpack program
> executable.
> CMAKE_CTEST_COMMAND = [/opt/local/bin/ctest]  --  Path to ctest program
> executable.
> CMAKE_EXTRA_GENERATOR = []  --  Name of external makefile project
> generator.
> CMAKE_GENERATOR = [Ninja]  --  Name of generator.
> CMAKE_GENERATOR_PLATFORM = []  --  Name of generator platform.
> CMAKE_GENERATOR_TOOLSET = []  --  Name of generator toolset.
> CMAKE_HOME_DIRECTORY = [/Users/dhinton/cmake_test]  --  Source directory
> with the top level CMakeLists.txt file for this project
> CMAKE_ROOT = [/opt/local/share/cmake-3.10]  --  Path to CMake installation.
> FOO = [1]  --  No help, variable specified on the command line.
> -- The C compiler identification is AppleClang 9.0.0.9000039
> -- The CXX compiler identification is AppleClang 9.0.0.9000039
> -- Check for working C compiler:
> /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc
> -- Check for working C compiler:
> /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/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:
> /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++
> -- Check for working CXX compiler:
> /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++
> -- works
> -- Detecting CXX compiler ABI info
> -- Detecting CXX compiler ABI info - done
> -- Detecting CXX compile features
> -- Detecting CXX compile features - done
> -- project() called.
> -- *** Only CACHE_VARIABLES with HELPSTRING empty or matching "No
> help,..." ***
> FOO = [1]  --  No help, variable specified on the command line.
> -- Configuring done
> -- Generating done
> -- Build files have been written to: /Users/dhinton/cmake_test/build
>
> hth...
> don
>
>
>> If I do message(${CL_CMAKE_ARGS}) I get:
>>
>>  -DMY_OPTION_ONE=ON -DMY_OPTION_TWO=OFF -DSOME_VAR_1="Foo"
>>
>> Now, when I try something like this:
>>
>> ExternalProject_Add(target
>> ...
>> CMAKE_ARGS ${CL_CMAKE_ARGS}
>> ...
>> )
>>
>> One would expect CL_CMAKE_ARGS to be expanded and the arguments passed to
>> the ExternalProject_Add function, but that is not the case. I also tried:
>>
>> ExternalProject_Add(target
>> ...
>> CMAKE_ARGS "${CL_CMAKE_ARGS}"
>> ...
>> )
>>
>> Neither works. It seems like a bug in CMake but I wanted to confirm that
>> I am not missing something.
>>
>> On Wed, Jan 31, 2018 at 3:27 PM J Decker <d3ck0r at gmail.com> wrote:
>>
>>>
>>> (platfrom defines is a variable suitable for like ADD_DEFINITIONS(
>>> ${PLATFORM_DEFINES} )
>>>
>>>
>>>   string( REPLACE ";" " " PLATFORM_DEFINES_ARG "${PLATFORM_DEFINES}" )
>>>   ExternalProject_Add( target
>>>     ....
>>> CMAKE_ARGS -DPLATFORM_DEFINES=${PLATFORM_DEFINES_ARG}
>>>     ......
>>>  )
>>>
>>>
>>> and in the target cmakelists to use the argument
>>>
>>>
>>> STRING( REPLACE " " ";" PLATFORM_DEFINES ${PLATFORM_DEFINES} )
>>>
>>> add_definitions( ${PLATFORM_DEFINES} )
>>>
>>>
>>>
>>> On Wed, Jan 31, 2018 at 9:36 AM, Saad Khattak <saadrustam at gmail.com>
>>> wrote:
>>>
>>>> I have the following setup:
>>>> Superbuild
>>>>    - ExternalProject_Add(a...)
>>>>    - ExternalProject_Add(b...)
>>>>    - ExternalProject_Add(c...)
>>>>    - ExternalProject_Add(d...)
>>>>
>>>> The SuperBuild is built from command line with some options e.g.
>>>> -DMY_OPTION=TRUE. I would like all these options to be passed to each of
>>>> the ExternalProject_Add CMAKE_ARGS.
>>>>
>>>> I tried to capture the arguments using the solution posted here:
>>>> https://stackoverflow.com/a/10218582/368599
>>>>
>>>> The arguments are captured properly (i.e. I printed them out to make
>>>> sure they are correct) but relaying them to ExternalProject_Add appears to
>>>> be problematic. I tried the following ways to forward the arguments (as
>>>> outlined in the stackoverflow solution):
>>>>
>>>> ExternalProject_Add(...
>>>>   CMAKE_ARGS ${CMAKE_ARGS}
>>>>   )
>>>>
>>>> ExternalProject_Add(...
>>>>   CMAKE_ARGS "${CMAKE_ARGS}" # quotes
>>>>   )
>>>>
>>>> ExternalProject_Add(...
>>>>   CMAKE_ARGS "${MY_CMAKE_ARGS}" # changed the variable name in case it
>>>> conflicts
>>>>   )
>>>>
>>>> None of that seems to work. CMake appears to ignore the commands
>>>> forwarded.
>>>>
>>>> Is there something I am missing?
>>>>
>>>> Thanks,
>>>> Saad
>>>>
>>>>
>>>> --
>>>>
>>>> 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:
>>>> https://cmake.org/mailman/listinfo/cmake
>>>>
>>>>
>>>
>> --
>>
>> 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:
>> https://cmake.org/mailman/listinfo/cmake
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://cmake.org/pipermail/cmake/attachments/20180201/a3f8d1bc/attachment.html>


More information about the CMake mailing list