是否可以使用makefile将make进程本身定向到chdir
?我想编写一个期望从构建目录执行的makefile。
假设我有一个看起来像这样的项目目录结构
project/
├── Makefile
├── include
│ └── Foo.h
├── src
│ └── Foo.cpp
└── test
└── FooTest.cpp
并且make目录所做的第一件事就是建立一个构建目录。
project/
├── Makefile
├── _build
├── include
│ └── Foo.h
├── src
│ └── Foo.cpp
└── test
└── FooTest.cpp
是否可以将makefile定位到chdir
_build
以简化我的规则?
我希望能够写(例如)
foo : Foo.o
$(LD) $^ -o $@ $(LDFLAGS)
而不是
_build/foo : _build/Foo.o
$(LD) $^ -o $@ $(LDFLAGS)
我知道我可以将构建目录添加到VPATH
以影响路径解析,但是对于chdir Make it来说它似乎更清晰。有没有办法做到这一点(最好不要使用诡计)?
答案 0 :(得分:1)
您可以创建一个简单的Makefile来转发所有内容:
.DEFAULT_GOAL := all
.PHONY: ${MAKECMDGOALS}
$(filter-out all,${MAKECMDGOALS}) all: .forward-all ; @:
.forward-all:
${MAKE} -C build ${MAKECMDGOALS}
# Never try to remake this makefile.
${MAKEFILE_LIST}: ;
.SUFFIXES:
答案 1 :(得分:0)
GNU Make无法做到这一点,但是NetBSD的bmake
可以做到这一点。
假设我们有一个具有以下结构的项目:
.
├── foo.c
├── makefile
└── obj/
foo.c
是一个简单的C程序,仅依赖于标准库。
/* foo.c */
#include <stdio.h>
int main() {
printf("%s\n", "hi there");
}
makefile
使用GNU Make和bmake
的公共子集。通常,坚持使用公共子集很乏味,不值得做,这只是为了举例。
default: foo
.c.o:
$(CC) -c -o $@ $<
foo : foo.o
$(CC) -o $@ foo.o
运行bmake
会产生以下输出
$ bmake
cc -c -o foo.o /tmp/make-example/foo.c
cc -o foo foo.o
并产生以下目录结构
.
├── foo.c
├── makefile
└── obj/
├── foo
└── foo.o
从检查bmake
几乎立即chdir
进入obj
目录的输出可以明显看出。 obj
目录中的输出路径是相对的,源目录中的路径是绝对的。