Как сделать этот Makefile лучше / проще / менее избыточным? - PullRequest
0 голосов
/ 07 февраля 2010

Я хотел бы получить несколько советов по поводу следующего Makefile. Он отлично работает, но он чрезмерно избыточен и не использует большинство магических возможностей, которые могут помочь проекту 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

Вы можете увидеть это на месте здесь .

1 Ответ

3 голосов
/ 07 февраля 2010

Используйте неявные правила и не пересказывайте вещи, которые могут выяснить автоматически. Также упрощены переменные вверху, но это больше предпочтение (некоторые просто сбрасывают значения по умолчанию). Это, возможно, немного менее переносимо, но не так значительно, ИМХО. это также более портативно в некоторых отношениях, например в системах, где «gcc» не является компилятором по умолчанию.

Превращение localtime_tests и tap_tests в сценарии оболочки (но не изменяя то, что они делают), перемещает эту логику в другое место и является главным, что делает make-файл читаемым ежедневно.

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

Вы можете использовать специфичные для GNUmake функции, чтобы упростить даже больше , если эта потеря переносимости приемлема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...