簡體   English   中英

多個子目錄中的目標文件的通用makefile目標

[英]Generic makefile target for object files in multiple subdirectories

我有一個具有以下目錄結構的項目:

Root directory
    bin/ (for final executable)
    Mod1/
        build/ (for *.o / *.d files)
        inc/
        src/
    Mod2/
        build/
        inc/
        src/
    Mod.../ (future module directories)
        build/
        inc/
        src/
    makefile

我當前的makefile包含:

# Directory naming conventions
SRC_DIR_NAME = src
BUILD_DIR_NAME = build

# Parallel source/object/dependency file lists
SRCS = $(shell find -name *.cpp)
OBJS = $(subst $(SRC_DIR_NAME),$(BUILD_DIR_NAME),$(SRCS:%.cpp=%.o))

# Final executable
APP = bin/app

build: $(APP)

$(APP): $(OBJS)
    # link objects and compile app

%.o: %.cpp
    # compile sources into objects

我的文件列表按預期工作並生成:

SRCS=./mod1/src/file.cpp ./mod2/src/file.cpp
OBJS=./mod1/build/file.o ./mod2/build/file.o
DEPS=./mod1/build/file.d ./mod2/build/file.d

但是,當我運行make時,我收到以下錯誤:

make: *** No rule to make target `mod1/build/file.o', needed by `/bin/app'.  Stop.

我的假設是:

%.o: %.cpp

不適合像這樣的輸入

mod1/build/file.o

有沒有辦法制作一個通用目標,它接受一個模塊目錄,並為該模塊的目標文件創建目標,這些目標文件需要該模塊的源文件在各自的子目錄中?

我知道使用遞歸make可以解決這個問題,但我希望盡可能避免使用該解決方案。

在GNU Make中無法表達如此復雜的目標。 雖然有一種方法可以生成目標集(和相應的規則)。 除了使用某種工具生成Makefile的明顯方法之外,我們可以使用GNU Make的eval功能以編程方式創建規則。 示例代碼如下。

# Directory naming conventions
SRC_DIR_NAME := src
BUILD_DIR_NAME := build

# source files list
SRCS := $(shell find -name '*.cpp')

# function to get obj file name from src file name
OBJ_FROM_SRC = $(subst /$(SRC_DIR_NAME)/,/$(BUILD_DIR_NAME)/,$(1:%.cpp=%.o))

# Final executable
APP := bin/app

.PHONY: build
.DEFAULT_GOAL := build

# rule template for obj
define obj_rule_by_src =
src := $(1)
obj := $$(call OBJ_FROM_SRC,$$(src))
OBJS := $$(OBJS) $$(obj)
$$(obj): $$(src)
    # compile source into object
    echo build $$@ from $$<
endef

# generate rules for OBJS
$(foreach src,$(SRCS),$(eval $(call obj_rule_by_src,$(src))))


$(APP): $(OBJS)
# link objects and compile app
    echo create $@ from $^

build: $(APP)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM