1

是否可以使用将生成过程本身引导到的生成文件chdir?我想编写一个期望从构建目录执行的生成文件。

假设我有一个看起来像这样的项目目录结构

project/
├── Makefile
├── include
│   └── Foo.h
├── src
│   └── Foo.cpp
└── test
    └── FooTest.cpp

make 目录做的第一件事就是创建一个构建目录。

project/
├── Makefile
├── _build
├── include
│   └── Foo.h
├── src
│   └── Foo.cpp
└── test
    └── FooTest.cpp

是否可以将生成文件定向chdir_build以简化我的规则?

我希望能够写作(例如)

foo : Foo.o
    $(LD) $^ -o $@ $(LDFLAGS)

而不是

_build/foo : _build/Foo.o
    $(LD) $^ -o $@ $(LDFLAGS)

我知道我可以将构建目录添加到VPATH以影响路径解析,但仅 chdir Make 本身似乎更干净。有没有办法做到这一点(最好不使用诡计)?

4

2 回答 2

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:
于 2017-08-28T02:19:22.850 回答
0

GNU Make 无法做到这一点,但 NetBSDbmake完全可以做到这一点。

假设我们有一个具有以下结构的项目:

.
├── foo.c
├── makefile
└── obj/

foo.c是一个简单的 C 程序,只依赖于标准库。

/* foo.c */
#include <stdio.h>

int main() {
    printf("%s\n", "hi there");
}

使用makefileGNU 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是相对的,源目录中的路径是绝对的。

于 2020-01-24T07:17:56.497 回答