2

我一直无法让我的 makefile 以我想要的方式工作。首先,我想说这是 POSIX make,如http://www.opengroup.org/onlinepubs/009695399/utilities/make.html我需要我的构建系统同时使用 BSD 和 GNUs(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 编译。

4

2 回答 2

2

POSIX 版本的 make 不明确支持带有斜杠的文件名,也没有规定将不同目录中的源文件与目标文件分开。而且,正如@caskey 所指出的,它不支持使用 ' %' 字符的任何表示法,尽管它指出存在此类规则并建议将它们保留用作元字符。

因此,您可能无法使用标准 POSIX 做您想做的事情make

make在实践中,您通常可以使用makefile.

考虑使用某种生成文件生成系统 -cmake或自动工具(autoconflibtoolautomake等)。或者是对以下基本概念的众多修改之一make

  • 司康
  • 蚂蚁
  • 蛋糕
  • 厨师
  • 胸罩
  • ...还有十几个我已经忘记或没听说过...
于 2009-06-19T02:12:39.427 回答
1

POSIX make 不支持类似的构造?

  objs/%.o : src/%.c
    ${CC} ${CFLAGS} -c $< -o $@

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

于 2009-06-19T00:19:23.493 回答