具有多个子模块的Makefile

时间:2013-11-24 15:20:54

标签: c makefile

我有以下程序结构:

main.c
Makefile
Submodule
--{somefiles}
--Makefile

子模块正在创建库submodule.a。它有很多源文件,需要一些库。

我只想知道

    子模块中的
  1. Makefile知道如何制作submodule.a
  2. 子模块中的
  3. Makefile设置变量SUBMODULE_LDFLAGSSUBMODULE_LDLIBS
  4. 如何在根项目目录中编写Makefile

    1. 它将使用子模块中的Makefile创建submodule.a
    2. 它会将SUBMODULE_LDFLAGSSUBMODULE_LDLIBS添加到自己的变量中吗?
    3. 最后,我希望主Makefile中的以下命令正常工作:

      TARGET = MyProgram
      OBJS = $(TARGET).o submodule/submodule.a
      
      $(TARGET): $(OBJS)
          $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ $(LDLIBS)
      

      现在它创建MyProgram.o并且无法创建MyProgram,因为Makefile不知道如何制作submodule/submodule.a

      我可以添加一行:

      submodule/submodule.a:
          make -C submodule
      

      但它不会帮助我找不到库。

1 个答案:

答案 0 :(得分:2)

子Make没有直接的方法将变量传递给父进程。 (至少)有两种间接方式。

你可以让sub-Make写一个包含变量值的文件,然后可以读取父Make。

您可以复制构建这些变量的submodule/Makefile部分,并将其放入Makefile。更好的是,您可以将该代码隔离在一个单独的文件中,然后两个makefile将include

修改

递归Make的一个缺点是它会中断Make的依赖性处理。在这种情况下,当且仅当库中的一个源被更改时,没有干净的方法来运行子make。

您可以将子模块源列表 - 或构造列表的代码 - 放在一个单独的文件中,两个makefile将include。然后,这些文件可以是$(TARGET)

的先决条件

或者,你可以使submodule/submodule.a成为PHONY目标。在这种情况下,Make每次都会重建二进制文件,否则它将完美地运行。