2010-02-06 4 views
0

Je voudrais des conseils sur le Makefile suivant. Cela fonctionne très bien, mais il est trop redondant et n'utilise pas la majeure partie de la magie que peut faire un projet en C.Comment Makefile peut être rendu meilleur/plus facile/moins redondant?

Son but est de tester une petite bibliothèque C ANSI. La portabilité est importante.

.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 [email protected] 

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

t/bench : t/bench.c time64.o 
    $(LINK) time64.o t/bench.c -o [email protected] 

bench : t/bench 
    time t/bench 

t/localtime_test : t/localtime_test.c time64.o 
    $(LINK) time64.o t/localtime_test.c -o [email protected] 

t/gmtime_test : t/gmtime_test.c time64.o 
    $(LINK) time64.o t/gmtime_test.c -o [email protected] 

t/year_limit.t : t/tap.c t/year_limit.t.c time64.o 
    $(LINK) time64.o t/year_limit.t.c -o [email protected] 

t/negative.t : t/tap.c t/negative.t.c time64.o 
    $(LINK) time64.o t/negative.t.c -o [email protected] 

t/overflow.t : t/tap.c t/overflow.t.c time64.o 
    $(LINK) time64.o t/overflow.t.c -o [email protected] 

t/timegm.t : t/tap.c t/timegm.t.c time64.o 
    $(LINK) time64.o t/timegm.t.c -o [email protected] 

t/safe_year.t : t/tap.c t/safe_year.t.c time64.c 
    $(LINK) t/safe_year.t.c -o [email protected] 

t/gmtime64.t : t/tap.c t/gmtime64.t.c time64.o 
    $(LINK) time64.o t/gmtime64.t.c -o [email protected] 

t/mktime64.t : t/tap.c t/mktime64.t.c time64.o 
    $(LINK) time64.o t/mktime64.t.c -o [email protected] 

t/asctime64.t : t/tap.c t/asctime64.t.c time64.o 
    $(LINK) time64.o t/asctime64.t.c -o [email protected] 

t/ctime64.t : t/tap.c t/ctime64.t.c time64.o 
    $(LINK) time64.o t/ctime64.t.c -o [email protected] 

t/seconds_between_years.t : t/tap.c t/seconds_between_years.t.c time64.c 
    $(LINK) t/seconds_between_years.t.c -o [email protected] 

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 

You can see it in situ here.

Répondre

3

Utilisez des règles implicites et ne redéclarez pas les choses que vous pouvez trouver automatiquement. Aussi simplifié les variables en haut, mais c'est plus préférence (plusieurs simplement réinitialiser les valeurs par défaut). C'est peut-être légèrement moins portable, mais pas de manière significative, à mon humble avis. il est également plus portable à certains égards, par ex. sur les systèmes où 'gcc' n'est pas le compilateur par défaut. Faire localtime_tests et tap_tests dans les scripts shell (mais ne change pas ce qu'ils font), déplace cette logique ailleurs et est la principale chose qui rend le makefile lisible tous les jours.

 
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 

Vous pouvez utiliser des fonctionnalités spécifiques à gnumake simplify même more, si cette perte de la portabilité est acceptable.

+0

Merci! J'ai pris la plupart de vos conseils, ce qui m'a également forcé à nettoyer certains bits disgracieux dans le code de test. J'ai quitté CFLAGS en morceaux parce que je veux changer le drapeau d'optimisation pour la production mais laisser les drapeaux d'avertissement seuls. Je vais normaliser le localtime_tests en tant que script Perl plus tard. – Schwern

Questions connexes