如何替换 Makefile 中的父目录

How to replace parent directory in 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)) 的东西时它起作用了,因为我键入了子字符串 "home/",但我需要一个正则表达式来替换所有目录。 而且我还需要更改目标,也许下面的代码可以工作:

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

...但我更喜欢每个目标分开

您正在寻找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

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 $@

这样你就不用担心对象前缀了。