使用makefile分隔对象和源

时间:2009-06-19 00:11:25

标签: makefile posix sh

我一直在努力让我的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。

2 个答案:

答案 0 :(得分:2)

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

因此,您可能无法使用标准POSIX make执行所需操作。

在实践中,您通常可以使用make的特定实现来执行您所寻求的内容,但生成的makefile具有有限的可移植性。

考虑使用某种类型的makefile生成系统 - cmake或自动工具(autoconflibtoolautomake等)。或者make的基本概念的许多重写之一:

  • scons的
  • 胸罩
  • ... 还有十几个我已经忘记或没有听说过 ......

答案 1 :(得分:1)

POSIX make不支持像?

这样的结构
  objs/%.o : src/%.c
    ${CC} ${CFLAGS} -c $< -o $@

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