我一直在努力让我的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。
答案 0 :(得分:2)
make的POSIX版本没有明确支持带有斜杠的文件名,也没有规定将目标文件中的源文件与目标文件分开。并且,如@caskey所述,它不支持使用“%
”字符的任何表示法,但它指出存在此类规则并建议将它们保留用作元字符。
因此,您可能无法使用标准POSIX make
执行所需操作。
在实践中,您通常可以使用make
的特定实现来执行您所寻求的内容,但生成的makefile
具有有限的可移植性。
考虑使用某种类型的makefile生成系统 - cmake
或自动工具(autoconf
,libtool
,automake
等)。或者make
的基本概念的许多重写之一:
答案 1 :(得分:1)
POSIX make不支持像?
这样的结构 objs/%.o : src/%.c
${CC} ${CFLAGS} -c $< -o $@
最后忘记了问号,希望能让我的评论更清晰。