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 <[email protected]> wrote: > Hi Saad: > > On Wed, Jan 31, 2018 at 6:47 PM, Saad Khattak <[email protected]> > 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 <[email protected]> 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 <[email protected]> >>> 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 >> >>
-- 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
