cmake函数參数解析
近期在迁移公司的make系统到cmake上。发现cmake的function參数非常奇怪。比如,假设我们向一个function传递list作为參数,在function中,形參会变成例如以下状况:
set(SRC)
list(APPEND SRC a.cpp b.cpp)
list(APPEND SRC c.cpp d.cpp) function(tst_arguments src_list)
message("src_list = "${src_list})
endfunction() message("SRC = "${SRC})
tst_arguments(${SRC}) ==== output ====
SRC = a.cppb.cppc.cppd.cpp
src_list = a.cpp
非常奇怪的是,这里的${SRC}在function外是完整的4个元素。而在function却仅仅剩下了头一个元素(可能跟list的定长有关)。
假设我们要传给function以n个源文件组成的list,这样显然不行。
一种简单的解决方法是使用ARGV。ARGC配合,他们的含义如同C/C++中main的argv和argc。分别代表參数和參数个数。使用例如以下方法解析參数:
function(tst_arguments src_list)
message("ARGC = "${ARGC})
message("ARGV = "${ARGV}) set(INDEX 0) while(INDEX LESS ${ARGC})
message("ARG = "${ARGV${INDEX}})
math(EXPR INDEX "${INDEX} + 1")
endwhile()
endfunction() tst_arguments(${SRC}) ==== output ====
ARGC = 4
ARGV = a.cppb.cppc.cppd.cpp
ARG = a.cpp
ARG = b.cpp
ARG = c.cpp
ARG = d.cpp
当然,你也能够使用cmake的foreach循环遍历參数。这招对付仅仅有一个list的參数时十分有效。可是在出现多个參数的情况就非常麻烦。例如以下:
#
#如果函数link_lib将src_list中的源文件链接成库,依据type制定是链接静态库还是动态库
#
function(link_lib src_list type) message("ARGC = "${ARGC})
message("ARGV = "${ARGV}) #下面依据參数的实际情做了操作,手动处理。以保证正确获取src_list和type
set(INDEX 0)
math(EXPR MAX "${ARGC} - 1")
while(INDEX LESS ${MAX})
#do something to link
math(EXPR INDEX "${INDEX} + 1")
endwhile()
endfunction() link_lib(${SRC} , so) ==== output ====
ARGC = 5
ARGV = a.cppb.cppc.cppd.cppso
原来,ARG把两个參数混在了一起,尽管后面我们使用while进行了特殊处理,可是这对于cmake的函数不具备普遍性。移植起来非常麻烦。
决定版的solution是使用cmake的cmake_parse_arguments来解析函数參数,它有点像解析一个map键值对。首先看下它的函数原型:
include (CMakeParseArguments) #必须包括这个cmake文件才干使用<span class="highlighted">cmake_parse_arguments</span> CMAKE_PARSE_ARGUMENTS(<prefix> <options> <one_value_keywords> <multi_value_keywords> args...)
首先,prefix是一个前缀。等会儿在引用參数的时候会提到,<option>是一个列表。里面能够包括一些你感兴趣的KeyWord,随后能够通过它来看看你所须要的KeyWord是否被设置。<one_value_keywords>是一个单值參数的KeyWord列表。<multi_value_keywords>是一个多值參数的KeyWord列表(如list),以下举个样例,看看怎样使用它们,首先定义所须要的函数,因为參数是由CMAKE_PARSE_ARGUMENTS来解析的,所以在函数声明中就不须要定义參数了:
function(tst_arguments)
CMAKE_PARSE_ARGUMENTS(
TEST "" "NAME;COMMAND;BASELINE"
"ARGSLIST"
${ARGN}
) message("TEST_DEFAULT_ARGS is ${TEST_DEFAULT_ARGS} from ${ARGN}")
message("TEST_NAME is ${TEST_NAME}")
message("TEST_COMMAND is ${TEST_COMMAND}")
message("TEST_ARGSLIST is ${TEST_ARGSLIST}")
message("TEST_BASELINE is ${TEST_BASELINE}") endfunction(tst_arguments)
这里的前缀是TEST,<one_value_keywords>我们设置单值參数的KeyWord(NAME;COMMAND;BASELINE)。这将在随后的函数调用中注明KeyWord和Value的关系,<multi_value_keywords>我们设置多值參数的KeyWord("ARGSLIST"),调用函数:
TEST_ARGUMENT(
NAME
testiso
COMMAND
"RunMe"
ARGSLIST
${SRC}
BASELINE
"/home/sakaue/iWork"
) ==== output ====
TEST_DEFAULT_ARGS is from NAME;testiso;COMMAND;RunMe;ARGSLIST;a.cpp;b.cpp;c.cpp;d.cpp;BASELINE;/home/sakaue/iWork
TEST_NAME is testiso
TEST_COMMAND is RunMe
TEST_ARGSLIST is a.cpp;b.cpp;c.cpp;d.cpp
TEST_BASELINE is /home/sakaue/iWork
能够看见,这里调用时的參数传递如同map一样<NAME ,testiso_${datafile} >,<COMMAND , "RunMe">,<ARGSLIST , ${SRC}>等等。在函数中。使用 前缀+KeyWord 来调用Value,这样比自己解析參数方便很多,并且也不会在还有list參数时和其它类型函数混在一起的情况。
很多其它讯息參考:http://www.cmake.org/cmake/help/v3.0/module/CMakeParseArguments.html?highlight=cmake_parse_arguments
cmake函数參数解析的更多相关文章
- 各种python 函数參数定义和解析
python 中的函数參数是赋值式的传递的,函数的使用中要注意两个方面:1.函数參数的定义过程,2.函数參数在调用过程中是怎样解析的. 首先说一下在python 中的函数调用过程是分四种方式的.这里且 ...
- linux kernel的cmdline參数解析原理分析
利用工作之便,今天研究了kernel下cmdline參数解析过程.记录在此.与大家共享.转载请注明出处.谢谢. Kernel 版本:3.4.55 Kernel启动时会解析cmdline,然后依据这些參 ...
- C++容器类对象函数參数问题
总之中的一个句话:容器类对象作为函数參数,与整数类型作为函数參数的传递特性同样. 验证程序 #include "stdafx.h" #include <iostream> ...
- JavaScript的最大函数參数长度和最大栈深度检測
一般代码也许不会涉及最大參数长度和最大栈深度,但某些特殊场合,检測这两个參数还是有必要的.比如:用递归计算斐波那契数列的第n个值,不了解最大栈深度,难免显得肤浅.又比如:将一串charCode转成St ...
- 百度URL參数解析
百度URL參数解析 在用Python爬取百度搜索的内容时,发现百度搜索的url非常的长.往往会跟一大段的參数,但事实上非常多參数都是没有必要的,如相同是搜索javakeyword,能够通过 http: ...
- Effective JavaScript Item 55 接受配置对象作为函数參数
接受配置对象作为函数參数 尽管保持函数接受的參数的顺序非常重要,可是当函数可以接受的參数达到一定数量时.也会让用户非常头疼: var alert = new Alert(100, 75, 300, 2 ...
- Python命令行选项參数解析策略
概述 在Python的项目开发过程中,我们有时须要为程序提供一些能够通过命令行进行调用的接口.只是,并非直接使用 command + 当前文件 就ok的,我们须要对其设置可选的各种各样的操作类型.所以 ...
- 【Android 应用开发】Activity 状态保存 OnSaveInstanceState參数解析
作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38297083 一. 相关方法简单介绍 1. 状态保存方法演示 ...
- C语言中的system函数參数具体解释
http://blog.csdn.net/pipisorry/article/details/33024727 函数名: system 功 能: 发出一个DOS命令 用 法: int sy ...
随机推荐
- jquery实现checkbox的单选和全选
一.思路 全选:判断“全选”checkbox的状态,如果选中则把tbody下所有的checkbox选中,反之 单选:主要是判断有没有全选,如果不是选中状态就把全选的checkbox状态设置为false ...
- 为mongodb数据库增加用户名密码权限
加固mongodb建议:修改数据库默认端口,添加数据库访问权限: 启动数据库(裸奔):C:\mongodb\bin>mongod --dbpath C:\MongoDB\data(同时用--db ...
- thinkphp和ueditor自定义后台处理方法整合
先了解一下ueditor后台请求参数与返回参数格式规范: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...
- 详细介绍如何在Eclipse中使用SVN
一.在Eclipse中下载安装Subclipse插件 1 打开eclipse,在Help菜单中找到marketPlace,点击进入. 2 在搜索框Find中输入subclipse,点击右边的Go按 ...
- Visual Studio 2017强制更新方法
Visual Studio 2017强制更新方法 Visual Studio 2017更新时候,用户都是根据消息提示,进行更新.这样做的好处,就是微软可以分批下发升级包,避免集中更新.不过为了早点 ...
- 机器学习之路: python nltk 文本特征提取
git: https://github.com/linyi0604/MachineLearning 分别使用词袋法和nltk自然预言处理包提供的文本特征提取 from sklearn.feature_ ...
- 特征向量、特征值以及降维方法(PCA、SVD、LDA)
一.特征向量/特征值 Av = λv 如果把矩阵看作是一个运动,运动的方向叫做特征向量,运动的速度叫做特征值.对于上式,v为A矩阵的特征向量,λ为A矩阵的特征值. 假设:v不是A的速度(方向) 结果如 ...
- 决策树算法(Bagging与随机森林)
Bagging算法: 将训练数据集进行N次Bootstrap采样得到N个训练数据子集,对每个子集使用相同的算法分别建立决策树,最终的分类(或回归)结果是N个决策树的结果的多数投票(或平均). 其中,B ...
- Spring的优点
Spring的优点 1.低侵入式设计,代码污染极低: 2.独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺: 3.Spring的DI机 ...
- 「HNOI2018」毒瘤
「HNOI2018」毒瘤 解题思路 先考虑只有一棵树的情况,经典独立集计数. \[ dp[u][0]=\prod (dp[v][0]+dp[v][1]) \\ dp[u][1]=\prod dp[v] ...