我正在尝试根据需要将整个项目转换为单个 Makefile,如果this http://aegis.sourceforge.net/auug97.pdf每当我遇到递归 makefile 问题时,我都会看到我的所有搜索结果都乱七八糟。然而,我遇到了一个非常基本的问题,我不知道如何解决。我想为每个 Makefile 模块定义几个常见但不相同的变量。为此,我创建了一个Makefile.var
首先文件:
# ============================================================================
# Common aliases for local dirs
# ============================================================================
# Every make module must define WORKING_DIR :=
BIN = $(WORKING_DIR)/bin
OBJ = $(WORKING_DIR)/obj
SRC = $(WORKING_DIR)/src
DEP = $(WORKING_DIR)/obj
INC = $(WORKING_DIR)/include
INCLUDES = -I$(INC)
ALL_SRCS = $(wildcard $(SRC)/*.C)
ALL_INCS = $(wildcard $(INC)/*.h)
ALL_OBJS = $(subst $(SRC),$(OBJ),$(ALL_SRCS:%.C=%.o))
ALL_DEPS = $(subst $(SRC),$(DEP),$(ALL_SRCS:%.C=%.d))
这是在一个Makefile.var
首先包含在主文件中的文件。此后,将包含后续的 makefile 模块。这里是我的主人Makefile
:
include MakeModules/Makefile.var
include MakeModules/Makefile.tools
clean: $(CLEAN_LIST)
all: $(MAKE_LIST)
最后,这是一个模块的样子。为了方便起见,我只需复制并粘贴相同的模块两次,并调整第二个实例的名称。这是Makefile.tools
:
# ============================================================================
# queuing (QUE)
# ============================================================================
WORKING_DIR := $(TOP)/tools/queuing
QUE_TARGET := libqueue.so
-include $(DEP)/*.d
$(QUE_TARGET): $(ALL_OBJS)
$(CPP) $(CFLAGS) -shared -o $@ $(ALL_OBJS)
que-clean:
-rm -f $(OBJ)/*.o $(DEP)/*.d
CLEAN_LIST += que-clean
MAKE_LIST += $(QUE_TARGET)
# ============================================================================
# queuing2 (QUE2)
# ============================================================================
WORKING_DIR := $(TOP)/tools/queuing2
QUE2_TARGET := libqueue2.so
-include $(DEP)/*.d
$(QUE2_TARGET): $(ALL_OBJS)
$(CPP) $(CFLAGS) -shared -o $@ $(ALL_OBJS)
que2-clean:
-rm -f $(OBJ)/*.o $(DEP)/*.d
CLEAN_LIST += que2-clean
MAKE_LIST += $(QUE2_TARGET)
如你看到的,Makefile.tools
使用派生变量Makefile.var
基于的价值WORKING_DIR
。嗯,这实际上不起作用,因为 2 相读数make
做。这WORKING_DIR
变量只会接受最后一次已知的赋值,并且ALL_OBJS
所有规则的值都相同,无论它们位于何处。这意味着只有最后定义的模块实际上具有正确的规则。
有没有办法提供公共访问权限BIN, OBJ, SRC, ...
每个模块的变量,而无需使用新前缀一遍又一遍地进行 c/ping?也就是说,我可以将变量定义的范围限定为 Makefile 部分,然后在保留旧规则的同时更改它吗?我有一种渴望这是不可能的感觉,但如果我错过了一些可以很好地解决这个问题的好技巧,那就太好了。否则,这个全局 Makefile 的事情实际上是不可行的(使用了大量的公共变量来从WORKING_DIR
,之前的范围由递归 make 确定)。