摇动构建捕获目录

时间:2018-04-14 21:57:06

标签: shake-build-system

我最近转换了我的作品基于构建系统的动摇。我现在正试图使目录结构中的更改更加健壮,以便我不必重新生成构建系统。

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

  • SRC
    • 源文件夹1
    • 源文件夹2
  • INC
    • inc folder 1
    • inc folder 2

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

includes = getDirectoryDir "inc"

这将为我提供包含的子文件夹,但不包含根文件夹inc。我认为我可以解决,但不会跟踪公司。

我想要的是拥有像

这样的东西
includes = getDirectoryDirAndRoot "inc"

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

除此之外我还尝试使用

gcc -o out includes

但是我需要将包含的所有元素添加到" -I"我似乎无法弄明白。

我想怎么会在摇动中做到这一点,因为我可以通过使用make shell函数和一些字符串操作函数来完成所有这些。

2 个答案:

答案 0 :(得分:0)

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

  

但是我需要将包含前缀为“-I”的所有元素放在前面,我似乎无法弄清楚。

您可以在此处使用Haskell。如果您有一个目录列表directories :: [FilePath],可以使用

将它们转换为编译器标志
asIncludes :: [FilePath] -> [String]
asIncludes = fmap ("I" ++)

答案 1 :(得分: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 -MD系列标志在已使用的标头文件上添加依赖关系,如Shake user manual中所述,或使用答案1中的技术。