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