[CMake] Arbitrary order named arguments

Doug douglas.linder at gmail.com
Fri Jul 20 01:07:36 EDT 2012


Ah~ I saw http://www.cmake.org/Wiki/CMakeMacroParseArguments but I
didn't realize it was an in-built feature now. That's great, thanks~

Cheers,
Doug.

On Fri, Jul 20, 2012 at 12:28 PM, Michael Jackson
<mike.jackson at bluequartz.net> wrote:
> include (CMakeParseArguments)
>
> function(BuildQtAppBundle)
>     set(options )
>     set(oneValueArgs TARGET DEBUG_EXTENSION ICON_FILE VERSION_MAJOR VERSION_MINOR VERSION_PATCH
>                      BINARY_DIR COMPONENT INSTALL_DEST PLUGIN_LIST_FILE)
>     set(multiValueArgs SOURCES LINK_LIBRARIES LIB_SEARCH_DIRS QT_PLUGINS OTHER_PLUGINS)
>     cmake_parse_arguments(QAB "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
>
> endfunction()
>
>
> Then you have access to variables such as QAB_TARGET or QAB_INSTALL_DEST. This is the preferred way of doing this.
>
> ___________________________________________________________
> Mike Jackson                    Principal Software Engineer
> BlueQuartz Software                            Dayton, Ohio
> mike.jackson at bluequartz.net              www.bluequartz.net
>
> On Jul 19, 2012, at 11:42 PM, Doug wrote:
>
>> There are some cute native functions that let you specify arguments in
>> random order with named keys preceeding them, eg.
>>
>> execute_process(COMMAND blah WORKING_DIRECTORY blah2 OUTPUT_FILE x TIMEOUT 2)
>>
>> ===
>>
>> execute_process(COMMAND blah WORKING_DIRECTORY blah2 TIMEOUT 2 OUTPUT_FILE x)
>>
>>
>> I'm doing this like this at the moment, but it's clumsy:
>>
>> function(args NAMED ARGS)
>>  set(STATE 0)
>>  foreach(ARG ${ARGS})
>>    list(FIND NAMED ${ARG} HAS_NAMED_ITEM)
>>    if(STATE)
>>      set(${STATE} ${ARG} PARENT_SCOPE)
>>      set(STATE 0)
>>    else()
>>      if(NOT HAS_NAMED_ITEM EQUAL -1)
>>        set(STATE ${ARG})
>>      endif()
>>    endif()
>>  endforeach()
>> endfunction()
>>
>> function(blah)
>>  set(NAMED_ARGS LD_CONF;C_FLAGS)
>>  args("${NAMED_ARGS}" "${ARGV}")
>>  message("C_FLAGS --> ${C_FLAGS}")
>>  message("LD_CONF --> ${LD_CONF}")
>> endfunction()
>>
>> It's particularly annoying when I need a required value (or multiple
>> ones), like:
>>
>> function(blah2 REQUIRED)
>>  list(REMOVE_AT ARGV 0)
>>  set(NAMED_ARGS LD_CONF;C_FLAGS)
>>  args("${NAMED_ARGS}" "${ARGV}")
>>  message("REQUIRED --> ${REQUIRED}")
>>  message("C_FLAGS --> ${C_FLAGS}")
>>  message("LD_CONF --> ${LD_CONF}")
>> endfunction()
>>
>> blah2("item_required" C_FLAGS "G" LD_CONF "blah")
>>
>> Anyone suggest a better way?
>>
>> ~
>> Doug.
>> --
>>
>> Powered by www.kitware.com
>>
>> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>>
>> Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.cmake.org/mailman/listinfo/cmake
>


More information about the CMake mailing list