【问题标题】:Smart Makefile: way scan directory tree and compile .c filesSmart Makefile:方式扫描目录树并编译.c文件
【发布时间】:2017-04-03 21:28:27
【问题描述】:

我正在做一个发展很快的项目,但我的 Makefile 对文件名有很强的依赖性。

我的目录树: 生成文件 资源 源/阶段2 来源/包括

这个目录是从 Makefile 创建的: exec_phase2.test 源/构建

这是我的 Makefile 的一部分

# Project path
PH2 = source
SRC_PH2 = $(PH2)/phase2
INCL_PH2 = $(PH2)/include
EXEC_PH2 = exec_phase2.test
BUILD_PH2 = $(PH2)/build

# Header file path
HEAD_PH2 = $(INCL_PH2)/const.h $(INCL_PH2)/listx.h $(INCL_PH2)/mikabooq.h

# Object files path
OBJECTS_PH2 = $(BUILD_PH2)/main.o $(BUILD_PH2)/mikabooq.o $(BUILD_PH2)/testP.o


all: mikaboo

mikaboo: phase2.test

phase2.test: clean buildOutDir coreFile

buildOutDir: 
    mkdir -p $(BUILD_PH2)
    mkdir -p $(EXEC_PH2)

coreFile: $(EXEC_PH2)/main.elf
    $(ELF) $(ELFFLAG) $<

$(EXEC_PH2)/main.elf: $(OBJECTS_PH2)
    $(LD) $(LDFLAG) $(LINKER_UARM_PH2)

$(BUILD_PH2)/main.o: $(SRC_PH2)/main.c $(BUILD_PH2)/mikabooq.o $(HEAD_PH2)
    $(CC) $(CCFLAGS) $@ $<

$(BUILD_PH2)/mikabooq.o: $(SRC_PH2)/mikabooq.c $(HEAD_PH2)
    $(CC) $(CCFLAGS) $@ $<

$(BUILD_PH2)/testP.o: $(SRC_PH2)/testP.c $(HEAD_PH2) $(HEAD_KER)
    $(CC) $(CCFLAGS) $@ $<

clean:
    rm -rf $(BUILD_PH2) $(EXEC_PH2) 

我想自动搜索源文件和头文件: 我看到这两个命令:

#search all source file name
SOURCES := $(shell find $(SOURCEDIR) -name '*.c')
# Make list of object files with paths
OBJECTS := $(addprefix $(BUILDDIR)/,$(SOURCES:%.c=%.o))

好的,我认为这可以工作,但现在我如何才能自动编译所有 .c 文件及其依赖项?

注意:我不习惯makefile,我知道基础知识。

【问题讨论】:

  • 如果您尝试自动创建 C 或 C++ 依赖项信息,则 make 中没有任何内容可以为您完成此操作。然而,有很多例子可以说明如何做到这一点;你可能会发现这个有用:make.mad-scientist.net/papers/…
  • 看Make中这样的命令:patsubst, notdir, wildcard

标签: c makefile compilation


【解决方案1】:

使用foreach 生成一堆规则。下面的CCompilation 实现了foreach$(SOURCES) 中提到的每个目录上使用的模板配方。请注意,配方中的最后一个空闲行是一个重要的分隔符。

$(foreach DIRECTORY, $(dir $(SOURCES)), 
          $(call CCompilation, OUTPUT_DIRECTORY, EXTRA_STUFF, $(DIRECTORY)))

define CCompilation 
$(1)/%.o: $(3)/%.c
    CC $< $(2) -o $$@

endef 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2018-02-02
    • 2016-06-16
    • 2014-04-26
    • 1970-01-01
    相关资源
    最近更新 更多