【问题标题】:A Concise Makefile简洁的 Makefile
【发布时间】:2011-07-16 14:26:51
【问题描述】:

我正在做一些 Makefile 重构,并试图找出实现 Makefile 的最简洁方法,该 Makefile 执行以下操作:

  1. 有一个变量列出了所有源文件(可以是 C 和 C++ 文件)
  2. 所有对象文件均在 OBJ_DIR 中生成
  3. 如果对象目录不存在则创建它

这是我目前所拥有的:

...

OBJ_DIR = obj/
BIN_DIR = bin/
PROGRAM = program

SRCS = test1.cpp test2.c

OBJS  = $(addprefix $(OBJ_DIR), \
        $(patsubst %.cpp, %.o,  \
        $(patsubst %.c, %.o, $(SRCS))))

$(BIN_DIR)$(PROGRAM) : $(OBJS)
    $(CREATE_OUT_DIR)
    $(LINK)

$(OBJ_DIR)%.o : %.c
    $(CREATE_OBJ_DIR)
    $(CCOMPILE)

$(OBJ_DIR)%.o : %.cpp
    $(CREATE_OBJ_DIR)
    $(CPPCOMPILE)

...

我想为每个 .o 编译消除对 $(CREATE_OBJ_DIR) 的调用。有人知道怎么做吗?我尝试添加它,但它不会构建目标文件:

$(OBJS): | $(OBJ_DIR)

$(OBJ_DIR):
    $(CREATE_OBJ_DIR)

【问题讨论】:

  • 我发现这种设计存在问题。您如何考虑标头依赖关系?我通常用src = $(shell find ./ --name "*.cpp") 之类的东西编写makefile,并使用GCC -M 开关来为我处理依赖关系。这样,我的所有项目都有一个简短的可重复使用的 makefile。至于你的实际问题,为什么不预先创建obj目录呢?
  • 不完全是一个答案,但您是否已经看过 Makefile 的替代品? SConstruct 出现在我的脑海中(而且很棒),但是还有很多其他工具可以很好地处理这些问题。
  • @Alexandre:我还打算研究标题依赖项。你有一个很好的例子来说明如何做到这一点吗?
  • 一个不错的起点是 mad-scientist.net/make/autodep.html,您可能想要研究的 GCC 选项是 -M 的变体。

标签: makefile gnu-make


【解决方案1】:

您似乎已经解决了您的第一点:将它们全部放在一个变量中(我认为您实际上不需要像您那样将它们分成 TEMP1 和 TEMP2,只是有不同的构建规则)

对于第二点,您可以告诉编译器将目标文件输出到哪里(对于 g++,它是这样的:

g++ -c MySourceFile.cpp -o obj/MySourceFile.o

为此的 make 规则如下所示:

obj/%.o: %.cpp
    g++ -c $*.cpp -o obj/$*.o

你的第三点也很容易解决,因为你可以有一个构建规则(只需将目录名称放在目标的依赖列表中,在列出所有对象之前),构建规则看起来像这样

obj:
    mkdir obj

编辑:或按照您的代码示例:

$(BIN_DIR)$(PROGRAM) : $(BIN_DIR) $(OBJS) 
$(LINK)

$(BIN_DIR):
    $(CREATE_OUT_DIR) 

【讨论】:

  • 目录依赖应该是order-only依赖。
  • 我将目标文件列表生成压缩为一个命令。感谢您的提示。
【解决方案2】:

至于你的第三点:这个问题有been asked here before。不幸的是,对此没有真正好的答案,您需要从答案中找到最不难看的技巧。就个人而言,我投票支持标记文件解决方案。

【讨论】:

    【解决方案3】:

    这就是我的工作:

    $(OBJ_LOC)/%.o: $(SRC_LOC)/%.c
        @[ -d $(OBJ_LOC) ] || mkdir -p $(OBJ_LOC)
        g++ ...
    

    但是,我正在以极大的兴趣查看这些其他答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      相关资源
      最近更新 更多