从make转到cmake:如何使用通配符构建目标

时间:2011-08-02 08:12:56

标签: makefile cmake wildcard

我正在尝试将makefile-build转换为cmake(以避免当前状态被强制关注基于make / msdev的windows-build env和基于make / gcc的linux)。

在这个项目中,我发现了一个充满源代码文件的目录,它根据命名约定编译到库中。 (例如c1223.c => c1223.dll(或.sl))

当前的makefile包含一些使用通配符的指令,例如:

LIB_NO  = $(basename $(subst s,,$@))

OBJ = $(OBJ_PATH)/s$(LIB_NO).o $(OBJ_PATH)/c$(LIB_NO).o\
          $(OBJ_PATH)/b$(LIB_NO).o

$(OBJ_PATH)/%.o : %.c
    -$(CC) $(CFLAGS) -I$(PWD) -c $< -o $@
    -(chmod a+w $@;true)

我已经搜索了一段时间但找不到任何似乎有用的东西。是否可以使用cmake让它生成基于通配符的构建?

非常欢迎任何评论,提示和建议:)

欢呼声  马库斯

2 个答案:

答案 0 :(得分:3)

你可以使用相当原始的globbing(我没有看到正则表达式语法)。

file(GLOB TESTSRCS "test/src/*.cpp")

# Compile the test sources.
add_executable(Tests ${TESTSRCS})

target_link_libraries(Tests ${LIB} gtest gtest_main)

实际的makefile似乎不包含其中的通配符搜索。如果添加新文件,则需要重新运行cmake。

我不知道如果你要生成许多不同的库文件,你将如何设法将库创建包装在一个宏中。

如果每个库只有一个c文件,你可能会做这样的事情:

file(GLOB libfiles "path/to/libs/c*.c")

foreach(libfile ${libfiles})
    GET_FILENAME_COMPONENT(libname ${libfile} NAME) # remove the '.c' part (untested, hopefully this will work)
    add_library(${libname} ${libfile})
endforeach(libfile)

如果其他人有更好的解决方案,我也想学习它。

答案 1 :(得分:0)

CMake不会生成包含基于通配符的规则的makefile。它为它知道的文件生成特定的规则。

在您的示例中,您明确列出了构成库的.o文件。在CMake中,您将明确地列出对您的库有贡献的源文件,然后让CMake负责其余的工作。

出于某种原因,您是否需要在其中包含基于通配符的规则的makefile?

难道你不能简单地构造一个源文件列表,然后,对于列表中的每个元素,用源文件和从源文件名构造的库名进行“add_library”调用吗?