我想知道是否有一种方法可以从特定目录自动添加源文件而不将它们写入 Makefile.am 中。
一些make 实现,例如GNU,具有解决此目标的功能,但是没有可移植的机制,并且Autotools 都是关于可移植性的。因此,依赖这种机制是很糟糕的 Autotools 风格。
即使您对忽略可移植性影响感到满意,这样做的范围仍然有限,因为Makefile.am 将源文件与它们所贡献的目标相关联。您需要在有问题的源目录和目标之间存在直接链接,或者可能在更具体的文件名模式和目标之间存在直接链接。有时这种关联存在,但有时不存在。
抛开可移植性问题不谈,总的来说,我不太喜欢这种东西,因为它是一个陷阱。例如,如果您采用这种机制,那么很难在不破坏构建的情况下添加源文件。在对现有项目进行自动工具时添加所有源名称的一次性成本并不是那么糟糕——我已经为几个大型项目做到了——并且在添加源时维护Makefile.am 的成本是微不足道的。
但是,如果您仍然想要这些方面的东西,那么我建议您使用源生成器。它可能看起来像这样:
Makefile.am
bin_PROGRAMS = myprog
include myprog_sources.am
generate_myprog_sources.sh
#!/bin/bash
myprog_sources=(src/myprog/*.c)
echo "myprog_SOURCES = ${myprog_sources[*]}" > myprog_sources.am
使用单独的 shell 脚本为 _SOURCES 定义生成 Automake 代码,命名指定目录(即 src/myprog)中的所有 .c 文件。为简单和安全起见,将其写入自己的文件myprog_sources.am,Makefile.am 文件使用 Automake include 指令来合并它。当您想针对不同的源文件补充调整构建时,您可以运行该脚本。您还可以在不运行脚本的情况下手动更新源列表来临时更改源列表。
这不是您所要求的免提自动化水平,但它仍然非常自动化,并且更适合您使用的工具。