仅当特定子目录随GNU Make更改时才编译文件

时间:2020-10-09 13:03:53

标签: makefile

我在这样的结构中有一组文件:

-src
   -SubDir1
     -file1.c
     -file2.h
    -file3.c
   -SubDir2
     -file1.c
    -file2.c
   -SubDir3
     -file1.c
    -file2.c
-outDir

我使用生成自定义输出文件(.out)的脚本来编译每个子目录中的文件。我创建了一个makefile,当任何.c文件在任何子目录中更改时,该文件都会为每个子目录生成.out文件。问题在于,这将编译所有子目录,因为我创建了一个规则,使.out文件依赖于所有.c文件。

是否存在一种聪明的方法来创建使每个.out文件仅依赖于每个子目录的文件的自定义规则? .out文件也应位于新目录中。在下面,您将找到我创建的Makefile

#Recursive wild card for all the subdirs
rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))

SRCS_DIR=src
SRCS_SUBDIRS= $(wildcard $(SRCS_DIR)/*/)
FILES := $(call rwildcard,$(SRCS_DIR)/,*)

#Get each subdir name 
SUBDIRS_NAMES=$(subst $(SRCS_DIR)/,,$(SRCS_SUBDIRS)) 

#Output file has the name of each subdir with .out extension
OUTPUT_FILES=$(subst /,.out,$(SUBDIRS_NAMES))

Process_Outputs: $(OUTPUT_FILES)
    CustomProcess $@
    
/outDir/$(OUTPUT_FILES):$(FILES)
    myCustomScript $@

1 个答案:

答案 0 :(得分:0)

这看起来像是static pattern rule的工作:

$(OUTPUT_FILES): %.out: src/%/file.c
    myCustomScript $@