如何替换Makefile中的父目录

时间:2015-02-09 21:47:51

标签: makefile

我遇到以下情况:

SOURCES=home/main.cpp modelChecking/Configuracao.cpp modelChecking/Estado.cpp modelChecking/Formula.cpp modelChecking/ModelChecking.cpp lib/VisitTree.cpp
SUFIX=$(SOURCES:.cpp=.o)
OBJECTS=$(SUFIX)

all: refiner
refiner: $(OBJECTS)
    $(CC) $^ -o refiner

home/main.o: home/main.cpp
    $(CC) $(CFLAGS) $< -o $@

modelChecking/Configuracao.o: modelChecking/Configuracao.cpp
    $(CC) $(CFLAGS) $< -o $@

modelChecking/Estado.o: modelChecking/Estado.cpp
    $(CC) $(CFLAGS) $< -o $@
...

......等等。

如您所见,我有不同的目录来编译我的可执行文件。 现在,我想将每个文件.o放在bin /文件夹中,变量OBJECT必须替换每个父目录,我尝试了不同的方法:

OBJECTS=$(SUFIX:%/ = bin/)
OBJECTS=$(subst %/,bin/,$(SUFIX))
OBJECTS=$(patsubst %/,bin/,$(SUFIX))

当我使用类似$(subst home/,bin/,$(SUFIX))这样的东西时,它可以正常工作,因为我键入子字符串&#34; home /&#34;,但我需要一个正则表达式来替换所有目录。 而且我也需要更改目标,也许下面的代码可以运行:

%.o: %.cpp
    $(CC) $(CFLAGS) $< -o $@

...但我更喜欢每个目标单独

1 个答案:

答案 0 :(得分:2)

您正在寻找SUFIX=$(addprefix bin/,$(notdir $(SOURCES:.cpp=.o)))

Makefile将如下所示:

SOURCES=home/main.cpp modelChecking/Configuracao.cpp
SUFIX=$(addprefix bin/,$(notdir $(SOURCES:.cpp=.o)))
OBJECTS=$(SUFIX)

all: refiner
refiner: $(OBJECTS)
     $(CC) $^ -o refiner

bin/main.o: home/main.cpp
     $(CC) $(CFLAGS) -c $< -o $@

bin/Configuracao.o: modelChecking/Configuracao.cpp
     $(CC) $(CFLAGS) -c $< -o $@

但我建议改用SUBDIRS。创建Makefile

Makefile

SUBDIRS = bin
.PHONY: subdirs $(SUBDIRS)
subdirs: $(SUBDIRS)
$(SUBDIRS):
    $(MAKE) -C $@

bin/Makefile

SOURCES=../home/main.cpp ../modelChecking/Configuracao.cpp
SUFIX=$(addprefix bin/,$(notdir $(SOURCES:.cpp=.o)))
OBJECTS=$(SUFIX)

all: refiner
refiner: $(OBJECTS)
    $(CC) $^ -o refiner

main.o: ../home/main.cpp
    $(CC) $(CFLAGS) -c $< -o $@

Configuracao.o: ../modelChecking/Configuracao.cpp
    $(CC) $(CFLAGS) -c $< -o $@

这样您就不必担心对象前缀。