我最近转换了我的作品基于构建系统的动摇。我现在正试图使目录结构中的更改更加健壮,以便我不必重新生成构建系统。
我使用的每个项目都是基于C的,并具有以下目录结构
我能够捕获所有源文件,但我无法工作的是捕获包含文件夹。 root inc文件夹和我试图捕获到构建系统中的变量的子文件夹。我一直在使用以下设置
includes = getDirectoryDir "inc"
这将为我提供包含的子文件夹,但不包含根文件夹inc。我认为我可以解决,但不会跟踪公司。
我想要的是拥有像
这样的东西includes = getDirectoryDirAndRoot "inc"
将捕获每个子目录和根目录,并在构建系统中跟踪它们。
除此之外我还尝试使用
gcc -o out includes
但是我需要将包含的所有元素添加到" -I"我似乎无法弄明白。
我想怎么会在摇动中做到这一点,因为我可以通过使用make shell函数和一些字符串操作函数来完成所有这些。
答案 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中的技术。