没有GNU-make Pattern的Makefile动态规则

use*_*275 6 makefile gnu-make

我有一组我想编译的.cpp文件.这些.cpp文件位于分层目录结构中.我希望相应的.o文件最终都在一个构建文件夹中.

这是我如何让GNU make枚举文件...

SRCS = \
    $(wildcard $(CODE)/**/*.cpp) \
    $(wildcard $(CODE)/AlgebraLibraries/**/*.cpp) \
    $(wildcard $(CODE)/Calculator/Environments/**/*.cpp)

BARE_SRCS = $(notdir $(SRCS))
BARE_OBJS = $(BARE_SRCS:.cpp=.o)
OBJS = $(addprefix $(BUILD)/, $(BARE_OBJS))
Run Code Online (Sandbox Code Playgroud)

完成此操作后,我不知道如何创建将从.cpp文件创建.o文件的规则.直觉上,我想要做的是以下伪代码.

for i=0, N do  # <-- a for-loop!
  $(OBJS)[i]: $(SRCS)[i]   # <-- the rule!
    $(CPP) -c $(SRCS)[i] -o $(OBJS)[i] # <-- the recipe
end
Run Code Online (Sandbox Code Playgroud)

当然,这不是有效的GNU make代码,但我相信你理解我正在尝试做的事情.以下方法无效.

%.o: %.cpp
    $(CPP) -c $< -o $@
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为GNU make匹配%符号,假设.o文件与.cpp文件并存.

我所知道的所有这些的替代方案,但将非常繁琐,是将所有规则作为明确的规则进行枚举.那是迟钝的!一定有更好的方法.

我一直在研究GNU make生成规则的能力,但如果没有内置逻辑,似乎没有办法做到这一点.如果我可以利用一些流控制语句来生成我想要制定的规则,那将是非常好的.这是否过多地要求GNU-make?

无论如何,有没有办法做我正在尝试用GNU make做的事情?如果是这样,怎么样?

谢谢您的帮助!

Bet*_*eta 14

这看起来像...几个高级制作技巧的工作:

all: $(OBJS)

define ruletemp
$(patsubst %.cpp, $(BUILD)/%.o, $(notdir $(1))): $(1)
    $$(CPP) -c $$< -o $$@
endef

$(foreach src,$(SRCS),$(eval $(call ruletemp, $(src))))
Run Code Online (Sandbox Code Playgroud)

  • 谢谢谢谢!(http://www.gnu.org/software/make/manual/make.html#Eval-Function) - 我将在此阅读更多内容,看看我是否可以使用它.我认为这就是我所寻找的......一种抽象化文件语法的方法.顺便说一句,即使我不应该尝试做我在我的情况下尝试做的事情,我确信我尝试做的事情在其他情况下至少是合法的.我也开始考虑使用果酱,但我不喜欢没有人支持它的事实. (2认同)