首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CPack:使用regex忽略文件

CPack:使用regex忽略文件
EN

Stack Overflow用户
提问于 2013-07-29 23:09:21
回答 1查看 3.9K关注 0票数 4

(抱歉:从CMake邮件列表中交叉发布)

我正在尝试了解CMake的regex实现;我有一个包含4个文件夹和2个文本文件的文件夹,如下所示:

代码语言:javascript
复制
build/  
projectA/  
CMakeLists.txt  
extrafiles/  
README  
temp/

CMakeLists.txt的一行是:

代码语言:javascript
复制
set(CPACK_SOURCE_IGNORE_FILES "[^projectA]$")

在随后生成的源代码包中,存在build/projectA/extrafiles,但temp/和2个文本文件不存在。我试图进入一个阶段,正则表达式将忽略文件夹中的所有内容,除了projectA/READMECMakeLists.txt,但目前无法确定我提供的正则表达式是如何给出这些结果的。

我想这可以归结为如何使用regex来匹配整个字符串。我意识到医生说的是Matches any character(s) not inside the brackets,我想这就是我出错的地方.

进一步勘探

为了理解CMake的regex实现,我想我应该从第一条原则开始,做一些简单的事情。

如果我做了

代码语言:javascript
复制
set(CPACK_SOURCE_IGNORE_FILES projectA)

然后文件夹projectA不会出现在我的源代码包中(如预期的那样);但是,如果我出现了

代码语言:javascript
复制
set(CPACK_SOURCE_IGNORE_FILES ^projectA$)

代码语言:javascript
复制
set(CPACK_SOURCE_IGNORE_FILES ^/projectA/$)

然后projectA 确实出现了。关于^ (行的开头)和$ (行的末尾),我不理解的是什么?

更多的

可能很明显,projectA实际上不是我的项目的名称,但是当我将项目文件夹物理重命名为projectA时,上面的所有内容都是正确的。但是,当我取代

代码语言:javascript
复制
set(CPACK_SOURCE_IGNORE_FILES projectA)

使用

代码语言:javascript
复制
set(CPACK_SOURCE_IGNORE_FILES <name of my project>)

并将我的实际项目文件夹从projectA重命名为它的实际名称,我将得到一个空的 tarball!啊!我完全没有知道CMake在我身上耍什么奇怪的把戏,但我只想哭。

任何洞察力都将不胜感激!

自包含示例

弗雷泽的As requested,一个自我包含的例子,展示了我所描述的两个“特性”。但是,我确实知道我正在以一种稍微不标准的方式运行CMake,以便将所有与单个构建相关的工作放在一起,所以如果有任何证据证明以更标准的方式运行CMake可以消除这些问题,我很有兴趣看到它们。

步骤1:创建文件

创建树:

代码语言:javascript
复制
cd ~
mkdir 
cd projectA
mkdir projectA    

创建C文件,并将其保存为~/projectA/projectA/helloworld.c

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    printf("!World!\n"); /* prints !World! */
    printf("!CMake!\n"); /* prints !CMake! */
    return 0;
}

创建一个不需要编译的文件,并将其保存为~/projectA/test.sh

代码语言:javascript
复制
#A non compiled program
echo "Hello world!"

创建~/projectA/CMakeLists.txt

代码语言:javascript
复制
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中,运行:

代码语言:javascript
复制
chris@chris:~/projectA$ cmake -H. -Bbuild

然后:

代码语言:javascript
复制
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以包括

代码语言:javascript
复制
set(CPACK_SOURCE_IGNORE_FILES "projectA")

并且重新运行上面的CMake / Make命令会导致一个空源tarball,但是使用与上面相同的二进制tarball。我现在已经意识到,更改目录树以使顶层目录为testproject (并且与其子文件夹非常不同)不会导致空源tarball,而只会删除CPACK_SOURCE_IGNORE_FILES中列出的文件。

EN

回答 1

Stack Overflow用户

发布于 2022-08-10 04:45:29

CMake倾向于使用绝对路径,除非在上下文中使用相对路径有很强的论据。因此,我非常肯定它是针对文件的绝对路径运行CPACK_SOURCE_IGNORE_FILES中的每个正则表达式(这应该回答您的问题:“我不理解的^(行首)和$(行尾)是什么?”任何在CPACK_SOURCE_IGNORE_FILES中没有匹配的正则表达式都不会被忽略。

你想要的可能是:

代码语言:javascript
复制
set(CPACK_SOURCE_IGNORE_FILES
  /build/
  /extrafiles/
  /temp/
)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17935748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档