cmake之解析宏或者函数参数

发布时间 2023-09-21 23:28:52作者: mohist
  • 本文将介绍cmake如何解析函数或者宏对应的参数列表

语法查询

  • 打开cmake手册,查询cmake_parse_arguments关键字即可, 如下图

语法

cmake_parse_arguments(<prefix> <options> <one_value_keywords>
                      <multi_value_keywords> <args>...)

cmake_parse_arguments(PARSE_ARGV <N> <prefix> <options>
                      <one_value_keywords> <multi_value_keywords>)
  • 支持指定单个参数、多个参数(参数列表),当传递到函数或者宏内部时, 使用 cmake_parse_arguments 解析参数列表即可。

prefix 可自定义, 用作解析传递的参数使用。
下面一个例子帮助理解

用法

  • 官方用法
macro(my_install)
    set(options OPTIONAL FAST)
    set(oneValueArgs DESTINATION RENAME)
    set(multiValueArgs TARGETS CONFIGURATIONS)
    cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}"
                          "${multiValueArgs}" ${ARGN} )

    # ...

使用范例

目标: 使用宏创建多个文件夹,即将创建的文件夹使用参数传递进来

  • CMAKE宏代码
# ------------------------------------------------------------
# 创建文件夹
macro(MKDIR)
	set(options)
	set(oneValueArgs )
	# TARGET_ROOT - 有哪些路径需要创建
	set(multiValueArgs TARGET_ROOT )
	# 解析参数
	cmake_parse_arguments(MK "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )

	# 需要创建这么多的的文件夹
	foreach(WHICH_ROOT ${MK_TARGET_ROOT})
		# 创建文件夹落地
		execute_process( COMMAND ${CMAKE_COMMAND} -E make_directory ${WHICH_ROOT})
	endforeach()
endmacro()

cmake_parse_arguments(MK.. 其中, MK可自定义为你想要的参数前缀。

  • 调用
    • 创建单个目录
MKDIR(TARGET_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/CMAKE2)
  • 创建多个目录
# 有这么多文件夹需要创建
set(TO_MK_ROOT
${CMAKE_CURRENT_SOURCE_DIR}/A
${CMAKE_CURRENT_SOURCE_DIR}/B
${CMAKE_CURRENT_SOURCE_DIR}C
)
MKDIR(TARGET_ROOT ${TO_MK_ROOT})