如何分发make构建以将dir与单个makefile分开?

如何分发make构建以将dir与单个makefile分开?,makefile,Makefile,我在“modules”目录中有C源代码。它们只是*.c和相应的.h文件。我还有“tests”目录,其中包含用于测试模块的test.c程序。最后,我在“progs”目录中还有一些独立的程序,它们的名称用*.c mask表示 我希望有一个单一的主Makefile,其中有用于编译名为“modules”、“progs”和“tests”的目标的命令。但是,我不知道如何定义所有依赖项,以便正确编译所有内容。我的试验无效 下面是最简单的makefile,它显然根本不起作用: COMPILER=gcc SOUR

我在“modules”目录中有C源代码。它们只是*.c和相应的.h文件。我还有“tests”目录,其中包含用于测试模块的test.c程序。最后,我在“progs”目录中还有一些独立的程序,它们的名称用*.c mask表示

我希望有一个单一的主Makefile,其中有用于编译名为“modules”、“progs”和“tests”的目标的命令。但是,我不知道如何定义所有依赖项,以便正确编译所有内容。我的试验无效

下面是最简单的makefile,它显然根本不起作用:

COMPILER=gcc
SOURCES=modules progs tests
CFLAGS=-O2 -g -Og -Wall -std=c14
INCLUDES= -Imodules -I. -I../modules         # no idea which is needed!
LFLAGS=-lm -lSDL -lSDL_image

all: modules tests progs

modules: modules/*.c modules/*.h
  ${COMPILER} ${CFLAGS} ${INCLUDES} -c $< -o $@

progs: progs/*.c
  ${COMPILER} ${CFLAGS} ${INCLUDES} -c $< -o $@ ${LFLAGS}

tests: tests/*.c
  ${COMPILER} ${CFLAGS} ${INCLUDES} -c $< -o $@ ${LFLAGS}

#%.o: %.c   # no idea how to force compiling to modules OR progs, etc.
COMPILER=gcc
源=模块程序测试
CFLAGS=-O2-g-Og-Wall-std=c14
INCLUDES=-Imodules-I.-I../modules#不知道需要哪一个!
LFLAGS=-lm-lSDL-lSDL_图像
所有:模块测试程序
模块:模块/*.c模块/*.h
${COMPILER}${CFLAGS}${INCLUDES}-c$<-o$@
progs:progs/*.c
${COMPILER}${CFLAGS}${INCLUDES}-c$<-o$@${LFLAGS}
测试:测试/*.c
${COMPILER}${CFLAGS}${INCLUDES}-c$<-o$@${LFLAGS}
#%.o:%.c#不知道如何强制编译模块或程序等。

我听说过CPP和为模块自动创建依赖项,但我尝试过的都不起作用,即使是在尝试了gnumakefile帮助示例或其他手册之后。我的情况有所不同:(

我认为我几天前发现的这个解决方案将/可能奏效:

我拥有的目录是“src”、“tests”和“utils”。全局生成文件如下所示:

DIRS = src tests utils

all:
        make -C src -f Makefile
        make -C tests -f Makefile
        make -C utils -f Makefile

clean:
        make -C src -f Makefile clean
        make -C tests -f Makefile clean
        make -C utils -f Makefile clean

.PHONY: all clean ${DIRS}
这是可行的,尽管我更喜欢一些自动化的解决方案来迭代${dirs}中的所有dir。 然后,在每个目录中,都存在自己的Makefile:

在src中:

SOURCES = ${wildcard *.c}
HEADERS = ${SOURCES:.c=.h}
OBJECTS = ${SOURCES:.c=.o}
DEPENDS = ${OBJECTS:.o=.d}
INCLUDE = -I/usr/include/SDL

LDFLAGS = -lm -lSDL -lSDL_image
CCFLAGS = -O2 -g -Wall -pedantic ${INCLUDE}

all: ${OBJECTS}

-include ${DEPENDS}

%.d: %.c
        ${CPP} ${CCFLAGS} $< -MM -MT ${@:.d=.o} >$@

%.o: %.c
        ${CC} ${CCFLAGS} -c $< -o $@

clean:
        rm -f ${OBJECTS} ${DEPENDS}

.PHONY: clean all
SOURCES=${wildcard*.c}
HEADERS=${SOURCES:.c=.h}
对象=${SOURCES:.c=.o}
依赖项=${OBJECTS:.o=.d}
INCLUDE=-I/usr/INCLUDE/SDL
LDFLAGS=-lm-lSDL-lSDL\u图像
CCFLAGS=-O2-g-Wall-pedantic${INCLUDE}
全部:${OBJECTS}
-包含${dependens}
%d.d:%
${CPP}${CCFLAGS}$<-MM-MT${@:.d=.o}>$@
%.o:%.c
${CC}${CCFLAGS}-c$<-o$@
清洁:
rm-f${OBJECTS}${dependens}
.冒牌货
然后,在测试和UTIL中(它们非常相似):

SOURCES=${wildcard*.c}
对象=${SOURCES:.c=.o}
依赖项=${OBJECTS:.o=.d}
程序=${patsubst%.c,%,${wildcard test*.c}
INCLUDE=-I/usr/INCLUDE/SDL-I../src
LDFLAGS=-lm-lSDL-lSDL\u图像
CCFLAGS=-O2-g-Wall-pedantic${INCLUDE}
全部:${PROGRAM}
测试%:测试%.o
${CC}${CCFLAGS}$+../src/*.o-o$@${LDFLAGS}
#-包含${dependens}
#%d.d:%
#${CPP}${CCFLAGS}$<-MM-MT${@:.d=.o}>$@
%.o:%.c
${CC}${CCFLAGS}-c$<-o$@
清洁:
rm-f${PROGRAM}${OBJECTS}${dependens}
.冒牌货
在“utils”中,我有:

SOURCES = ${wildcard *.c}
OBJECTS = ${SOURCES:.c=.o}
DEPENDS = ${OBJECTS:.o=.d}
PROGRAM = ${SOURCES:.c=}
INCLUDE = -I/usr/include/SDL -I../src

LDFLAGS = -lm -lSDL -lSDL_image
CCFLAGS = -O2 -g -Wall -pedantic ${INCLUDE}

all: calcVariance getScanLine

calcVariance: calcVariance.c
        ${CC} ${CCFLAGS} $< ../src/*.o -o $@ ${LDFLAGS}

getScanLine: getScanLine.c
        ${CC} ${CCFLAGS} $< ../src/*.o -o $@ ${LDFLAGS}

%.d: %.c
        ${CPP} ${CCFLAGS} $< -MM -MT ${@:.d=.o} >$@

%.o: %.c
        ${CC} ${CCFLAGS} -c $< -o $@

clean:
        rm -f ${PROGRAM} ${OBJECTS} ${DEPENDS}

-include ${DEPENDS}

.PHONY: clean all
SOURCES=${wildcard*.c}
对象=${SOURCES:.c=.o}
依赖项=${OBJECTS:.o=.d}
程序=${SOURCES:.c=}
INCLUDE=-I/usr/INCLUDE/SDL-I../src
LDFLAGS=-lm-lSDL-lSDL\u图像
CCFLAGS=-O2-g-Wall-pedantic${INCLUDE}
全部:calcVariance getScanLine
calcVariance:calcVariance.c
${CC}${CCFLAGS}$<../src/*.o-o$@${LDFLAGS}
getScanLine:getScanLine.c
${CC}${CCFLAGS}$<../src/*.o-o$@${LDFLAGS}
%d.d:%
${CPP}${CCFLAGS}$<-MM-MT${@:.d=.o}>$@
%.o:%.c
${CC}${CCFLAGS}-c$<-o$@
清洁:
rm-f${PROGRAM}${OBJECTS}${dependens}
-包含${dependens}
.冒牌货
同样,我也没有找到任何好方法来迭代来自${SOURCES}的所有程序,因为有些依赖项计算不正确,正因为如此,我定义了逐字记录的程序名并将其放入规则中。也许有人会知道如何更好地做到这一点。此外,我还了解到,使用预处理器自动确定所有依赖项是一个非常好的技巧,这反过来会使所有生成文件变得更好,automa泰德和精确

缺点: 1.缺乏自动化,特别是在“utils”(我的自动化明显版本)中,它愚弄了make,并试图用getScanLine.o对象文件构建calcVariance,但失败惨重

  • 从'src'目录重建../src/*.o文件后,Make没有看到新的重建对象。在重建'src'目录后,尝试从'tests'或'utils'构建时,没有看到任何更改。我必须强制清除,然后全部生成以重建这些目录

  • 我觉得这个解决方案不是我所能达到的最好的,因为我不了解make是如何工作的。因此,我认为很多事情可以改进。任何意见都非常欢迎


  • 我认为,我几天前发现的这个解决方案将/可能奏效:

    我拥有的目录是“src”、“tests”和“utils”。全局生成文件如下所示:

    DIRS = src tests utils
    
    all:
            make -C src -f Makefile
            make -C tests -f Makefile
            make -C utils -f Makefile
    
    clean:
            make -C src -f Makefile clean
            make -C tests -f Makefile clean
            make -C utils -f Makefile clean
    
    .PHONY: all clean ${DIRS}
    
    这是可行的,尽管我更喜欢一些自动化的解决方案来迭代${dirs}中的所有dir。 然后,在每个目录中,都存在自己的Makefile:

    在src中:

    SOURCES = ${wildcard *.c}
    HEADERS = ${SOURCES:.c=.h}
    OBJECTS = ${SOURCES:.c=.o}
    DEPENDS = ${OBJECTS:.o=.d}
    INCLUDE = -I/usr/include/SDL
    
    LDFLAGS = -lm -lSDL -lSDL_image
    CCFLAGS = -O2 -g -Wall -pedantic ${INCLUDE}
    
    all: ${OBJECTS}
    
    -include ${DEPENDS}
    
    %.d: %.c
            ${CPP} ${CCFLAGS} $< -MM -MT ${@:.d=.o} >$@
    
    %.o: %.c
            ${CC} ${CCFLAGS} -c $< -o $@
    
    clean:
            rm -f ${OBJECTS} ${DEPENDS}
    
    .PHONY: clean all
    
    SOURCES=${wildcard*.c}
    HEADERS=${SOURCES:.c=.h}
    对象=${SOURCES:.c=.o}
    依赖项=${OBJECTS:.o=.d}
    INCLUDE=-I/usr/INCLUDE/SDL
    LDFLAGS=-lm-lSDL-lSDL\u图像
    CCFLAGS=-O2-g-Wall-pedantic${INCLUDE}
    全部:${OBJECTS}
    -包含${dependens}
    %d.d:%
    ${CPP}${CCFLAGS}$<-MM-MT${@:.d=.o}>$@
    %.o:%.c
    ${CC}${CCFLAGS}-c$<-o$@
    清洁:
    rm-f${OBJECTS}${dependens}
    .冒牌货
    
    然后,在测试和UTIL中(它们非常相似):

    SOURCES=${wildcard*.c}
    对象=${SOURCES:.c=.o}
    依赖项=${OBJECTS:.o=.d}
    程序=${patsubst%.c,%,${wildcard test*.c}
    INCLUDE=-I/usr/INCLUDE/SDL-I../src
    LDFLAGS=-lm-lSDL-lSDL\u图像
    CCFLAGS=-O2-g-Wall-pedantic${INCLUDE}
    全部:${PROGRAM}
    测试%:测试%.o
    ${CC}${CCFLAGS}$+../src/*.o-o$@${LDFLAGS}
    #-包含${dependens}
    #%d.d:%
    #${CPP}${CCFLAGS}$<-M