可以使用makefile将make流程本身定向到chdir吗?我想写一个makefile,它需要从build目录中执行。
假设我有一个项目目录结构,如下所示
project/
├── Makefile
├── include
│ └── Foo.h
├── src
│ └── Foo.cpp
└── test
└── FooTest.cppmake目录做的第一件事就是创建一个build目录。
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本身似乎更简单。有没有办法做到这一点(最好不用guile)?
发布于 2017-08-28 10:19:23
您可以创建一个简单的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:发布于 2020-01-24 15:17:56
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目录中的输出路径是相对路径,源目录中的路径是绝对路径。
https://stackoverflow.com/questions/45910674
复制相似问题