Как сказать make не перекомпилировать, если я удаляю объектные файлы? - PullRequest
1 голос
/ 17 января 2012

В качестве хобби я написал простой компилятор и написал несколько тестовых файлов, чтобы убедиться, что он работает нормально. Я также добавил несколько строк в мой make-файл, чтобы я мог одной командой скомпилировать мой компилятор, скомпилировать (используя его) тестовые файлы, собрать их и связать их. Проблема в том, что если я удаляю объектные файлы (с которыми компилятор был связан) и говорю make для запуска теста, он перекомпилирует мой компилятор, хотя этот двоичный файл все еще существует. Как я могу сказать make, чтобы не делать этого? (Но я все еще хочу, чтобы опция make заставила make перекомпилировать измененные исходные файлы и заново связать мой компилятор).

несколько строк из моего make-файла:

OBJS=asm.o main.o type.o var.o ...
SAMPLES=arr.out sample.out ...
SAMPASM=arr.asm sample.asm ...

all: myc

myc: ${OBJS}
    ${CC} ${LDFLAGS} -o myc ${OBJS}

%.o: src/%.c src/myc.h
    $(CC) $(CFLAGS) $< -o $@

test: ${SAMPLES} ${SAMPASM}

%.out: %.aso asm/com.aso
    ld $< asm/com.aso -o $@

%.aso: %.asm
    nasm -f elf64 $< -o $@

%.asm: samples/%.myc myc
    ./myc $< -o $@

clean:
    rm -f *.o *.out *.asm myc

Ответы [ 2 ]

4 голосов
/ 17 января 2012

Вы можете использовать .SECONDARY или .INTERMEDIATE

С http://theory.uwinnipeg.ca/localfiles/infofiles/make/make_36.html

.INTERMEDIATE Обрабатываются цели, от которых зависит .INTERMEDIATE в качестве промежуточных файлов. Смотрите раздел Цепочки неявных правил . .INTERMEDIATE без зависимостей помечает все файловые цели, упомянутые в make-файл как промежуточный.

.SECONDARY Цели, от которых зависит .SECONDARY, рассматриваются как промежуточные файлы, за исключением того, что они никогда не удаляются автоматически. Смотрите раздел Цепочки неявных правил. .SECONDARY без зависимостей помечает все файловые цели, упомянутые в make-файле, как вторичные.

Как правило, если вы хотите, чтобы ваши файлы .o удалялись автоматически, используйте

.INTERMEDIATE: $(OBJS)

Если вы хотите, чтобы make просто не обращал внимания на наличие или отсутствие файлов o, используйте

.SECONDARY: $(OBJS)
0 голосов
/ 18 января 2012

Рекомендация:

  • Отделите ваши тесты от директории сборки компилятора

(То есть вы должны проводить тестирование в отдельном каталоге, чтобы не столкнуться с проблемой.)

Я не возился с GNU Make и .INTERMEDIATE или .SECONDARY файлами; Я не знаю, сделает ли это работу за вас.

Альтернативный вариант, который я вижу для вас, заключается в перекомпиляции всего компилятора каждый раз, когда изменяется любой из его исходных файлов или заголовков:

FILES.c = src/main.c src/type.c src/var.c ...
FILES.s = src/asm.s
FILES.h = src/myc.h ...

PROGRAM = myC

all: ${PROGRAM} test

${PROGRAM}: ${FILES.c} ${FILES.s} ${FILES.h}
    ${CC} ${CFLAGS} -o $@ ${FILES.c} ${FILES.s} ${LDFLAGS} ${LDLIBS}

Хотя компилятор достаточно мал, чтобы это не было болезненным, он будет работать. Однако он полностью исключает преимущества объектных файлов для самого компилятора; это означает, что все всегда перекомпилируется. Но вы можете избавиться от объектных файлов в любое время, так как не задокументировано, что компилятор зависит от них.

Я умеренно убежден, что это неправильный подход, хотя он будет «работать». Вы должны использовать отдельные каталоги для сборки компилятора и запуска тестов на компиляторе.

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