我正在使用gcc -MM生成依赖项规则的先决条件,以便将源文件编译为目标文件。我想在一些变量BIN_DIR = bin / release /的值中指定一个目录来保存目标文件和可执行文件。有两种情况:
案例1
%.d: *.h *.cc Makefile
@$(CXX) -MM $(CXXFLAGS) *.cc > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; $(RM) -rf $@.$$$$
虽然对sed不熟悉,但我了解到sed实用程序的目的是翻译(例如):
main.o:main.cc defs.h
成:
main.o main.d:main.cc defs.h
我的问题是如何进一步改为: bin / release / main.o bin / release / main.d:main.cc defs.h
如果有人能在这里解释sed的用法,那将非常感谢!
案例2
Makefile.depend: *.h *.cc Makefile
$(CXX) -MM $(CXXFLAGS) *.cc > Makefile.depend
在Makefile.depend文件中,您将看到每个规则都是这样的例子:
main.o:main.cc defs.h
如何将其更改为:
bin / release / main.o:main.cc defs.h
谢谢和问候!
注:
我不知道为什么我现在不能发表评论。所以我把我的更新放在这里:
VPATH是指定源代码的目录。但是你必须从你希望目标文件的位置运行make -f path2Makefile。在这里,我希望能够从任何地方运行make -f path2 Makefile。所以最好指定目标文件的目录。
致Beta:
感谢您的帮助!请原谅我无法对你的答案发表评论。 你的方法在第二种情况下的问题是在命令之后,一些具有多行的规则将在每一行接收前缀。 e.g。
main.o:main.cc defs.h \
的src / misc.h
变为:
$(BIN_DIR)main.o:main.cc defs.h \
$(BIN_DIR)src / misc.h
答案 0 :(得分:1)
对于案例1,您可以使用:
sed 's,\($*\)\.o[ :]*,$(BIN_DIR)\1.o $(BIN_DIR)$@ : ,g'
对于初学者来说,正则表达式是难以阅读的,但基本上这表示“将目标词干(请记住,事物1)后跟.o,吞噬后面的任何空格和冒号,并用BIN_DIR替换整个事物,记住的东西,.o,空间,BIN_DIR,规则的目标,空格和冒号“。
案例1会给您带来一些麻烦。首先,无论你是否真的需要,你都将重建main.o和main.d。有几种方法可以解决这个问题 - 最简单的方法是制作目标$(BIN_DIR)main.d和$(BIN_DIR)main.o,但是有更复杂的方法可以稍后再试。
对于案例2,这应该可以解决问题:
sed 's,^,$(BIN_DIR),'
这里正则表达式“将行的开头改为BIN_DIR”。
编辑:第二次尝试
sed 's,\(.*:\),$(BIN_DIR)\1,'
这说“找到以冒号结尾并在其前面贴上BIN_DIR的东西”。防弹的下一步将是“吮吸多行并将BIN_DIR放在冒号前面的每个单词之类的东西”,但这可能不是必需的,敲木头。
答案 1 :(得分:0)
在gnu.org制作手册中查找“vpath”。我认为这就是你所需要的。