题
我一直无法让我的 makefile 按我想要的方式工作。首先,我想说这是 POSIX make,如 http://www.opengroup.org/onlinepubs/009695399/utilities/make.html 我需要我的构建系统能够与 BSD 和 GNU(Linux)一起工作。
我想要的是一个零维护的 makefile。我希望它只编译 src/ 中的所有 .c 和 .asm 文件,并将目标文件放在 objs/ 中,然后将 objs/ 中的所有内容链接到二进制文件。
我可以做很多事情,但我无法将源文件和 obj 文件分开。
如果这需要一些内置的 shell 脚本(使用 POSIX 定义的 /bin/sh),我没问题,但我无法让依赖项正常工作。我希望它仅在源文件较新时构建目标文件。
我最接近的是:
${C_OBJS}: ${HDRS} ${*:objs/%=src/%}.c ${CC} ${CFLAGS} -c ${*:objs/%=src/%}.c -o $*.o
这有一个问题,我仍然必须指定 C_OBJS=objs/foo.o 等,而且它几乎不是 POSIX,因此,使用 BSD make 编译,而不是 GNU make 编译。
解决方案
POSIX 版本的 make 不明确支持包含斜杠的文件名,也不提供将不同目录中的源文件与目标文件分开的规定。而且,正如 @caskey 所指出的,它不支持任何使用 ' 的符号%
' 字符,尽管它指出存在此类规则并建议保留它们以用作元字符。
因此,您可能无法使用标准 POSIX 做您想做的事 make
.
在实践中,您通常可以通过特定的实现来完成您想要的事情 make
, ,但由此产生的 makefile
便携性有限。
考虑使用某种 makefile 生成系统 - cmake
或自动工具(autoconf
, libtool
, automake
, , ETC)。或者是对基本概念的众多修改之一 make
:
- 斯康斯
- 蚂蚁
- 蛋糕
- 厨师
- 胸罩
- ...还有十几个我已经忘记或没听说过的...
其他提示
POSIX make不支持像?
这样的结构 objs/%.o : src/%.c
${CC} ${CFLAGS} -c $< -o $@
最后忘记了问号,希望能让我的评论更清晰。