gnu-make how:包含makefile的私有或唯一变量名

时间:2017-12-10 13:03:20

标签: gnu-make

我们当前的主要Makefile 导入许多子制作。除了自动依赖之外,每种格式的一般格式如下所示:

OBJS += \
$(OBJS_DIR)/<filename>.o \
...

C_DEPS += \
$(OBJS_DIR)/<filename>.d \

$(OBJS_DIR)/%.o: $(MODULES_PATH)/%.c $(OBJS_DIR)/%.d
    $(GCC) ...

OBJS和C_DEPS在主makefile中定义并在所有包含的makefile中累积。顺便说一句,我们在调用中使用-j来执行parralel。

我尝试的第一件事是更改每个makefile中每个条目列出两次的事实,一次在OBJS中,再一次在C_DEPS中。我想到的改变如下:

OBJ := \
$(OBJS_DIR)/<filename>.o \
...

OBJS += $(OBJ)
C_DEPS += $(OBJ:.o=.d)

一种局部变量,并使用它来添加为对象和依赖列表。但这不起作用,至少有两个问题:

  1. 第一个是每个make include都会覆盖previoud定义。 make文件包含但未调用的事实导致我尝试使用 unexport private 这样的关键字无效,并且每个makefile中都会覆盖变量OBJ。 / LI>
  2. 我担心make并发(使用make -j) - 我应该吗?
  3. 我正在考虑将变量名称设置为动态,但这看起来也很丑陋,并且无法保证不会包含来自不同路径的两个具有相同名称的makefile。

    有什么方法吗?

1 个答案:

答案 0 :(得分:0)

感谢@Vroomfondel提供的观察结果可以得到简单的答案。 在包含调用之间保存varibale的内容实际上是通过连接到OBJS和C_DEPS执行的操作,问题是变量在读取时没有扩展,并且在完成控制之后它只保留了来自最后一个设置OBJ值的makefile。 事实证明它并不重要的是变量OBJ是什么,问题在于我将OBJS和C_DEPS都设置为递归扩展变量。一旦我将它们设置为简单扩展变量,问题就解决了,OBJ在阅读时被扩展到它们中。 那是来自

OBJS =
C_DEPS =

OBJS :=
C_DEPS :=