带子目录的通用makefile

时间:2016-11-04 12:10:27

标签: makefile gnu-make makefile-project

我目前有这个Makefile:

  • 在运行目录中查找所有* .f
  • 在指定的子目录中查找匹配的* .o(在Objets_dir中定义)
  • 编译和链接

代码:

    # 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语言完全(完全)无知。

你能建议如何编辑吗?

1 个答案:

答案 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