我目前有这个Makefile:
代码:
# Paths
# -----
# Where to put the *.o
Objets_dir = temp\Win
# Where to check for the *.o
VPATH = $(Objets_dir)
# Where to put the resulting binary
Executable = D:\Documents\out.exe
# List of needed objects
Objets = $(patsubst %.f,%.o,$(wildcard *.f))
# Rules
# -----
F_compilo = gfortran
F_compilo_options = -O3 -ffpe-trap=invalid,zero,overflow -mfpmath=sse -fmax-errors=3
Link = x86_64-w64-mingw32-gfortran
Link_options =
# Let's go
# --------
# Compile (generation of .o)
%.o:%.f
$(F_compilo) $(F_compilo_options) -c $< -o $(Objets_dir)\$@
# Link (generation of .exe)
$(Executable): $(Objets)
$(Link) $(Link_options) -o $@ $(addprefix $(Objets_dir)\, $(Objets))
有关信息,我使用mingw32-make来执行此Makefile。
我想编辑它,以便我可以指定一个子文件夹列表,它也会(除当前文件夹外)查找源文件(* .f)。然后它会变得不那么通用,但我对此会非常好。
这个makefile是我多年前从互联网上收到的东西,除了添加一些评论或编辑编译标志之外几乎没有触及过。 我想需要编辑的行是#34;通配符&#34;打电话,但我对Make语言完全(完全)无知。
你能建议如何编辑吗?
答案 0 :(得分:1)
有一个有用的例子,可以在以下列的子目录列表中查找文件:https://www.gnu.org/software/make/manual/html_node/Foreach-Function.html
基于此,我想出了以下内容。我已经在Linux系统上使用一些示例文件对此进行了测试,因此无法保证它在Windows上“开箱即用”,但不应该太远。
它查找dirs
中给出的目录中的所有.f文件,然后像以前一样进行。
# Paths
# -----
# Where to put the *.o
Objets_dir = temp\Win
# Where to put the resulting binary
Executable = D:\Documents\out.exe
# List of directories to search for .f files:
dirs := . a b c d
# Extra directories to check for dependencies
VPATH = a b c d
# Make a list of *.f source files found in dirs
Sources := $(foreach dir,$(dirs),$(wildcard $(dir)\*.f))
# List of needed objects
Objets = $(patsubst %.f,%.o,$(Sources))
# Objects with full path names to their location in temp dir.
TempObjets = $(addprefix $(Objets_dir)\, $(notdir $(Objets)))
# Rules
# -----
F_compilo = gfortran
F_compilo_options = -O3 -ffpe-trap=invalid,zero,overflow -mfpmath=sse -fmax-errors=3
Link = x86_64-w64-mingw32-gfortran
Link_options =
# Let's go
# --------
# Compile (generation of .o)
$(Objets_dir)\%.o:%.f
$(F_compilo) $(F_compilo_options) -c $< -o $(Objets_dir)\$(notdir $@)
# Link (generation of .exe)
$(Executable): $(TempObjets)
$(Link) $(Link_options) -o $@ $^
clean:
rm -f $(TempObjets) $(Executable)
请注意,它会删除文件名中的子目录以进行构建和链接,否则您需要创建一堆匹配的临时目录。因此,将所有.o文件转储到临时目录中很方便。但请注意,如果子目录中的某些.f文件共享相同的名称,则会失败。在这种情况下,您需要将VPATH
设置为临时目录列表(Windows上的列表分隔符为;
,其他系统上为:
)并删除{{1}来自构建和链接规则的子句。但是,您需要在$(nordir ...)
中创建一个目录以匹配每个源目录。
最后,应该注意的是,这并不算作递归使用make。为此,请参阅:How to generate a Makefile with source in sub-directories using just one makefile