1

我最近将我的作品基于构建系统转换为摇动。我现在正试图让shake 对目录结构的更改更加健壮,这样我就不必重新生成构建系统。

我使用的每个项目都是基于 C 的,并且具有以下目录结构

  • 源代码
    • 源文件夹 1
    • 源文件夹 2
  • 公司
    • 公司文件夹 1
    • 公司文件夹 2

我能够捕获所有源文件,但我无法开始工作的是捕获包含文件夹。我试图将根 inc 文件夹和子文件夹捕获到构建系统中的变量中。我一直在使用以下设置

includes = getDirectoryDir "inc"

这会给我包含的子文件夹,但不会给我根文件夹 inc。我认为我可以解决这个问题,但不会跟踪公司。

我想要的是有类似的东西

includes = getDirectoryDirAndRoot "inc"

它将捕获每个子目录和根目录,并在构建系统中对其进行跟踪。

除了我也尝试过使用的东西

gcc -o out includes

但是我需要在 include 中的每个元素前面加上我似乎无法弄清楚的“-I”。

我猜想如何在摇晃中做这件事,在 make 中我可以通过使用 make shell 函数和几个字符串操作函数来完成所有这些。

4

2 回答 2

0

看看addOracle和它的表亲addOracleCache。这应该允许您依赖文件本身以外的信息,例如要包含的目录。

但是我需要在 include 中的每个元素前面加上我似乎无法弄清楚的“-I”。

你可以在这里使用 Haskell。如果您有一个目录列表directories :: [FilePath],您可以将它们转换为编译器标志

asIncludes :: [FilePath] -> [String]
asIncludes = fmap ("I" ++)
于 2018-04-14T21:59:05.433 回答
0

我认为这个问题可以用两种方式来解释,两种方式都很有用(你甚至可能两者都想要),所以我给出两个答案:

答案 1:inc如果目录中的任何文件发生更改,您希望重新编译 C 文件。

"*.c" *> \out -> do headerFiles <- getDirectoryFiles "inc" "**/*.h" need headerFiles ...

此片段获取inc目录(或其子目录)中所有头文件的列表并引入对它们的依赖。如果任何头文件更改,此规则将重新运行。

答案 2:您想要获取要传递给的目录列表gcc

"*.c" *> \out -> do includeDirs <- getDirectoryDirs "inc" cmd "gcc -c" [out] "-Iinc" (map ("-Iinc/" ++) includeDirs) ...

此代码段获取目录名称inc,然后用于map添加-Iinc/它们。也可以-Iinc直接通过。如果更改下的目录列表,则inc此规则将重建。但是,如果这些目录中包含的头文件发生更改,则不会重建任何内容。gcc -MDShake 用户手册中所述,您可以使用标志系列添加对已使用头文件的依赖项,或使用答案 1 中的技术。

于 2018-05-01T07:31:33.397 回答