【cmake】宏macro与函数function
宏macro与函数function
cmake中的宏(macro)和函数(function)都支持动态参数
- 变量ARGC记录传入的参数个数
- 变量ARGV0,ARGV1,...顺序代表传入的参数
- 变量ARGV则是一个包含所有传入参数的list
- 变量ARGN也是一个包含传入参数的list,但不是所有参数,而是指macro/function声明的参数之后的所有传入参数。
1. 例子:
cmake_minimum_required(VERSION 3.17.5)
# 设置工程名称
set(PROJECT_NAME KAIZEN)
# 设置工程版本号
set(PROJECT_VERSION "1.0.0.10" CACHE STRING "默认版本号")
# 工程定义
project(${PROJECT_NAME}
LANGUAGES CXX C
VERSION ${PROJECT_VERSION}
)
# 打印开始日志
message(STATUS "\n########## BEGIN_TEST_FUNCTION")
# 定义函数
function(test_func_argument age)
# 打印ARGN参数值
message(STATUS "ARGN: ${ARGN}")
# 打印ARGC参数值
message(STATUS "ARGC: ${ARGC}")
# 打印ARGV参数值
message(STATUS "ARGV: ${ARGV}")
# 打印ARGV0参数值
message(STATUS "ARGV0: ${ARGV0}")
# 打印参数个数
list(LENGTH ARGV argv_len)
message(STATUS "length of ARGV: ${argv_len}")
# 遍历打印各参数值
set(i 0)
while(i LESS ${argv_len})
list(GET ARGV ${i} argv_value)
message(STATUS "argv${i}:${argv_value}")
math(EXPR i "${i} + 1")
endwhile()
if (ARGV1) # ARGV1 is a true variable
message(STATUS "ARGV1: ${ARGV1}")
endif()
if (DEFINED ARGV2) # ARGV2 is a true variable
message(STATUS "ARGV2: ${ARGV2}")
endif()
if (ARGC GREATER 2) # ARGC is a true variable
message(STATUS "ARGC: ${ARGC}")
endif()
foreach (loop_var IN LISTS ARGN) # ARGN is a true variable
message(STATUS "var: ${loop_var}")
endforeach()
endfunction()
message(STATUS "\n")
test_func_argument(22 33 44)
# 打印结束日志
message(STATUS "########## END_TEST_FUNCTION\n")
输出:
########## BEGIN_TEST_FUNCTION
--
-- ARGN: 33;44
-- ARGC: 3
-- ARGV: 22;33;44
-- ARGV0: 22
-- length of ARGV: 3
-- argv0:22
-- argv1:33
-- argv2:44
-- ARGV1: 33
-- ARGV2: 44
-- ARGC: 3
-- var: 33
-- var: 44
-- ########## END_TEST_FUNCTION