如何定义我自己的cmake函数

时间:2012-07-25 08:20:22

标签: cmake

我使用的是cmake 2.8.8。 我想创建获取源文件列表的函数检查它们是否存在,并将存在的文件放在我必须在我的CMakeList.txt中使用的另一个变量中。这是我的函数

function(SetSources SourceList Sourceses )

message(STATUS "Sourcelist " ${SourceList})

foreach(SRC ${SourceList})

FILE(GLOB Sourceses ${SRC})

message(STATUS "Sources " ${Sourceses})

endforeach(SRC)

endfunction(SetSources)

这就是我称之为我的功能以及我推送给它的论据

set(SourceList plugincustomresourcemgr.cpp PluginCustomResourceDLL.cppextendedarchive.cpp)

set(Sourceses)

SetSources(SourceList Sourceses)

输出表格

message(STATUS "Sourcelist " ${SourceList})

--SourceList SourceList

这不是传递值。我做错了什么以及我必须如何处理函数参数

2 个答案:

答案 0 :(得分:1)

我发现cmake中的函数有固定数量的参数(比如c / c ++) 当我定义变量时,我必须将其值与$ {}一起传递给function.If变量有多个值,函数只获取一个参数,函数将获得最后一个值。如果我不通过引用传递变量($ {})函数将获得变量名称,如值。

为了解决我的问题,我定义了不能获得参数的宏

macro(checkSources)

foreach(SRC ${SourceList})

file(GLOB Sources ${SRC})

endforeach(SRC)

endmacro(checkSources)

如果在当前CMakeList.txt中定义变量“SourceList”和“Sources”,则此工作正常 我知道,用

检查来源是个更好的主意
file(GLOB Sources ${SourceList})

但这是我测试cmake的例子。

答案 1 :(得分:0)

一个简单的解决方案是使用ARGV和ARGC相互配合。它们的含义类似于C / C ++中main的argv和argc,分别表示参数的数量和参数的数量。 例如:

function(showSrcList srcList)
message("ARGC = "${ARGC})
message("ARGV = "${ARGV})

set(i 0)
while(i LESS ${ARGC})
    message("ARG = "${ARGV${i}}) #ARGV0、ARGV1...
    math(EXPR i "${i} + 1")
endwhile()
endfunction()
showSrcList (a.c b.c c.c d.c)

==== output ====
ARGC = 4
ARGV = a.c b.c c.c d.c
ARG = a.c
ARG = b.c
ARG = c.c
ARG = d.c