[CMake] Default parameters in macros

Michael Jackson mike.jackson at bluequartz.net
Tue Nov 25 16:14:13 EST 2008


On Nov 25, 2008, at 11:40 AM, Robert Dailey wrote:

> Hi,
>
> Are all macro parameters optional by default? If not, how can I make  
> them optional? I have a couple of required parameters and a few  
> optional ones. Thanks.


Here is some code from Boosts CMake files:

========== START BOOST CMAKE CODE (From BoostUtils.cmake) ==
# This utility macro determines whether a particular string value
# occurs within a list of strings:
#
#  list_contains(result string_to_find arg1 arg2 arg3 ... argn)
#
# This macro sets the variable named by result equal to TRUE if
# string_to_find is found anywhere in the following arguments.
macro(list_contains var value)
   set(${var})
   foreach (value2 ${ARGN})
     if (${value} STREQUAL ${value2})
       set(${var} TRUE)
     endif (${value} STREQUAL ${value2})
   endforeach (value2)
endmacro(list_contains)

# This utility macro extracts the first argument from the list of
# arguments given, and places it into the variable named var.
#
#   car(var arg1 arg2 ...)
macro(car var)
   set(${var} ${ARGV1})
endmacro(car)

# This utility macro extracts all of the arguments given except the
# first, and places them into the variable named var.
#
#   car(var arg1 arg2 ...)
macro(cdr var junk)
   set(${var} ${ARGN})
endmacro(cdr)
# The PARSE_ARGUMENTS macro will take the arguments of another macro and
# define several variables. The first argument to PARSE_ARGUMENTS is a
# prefix to put on all variables it creates. The second argument is a
# list of names, and the third argument is a list of options. Both of
# these lists should be quoted. The rest of PARSE_ARGUMENTS are
# arguments from another macro to be parsed.
#
#     PARSE_ARGUMENTS(prefix arg_names options arg1 arg2...)
#
# For each item in options, PARSE_ARGUMENTS will create a variable with
# that name, prefixed with prefix_. So, for example, if prefix is
# MY_MACRO and options is OPTION1;OPTION2, then PARSE_ARGUMENTS will
# create the variables MY_MACRO_OPTION1 and MY_MACRO_OPTION2. These
# variables will be set to true if the option exists in the command line
# or false otherwise.
#
# For each item in arg_names, PARSE_ARGUMENTS will create a variable
# with that name, prefixed with prefix_. Each variable will be filled
# with the arguments that occur after the given arg_name is encountered
# up to the next arg_name or the end of the arguments. All options are
# removed from these lists. PARSE_ARGUMENTS also creates a
# prefix_DEFAULT_ARGS variable containing the list of all arguments up
# to the first arg_name encountered.
MACRO(PARSE_ARGUMENTS prefix arg_names option_names)
   SET(DEFAULT_ARGS)
   FOREACH(arg_name ${arg_names})
     SET(${prefix}_${arg_name})
   ENDFOREACH(arg_name)
   FOREACH(option ${option_names})
     SET(${prefix}_${option} FALSE)
   ENDFOREACH(option)

   SET(current_arg_name DEFAULT_ARGS)
   SET(current_arg_list)
   FOREACH(arg ${ARGN})
     LIST_CONTAINS(is_arg_name ${arg} ${arg_names})
     IF (is_arg_name)
       SET(${prefix}_${current_arg_name} ${current_arg_list})
       SET(current_arg_name ${arg})
       SET(current_arg_list)
     ELSE (is_arg_name)
       LIST_CONTAINS(is_option ${arg} ${option_names})
       IF (is_option)
       SET(${prefix}_${arg} TRUE)
       ELSE (is_option)
       SET(current_arg_list ${current_arg_list} ${arg})
       ENDIF (is_option)
     ENDIF (is_arg_name)
   ENDFOREACH(arg)
   SET(${prefix}_${current_arg_name} ${current_arg_list})
ENDMACRO(PARSE_ARGUMENTS)

======= Start Example ==========================

#   ExampleMacro(libname
#               [SRCDIRS srcdir1 srcdir2 ...]
#               [TESTDIRS testdir1 testdir2 ...]
#               [MODULARIZED])
macro(ExampleMacro LIBNAME)
    parse_arguments(THIS_PROJECT
     "SRCDIRS;TESTDIRS"
     "MODULARIZED"
     ${ARGN}
     )

endmacro()

======== Usage ============
ExampleMacro( myLibary SRCDIRS mysrcs TESTDIRS myTests MODULARIZED)
ExampleMacro( anotherLib )
ExampleMacro( thirdLib TESTDIRS myTests)

Hope that helps....
_________________________________________________________
Mike Jackson                  mike.jackson at bluequartz.net
BlueQuartz Software                    www.bluequartz.net
Principal Software Engineer                  Dayton, Ohio





More information about the CMake mailing list