代码之家  ›  专栏  ›  技术社区  ›  Anton Lantcevich

具有自动目标创建功能的潜在大型项目的生成文件

  •  0
  • Anton Lantcevich  · 技术社区  · 10 年前

    假设我有一个C项目。有几个文件:

    /myproject/makefile
    /myproject/src
    /myproject/build
    /myproject/src/baseHeader.h
    /myproject/src/module1/module1.h
    /myproject/src/module1/module1_a.c
    /myproject/src/module1/module1_b.c
    /myproject/src/main.c
    

    我希望make在src中搜索所有*。h个不在第一深度级别上的文件,即make应查找*。h文件

    /myproject/src/module1/
    

    所以它不会使用

    /myproject/src/baseHeader.h
    

    然后,对于每一个找到的.h make,都应该创建一个basename为.h的目标,即

    /myproject/src/module1/module1.h 
    

    应该是

    ./build/module1.o: ./src/module1/module1_a.c ./src/module1/module1_b.c ./src/module1/module1.h $(OTHER_DEPS) | $(OPTIONAL_DEPS)
            $(CC) -c $< -o $@
    

    此外,它还应该为/myproject/src/dir中的每个.c文件创建目标,而不必在本示例中递归。将找到c,目标应如下所示

    ./build/main.o: ./src/main.c $(OTHER_DEPS) | $(OPTIONAL_DEPS)
    

    如何做到这一点? 如果存在,有人能给我提供示例链接吗?

    我之所以这样做,是因为经过一天的努力,我觉得最好还是忘掉make,改用bash脚本。。。

    1 回复  |  直到 10 年前
        1
  •  0
  •   IKavanagh    10 年前

    这是可以做到的,但不是微不足道的。一种方法是建立一个所有 .h src 目录及其子目录,然后从该列表中删除 .h时 中的文件 钢筋混凝土 目录

    我们可以在src目录和所有子目录中搜索 .h时 具有的文件 $(wildcard src/**/*.h)) 并且只有src目录 .h时 带有$(通配符src/*.h)的文件。这些可以与 filter-out 函数生成仅包含 .h时 的子目录中的文件 src/ 喜欢

    MODULES := $(filter-out $(wildcard src/*.h),$(wildcard src/**/*.h))
    

    这将生成如下列表

    /myproject/src/module1/module1.h
    /myproject/src/module2/module2.h
    /myproject/src/module3/module3.h
    

    我们可以使用

    INCLUDES := $(notdir MODULES)
    

    这将产生

    module1.h
    module2.h
    module3.h
    

    我们可以使用

    OBJDIR = build
    OBJS := $(addprefix $(OBJDIR)/, $(patsubst %.h,%.o, $(INCLUDES)))
    

    然后我们定义一个空的目标规则来创建所有这些

    .PHONY: modules    
    modules: $(OBJS)
    

    以及创建对象的隐式规则

    $(OBJDIR)/%.o: $(dir $(findstring %.h, $MODULES))*.c %.h $(OTHER_DEPS) | $(OPTIONAL_DEPS)
        $(CC) -c $? -o $@
    

    编辑: 在先决条件列表中使用通配符不是特别可取,但这是我目前拥有的最佳解决方案。

    为每个 .c 中的文件 钢筋混凝土 在不递归搜索的情况下,我们从一开始就采用类似的方法。

    SRCS := $(wildcard src/*.c)
    

    将了解所有 c 顶级文件 钢筋混凝土 目录我们可以用

    $(SRCS:%.c=$(OBJDIR)/%.o): %.c $(OTHER_DEPS) | $(OPTIONAL_DEPS)