(抱歉:从CMake邮件列表中交叉发布)
我正在尝试了解CMake的regex实现;我有一个包含4个文件夹和2个文本文件的文件夹,如下所示:
build/
projectA/
CMakeLists.txt
extrafiles/
README
temp/CMakeLists.txt的一行是:
set(CPACK_SOURCE_IGNORE_FILES "[^projectA]$")在随后生成的源代码包中,存在build/、projectA/和extrafiles,但temp/和2个文本文件不存在。我试图进入一个阶段,正则表达式将忽略文件夹中的所有内容,除了projectA/、README和CMakeLists.txt,但目前无法确定我提供的正则表达式是如何给出这些结果的。
我想这可以归结为如何使用regex来匹配整个字符串。我意识到医生说的是Matches any character(s) not inside the brackets,我想这就是我出错的地方.
进一步勘探
为了理解CMake的regex实现,我想我应该从第一条原则开始,做一些简单的事情。
如果我做了
set(CPACK_SOURCE_IGNORE_FILES projectA)然后文件夹projectA不会出现在我的源代码包中(如预期的那样);但是,如果我出现了
set(CPACK_SOURCE_IGNORE_FILES ^projectA$)或
set(CPACK_SOURCE_IGNORE_FILES ^/projectA/$)然后projectA 确实出现了。关于^ (行的开头)和$ (行的末尾),我不理解的是什么?
更多的
可能很明显,projectA实际上不是我的项目的名称,但是当我将项目文件夹物理重命名为projectA时,上面的所有内容都是正确的。但是,当我取代
set(CPACK_SOURCE_IGNORE_FILES projectA)使用
set(CPACK_SOURCE_IGNORE_FILES <name of my project>)并将我的实际项目文件夹从projectA重命名为它的实际名称,我将得到一个空的 tarball!啊!我完全没有知道CMake在我身上耍什么奇怪的把戏,但我只想哭。
任何洞察力都将不胜感激!
自包含示例
弗雷泽的As requested,一个自我包含的例子,展示了我所描述的两个“特性”。但是,我确实知道我正在以一种稍微不标准的方式运行CMake,以便将所有与单个构建相关的工作放在一起,所以如果有任何证据证明以更标准的方式运行CMake可以消除这些问题,我很有兴趣看到它们。
步骤1:创建文件
创建树:
cd ~
mkdir
cd projectA
mkdir projectA 创建C文件,并将其保存为~/projectA/projectA/helloworld.c
#include <stdio.h>
#include <stdlib.h>
int main(void) {
printf("!World!\n"); /* prints !World! */
printf("!CMake!\n"); /* prints !CMake! */
return 0;
}创建一个不需要编译的文件,并将其保存为~/projectA/test.sh
#A non compiled program
echo "Hello world!"创建~/projectA/CMakeLists.txt
cmake_minimum_required (VERSION 2.6)
project (HelloWorld)
set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/projectAinstall")
add_executable(helloworld projectA/helloworld.c)
install(TARGETS helloworld DESTINATION .)
include(InstallRequiredSystemLibraries)
set(CPACK_GENERATOR "TGZ")
set(CPACK_SOURCE_GENERATOR "TGZ")
include(CPack)步骤2:编译
在~/projectA中,运行:
chris@chris:~/projectA$ cmake -H. -Bbuild然后:
make -C build && make -C build package && make -C build package_source这将导致build文件夹中的两个tarball。将这些文件移到其他地方并将其解压缩显示为二进制tarball中的helloworld (如预期的那样),以及源tarball中的~/projectA/projectA中的所有内容,包括无法编译的test.sh ( Fraser似乎对此感到惊讶)。
步骤3:随机测试
修改CMakeLists.txt以包括
set(CPACK_SOURCE_IGNORE_FILES "projectA")并且重新运行上面的CMake / Make命令会导致一个空源tarball,但是使用与上面相同的二进制tarball。我现在已经意识到,更改目录树以使顶层目录为testproject (并且与其子文件夹非常不同)不会导致空源tarball,而只会删除CPACK_SOURCE_IGNORE_FILES中列出的文件。
发布于 2022-08-10 04:45:29
CMake倾向于使用绝对路径,除非在上下文中使用相对路径有很强的论据。因此,我非常肯定它是针对文件的绝对路径运行CPACK_SOURCE_IGNORE_FILES中的每个正则表达式(这应该回答您的问题:“我不理解的^(行首)和$(行尾)是什么?”任何在CPACK_SOURCE_IGNORE_FILES中没有匹配的正则表达式都不会被忽略。
你想要的可能是:
set(CPACK_SOURCE_IGNORE_FILES
/build/
/extrafiles/
/temp/
)https://stackoverflow.com/questions/17935748
复制相似问题