我一直无法让我的 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 $@

最后忘记了问号,希望能让我的评论更清晰。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top