如何使这个Makefile变得更好/更容易/更少冗余?

如何使这个Makefile变得更好/更容易/更少冗余?,makefile,Makefile,我想要一些关于以下Makefile的建议。它工作得很好,但是它过于冗余,并且没有利用make所能做的任何帮助C项目的魔法 其目的是测试一个小型ANSI C库。可移植性很重要 .PHONY : test OPTIMIZE = -g INCLUDE = -I. CC = gcc WARNINGS = -Wall -ansi -pedantic -Wno-long-long -Wextra -Wdeclaration-after-statement -Wendif-labels -Wc

我想要一些关于以下Makefile的建议。它工作得很好,但是它过于冗余,并且没有利用make所能做的任何帮助C项目的魔法

其目的是测试一个小型ANSI C库。可移植性很重要

.PHONY : test

OPTIMIZE = -g
INCLUDE  = -I.
CC       = gcc
WARNINGS = -Wall -ansi -pedantic -Wno-long-long -Wextra -Wdeclaration-after-statement -Wendif-labels -Wconversion
CFLAGS   = $(WARNINGS) $(OPTIMIZE) $(INCLUDE)
COMPILE  = $(CC) $(CFLAGS)
LINK     = $(COMPILE)

all : time64.o bin/check_max

bin/check_max : time64.o time64_config.h bin/check_max.c
    $(LINK) time64.o bin/check_max.c -o $@

time64.o : time64_config.h time64.h time64.c Makefile

t/bench : t/bench.c time64.o
    $(LINK) time64.o t/bench.c -o $@

bench : t/bench
    time t/bench

t/localtime_test : t/localtime_test.c time64.o
    $(LINK) time64.o t/localtime_test.c -o $@

t/gmtime_test : t/gmtime_test.c time64.o
    $(LINK) time64.o t/gmtime_test.c -o $@

t/year_limit.t : t/tap.c t/year_limit.t.c time64.o
    $(LINK) time64.o t/year_limit.t.c -o $@

t/negative.t : t/tap.c t/negative.t.c time64.o
    $(LINK) time64.o t/negative.t.c -o $@

t/overflow.t : t/tap.c t/overflow.t.c time64.o
    $(LINK) time64.o t/overflow.t.c -o $@

t/timegm.t : t/tap.c t/timegm.t.c time64.o
    $(LINK) time64.o t/timegm.t.c -o $@

t/safe_year.t : t/tap.c t/safe_year.t.c time64.c
    $(LINK) t/safe_year.t.c -o $@

t/gmtime64.t : t/tap.c t/gmtime64.t.c time64.o
    $(LINK) time64.o t/gmtime64.t.c -o $@

t/mktime64.t : t/tap.c t/mktime64.t.c time64.o
    $(LINK) time64.o t/mktime64.t.c -o $@

t/asctime64.t : t/tap.c t/asctime64.t.c time64.o
    $(LINK) time64.o t/asctime64.t.c -o $@

t/ctime64.t : t/tap.c t/ctime64.t.c time64.o
    $(LINK) time64.o t/ctime64.t.c -o $@

t/seconds_between_years.t : t/tap.c t/seconds_between_years.t.c time64.c
    $(LINK) t/seconds_between_years.t.c -o $@

test : tap_tests localtime_tests

localtime_tests: t/localtime_test t/gmtime_test
    @which bzdiff > /dev/null || (echo 'You need bzdiff to run these tests'; exit 1)
    @which less   > /dev/null || (echo 'You need less to run these tests';   exit 1)
    @echo "On failure, these tests will produce a diff between the failed and expected results.  If they pass they'll be quiet."
    TZ=Canada/Eastern t/gmtime_test | bzip2 -9 > t/gmtime_test.out.bz2
    bzdiff -u t/gmtime_test.out.bz2 t/gmtime.out.bz2 | less -F
    TZ=Canada/Eastern t/localtime_test | bzip2 -9 > t/eastern_test.out.bz2
    bzdiff -u t/eastern_test.out.bz2 t/eastern.out.bz2 | less -F
    TZ=Australia/West t/localtime_test | bzip2 -9 > t/oz_test.out.bz2
    bzdiff -u t/oz_test.out.bz2 t/oztime.out.bz2 | less -F

tap_tests: t/year_limit.t t/negative.t t/overflow.t t/timegm.t t/safe_year.t t/gmtime64.t t/asctime64.t t/ctime64.t
    @which prove > /dev/null || (echo 'You need prove (from the Test::Harness perl module) to run these tests'; exit 1)
    @prove --exec '' t/*.t

clean:
    -rm     t/*.t           \
        t/localtime_test    \
        t/gmtime_test       \
        t/*_test.out.bz2    \
        t/bench         \
        *.o

.

使用隐式规则,不要重新声明可以自动发现的内容。还简化了顶部的变量,但这是更多的首选项(一些只是重置默认值)。IMHO说,这可能稍微不便于携带,但也不是很方便。它在某些方面也更具可移植性,例如在“gcc”不是默认编译器的系统上

使localtime_测试和tap_测试成为shell脚本(但不改变它们的功能),将该逻辑转移到其他地方,这是使makefile每天可读的主要内容

CFLAGS = -g -Wall -ansi -pedantic -Wno-long-long -Wextra \ -Wdeclaration-after-statement -Wendif-labels -Wconversion all : bin/check_max bin/check_max : time64.o time64_config.h time64.o : time64_config.h time64.h Makefile bench : t/bench time t/bench t/bench : t/bench.c time64.o t/localtime_test : time64.o t/gmtime_test : time64.o t/year_limit.t: t/tap.c time64.o t/negative.t : t/tap.c time64.o t/overflow.t : t/tap.c time64.o t/timegm.t : t/tap.c time64.o t/safe_year.t : t/tap.c time64.c t/gmtime64.t : t/tap.c time64.o t/mktime64.t : t/tap.c time64.o t/asctime64.t : t/tap.c time64.o t/ctime64.t : t/tap.c time64.o t/seconds_between_years.t: t/tap.c time64.c test : tap_tests localtime_tests tap_tests: t/year_limit.t t/negative.t t/overflow.t t/timegm.t t/safe_year.t \ t/gmtime64.t t/asctime64.t t/ctime64.t ./tap_tests localtime_tests: t/localtime_test t/gmtime_test ./localtime_tests .PHONY : test tap_tests localtime_tests clean: -rm t/*.t t/localtime_test t/gmtime_test t/*_test.out.bz2 t/bench -rm *.o .PHONY : clean CFLAGS=-g-Wall-ansi-pedantic-Wno long-Wextra\ -Wdeclaration after语句-Wendif标签-Wconversion 所有:箱/检查最大值 bin/check_max:time64.o time64_config.h time64.o:time64_config.h time64.h Makefile 工作台:t/工作台 时间t/台架 t/台架:t/台架.c时间64.o t/localtime\u测试:time64.o t/gmtime_测试:time64.o t/year_limit.t:t/tap.c time64.o t/negative.t:t/tap.c time64.o t/overflow.t:t/tap.c time64.o t/timegm.t:t/tap.c time64.o t/safe_year.t:t/tap.c time64.c t/gmtime64.t:t/tap.c time64.o t/mktime64.t:t/tap.c time64.o t/asctime64.t:t/tap.c time64.o t/ctime64.t:t/tap.c time64.o 年与年之间的时间。t:t/tap.c time64.c 测试:点击测试本地时间测试 抽头测试:t/年\极限.t/负.t/溢出.t/时间GM.t/安全\年.t\ t/gmtime64.t/asctime64.t/ctime64.t /抽头测试 localtime\u测试:t/localtime\u测试t/gmtime\u测试 ./localtime\u测试 .PHONY:test tap\u tests localtime\u tests 清洁: -rm t/*.t t/localtime\u test t/gmtime\u test t/*.u test.out.bz2 t/台架 -rm*.o .假冒:干净
如果这种可移植性的丧失是可以接受的,那么您可以利用GNUmake特定的特性来实现均衡。

使用隐式规则,不要重新声明make可以自动发现的东西。还简化了顶部的变量,但这是更多的首选项(一些只是重置默认值)。IMHO说,这可能稍微不便于携带,但也不是很方便。它在某些方面也更具可移植性,例如在“gcc”不是默认编译器的系统上

使localtime_测试和tap_测试成为shell脚本(但不改变它们的功能),将该逻辑转移到其他地方,这是使makefile每天可读的主要内容

CFLAGS = -g -Wall -ansi -pedantic -Wno-long-long -Wextra \ -Wdeclaration-after-statement -Wendif-labels -Wconversion all : bin/check_max bin/check_max : time64.o time64_config.h time64.o : time64_config.h time64.h Makefile bench : t/bench time t/bench t/bench : t/bench.c time64.o t/localtime_test : time64.o t/gmtime_test : time64.o t/year_limit.t: t/tap.c time64.o t/negative.t : t/tap.c time64.o t/overflow.t : t/tap.c time64.o t/timegm.t : t/tap.c time64.o t/safe_year.t : t/tap.c time64.c t/gmtime64.t : t/tap.c time64.o t/mktime64.t : t/tap.c time64.o t/asctime64.t : t/tap.c time64.o t/ctime64.t : t/tap.c time64.o t/seconds_between_years.t: t/tap.c time64.c test : tap_tests localtime_tests tap_tests: t/year_limit.t t/negative.t t/overflow.t t/timegm.t t/safe_year.t \ t/gmtime64.t t/asctime64.t t/ctime64.t ./tap_tests localtime_tests: t/localtime_test t/gmtime_test ./localtime_tests .PHONY : test tap_tests localtime_tests clean: -rm t/*.t t/localtime_test t/gmtime_test t/*_test.out.bz2 t/bench -rm *.o .PHONY : clean CFLAGS=-g-Wall-ansi-pedantic-Wno long-Wextra\ -Wdeclaration after语句-Wendif标签-Wconversion 所有:箱/检查最大值 bin/check_max:time64.o time64_config.h time64.o:time64_config.h time64.h Makefile 工作台:t/工作台 时间t/台架 t/台架:t/台架.c时间64.o t/localtime\u测试:time64.o t/gmtime_测试:time64.o t/year_limit.t:t/tap.c time64.o t/negative.t:t/tap.c time64.o t/overflow.t:t/tap.c time64.o t/timegm.t:t/tap.c time64.o t/safe_year.t:t/tap.c time64.c t/gmtime64.t:t/tap.c time64.o t/mktime64.t:t/tap.c time64.o t/asctime64.t:t/tap.c time64.o t/ctime64.t:t/tap.c time64.o 年与年之间的时间。t:t/tap.c time64.c 测试:点击测试本地时间测试 抽头测试:t/年\极限.t/负.t/溢出.t/时间GM.t/安全\年.t\ t/gmtime64.t/asctime64.t/ctime64.t /抽头测试 localtime\u测试:t/localtime\u测试t/gmtime\u测试 ./localtime\u测试 .PHONY:test tap\u tests localtime\u tests 清洁: -rm t/*.t t/localtime\u test t/gmtime\u test t/*.u test.out.bz2 t/台架 -rm*.o .假冒:干净
如果这种便携性的损失可以接受,您可以利用GNUmake的特定功能来实现均衡。

谢谢!我采纳了你的大部分建议,这也迫使我清理测试代码中一些难看的部分。我将CFLAGS分为几部分,因为我认为您希望更改生产的优化标志,但不要使用警告标志。稍后我将把localtime_测试规范化为一个Perl脚本。谢谢!我采纳了你的大部分建议,这也迫使我清理测试代码中一些难看的部分。我将CFLAGS分为几部分,因为我认为您希望更改生产的优化标志,但不要使用警告标志。稍后我将把localtime_测试规范化为一个Perl脚本。