GNU Make:chdir make process本身

时间:2017-08-28 01:10:35

标签: gnu-make

是否可以使用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来说它似乎更清晰。有没有办法做到这一点(最好不要使用诡计)?

2 个答案:

答案 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目录中的输出路径是相对的,源目录中的路径是绝对的。