1

我想将我的源文件列表分离到它们自己的文件(source.list)中,这样我就不必在每次添加内容时都更新 Makefile。

source.list 看起来像:

a_file.cpp
another_file.cpp
...
xyz_file.cpp

每个文件都在换行符上。

如何将该列表作为空格分隔的列表放入 Makefile?

如有必要,可以使用配置 bash 脚本。我知道 awk 可以用于此,但我宁愿避免它,如果可能的话

4

3 回答 3

4
SOURCE_LIST := $(shell cat source.list)
于 2013-09-16T13:04:04.250 回答
0

在 gmake 中使用$(wildcard *.cpp)

如果需要,您可以使用对列表进行操作的其他函数来过滤掉一些源文件。

于 2013-09-16T08:21:41.940 回答
0

如果您确实需要将源文件放入单独的文件中,您可以简单地拥有一个或多个变量,具体取决于将所有翻译单元编译为目标文件所需的目标数量:

SOURCE_OBJ1 = src1.cpp depends1 depends2 ...
SOURCE_OBJ2 = src2.cpp depends1 depends2 ...
....

将其保存到 sources.list 并将其包含在 Makefile 中的实际目标定义之前:

include sources.list
 .PHONY: all
 all: executable

 executable: obj1.o obj2.o
    g++ -o executable obj1.o obj2.o

 src1.o: $(SOURCE_OBJ1)
 src2.o: $(SOURCE_OBJ2)

编辑:我概括了具有一个或多个依赖项的多个目标的方法,除了源文件本身。在某些时候,您将需要再次访问 Makefile 本身,例如当您添加需要编译的新源文件时。您可以单独在单独的列表中做的是切换实际的源文件和/或更改目标的依赖关系而不接触 Makefile。

这一切都很好,除了它很可怕而且无法扩展。请使用像 CMake 这样的构建系统生成器,否则当您的项目增长时您将不会有乐趣。

EDIT2 :添加了所有人都期望的虚假目标。

EDIT3:请注意:上面希望您将 src1 等替换为实际的源文件名,例如main。否则,make 将不会推断出适当的 g++ 命令行,并且可能会将作为依赖项提到的头文件添加到源文件列表中。结果是一个不可用的目标文件。

作为替代方案,您可以为源和依赖项指定一个变量,然后指定如何自己调用编译器:

# sources.list
SOURCES_OBJ1 = src1 src2 src3 # only source files here
DEPENDS_OBJ1 = $(SOURCES_OBJ1) dep1 dep2 dep3 # dependencies might include different file types

# ....

# Makefile
# all the other stuff here
obj1.o: $(DEPENDS_OBJ1) # can now be names however you see fit
        g++ -c $(SOURCES_OBJ1) -o obj1.o # handle compiler invocation manually

请注意,obj1.o 现在可以具有您想要选择的任何名称,并且不是PHONY 目标。另请注意,使用的任何源文件也是目标依赖项列表的一部分 - 但是,只有源文件被传递给 g++ 进行编译。

于 2013-09-16T08:29:48.747 回答