Шаг перед сборкой в make-файле

PIL обрабатывает данные EXIF, не так ли? Посмотрите в PIL.ExifTags.

30
задан pingul 31 August 2017 в 08:19
поделиться

5 ответов

Я предлагаю два решения. Первая имитирует то, что генерирует IDE NetBeans:

CC=gcc

.PHONY: all clean

all: post-build

pre-build:
    @echo PRE

post-build: main-build
    @echo POST

main-build: pre-build
    @$(MAKE) --no-print-directory target

target: $(OBJS)
    $(CC) -o $@ $(OBJS)

clean:
    rm -f $(OBJS) target

Вторая основана на том, что генерирует Eclipse IDE:

CC=gcc

.PHONY: all clean
.SECONDARY: main-build

all: pre-build main-build

pre-build:
    @echo PRE

post-build:
    @echo POST

main-build: target

target: $(OBJS)
    $(CC) -o $@ $(OBJS)
    @$(MAKE) --no-print-directory post-build

clean:
    rm -f $(OBJS) target

Обратите внимание, что в первой сборка до и после сборки всегда вызывается независимо от того, установлена ​​ли основная сборка. на сегодняшний день или нет.

Во втором шаге после сборки не выполняется, если состояние основной сборки является актуальным. Хотя этап предварительной сборки всегда выполняется в обоих.

29
ответ дан 27 November 2019 в 23:59
поделиться

В зависимости от вашей версии make , что-то вроде следующего не должно запускаться десятки раз, если CFLAGS и AFLAGS оцениваются десятки раз :

CHEAT_ARG := $(shell myscript)

Обратите внимание на двоеточие.

Выполняется ровно один раз. Не более одного раза, но и не менее одного раза. Выбирайте собственные компромиссы.

11
ответ дан 27 November 2019 в 23:59
поделиться

Вы можете добавить специальную цель в свой Makefile, и все ваши правила сборки будут зависеть от этого:

run-script:
    myscript

.o.c: run-script
     $(CC) $(CFLAGS) -o $@ $<

.o.S: run-script
     $(AS) $(AFLAGS) -o $@ $<

В зависимости от того, что на самом деле делает ваш скрипт, запуск его один раз на этапе перед Makefile (этап настройки в терминах autoconf) мог бы иметь еще больше смысла (и потребовать меньше усилий).

5
ответ дан 27 November 2019 в 23:59
поделиться

То, что вы предлагаете, кажется немного "непонятным". Почему бы просто не запустить команду в любом целевом файле makefile, который вам нужен раньше?

Пример, если вам нужно запустить ее перед компоновкой foo :

foo: ${OBJS}
    my-command-goes-here
    ${CC} -o $@ ${OBJS} ${LIBS}
3
ответ дан 27 November 2019 в 23:59
поделиться

Спасибо за ответы. ndim мне очень помог, asveikau . Последний файл - это один двоичный исполняемый файл, поэтому я могу использовать что-то вроде этого:

run-script:
    myscript
$(AXF_FILE): run-script $(OBJ_DIRS) $(OBJ_FILES)
    $(LINK) #......

Он запускает myscript один раз. Значение {AXF_FILE} зависит от myscript, и я должен запустить его до . И в этом случае myscript запускается всегда, а не только тогда, когда требуется перестройка. После этого мне пришел в голову Простейший ответ :

all: run-script $(AXF_FILE)

Это все ;) (Конечно, вместо «все» можно использовать любую цель)


Изменить: этот метод выполняет скрипт после вычисления $ (AXF_FILE) . Так что можно получить неправильное значение AXF_FILE. Теперь только первый ответ от ndim работает так, как мне нужно.

1
ответ дан 27 November 2019 в 23:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: