PIL обрабатывает данные EXIF, не так ли? Посмотрите в PIL.ExifTags.
Я предлагаю два решения. Первая имитирует то, что генерирует 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
Обратите внимание, что в первой сборка до и после сборки всегда вызывается независимо от того, установлена ли основная сборка. на сегодняшний день или нет.
Во втором шаге после сборки не выполняется, если состояние основной сборки является актуальным. Хотя этап предварительной сборки всегда выполняется в обоих.
В зависимости от вашей версии make
, что-то вроде следующего не должно запускаться десятки раз, если CFLAGS и AFLAGS оцениваются десятки раз :
CHEAT_ARG := $(shell myscript)
Обратите внимание на двоеточие.
Выполняется ровно один раз. Не более одного раза, но и не менее одного раза. Выбирайте собственные компромиссы.
Вы можете добавить специальную цель в свой Makefile, и все ваши правила сборки будут зависеть от этого:
run-script:
myscript
.o.c: run-script
$(CC) $(CFLAGS) -o $@ $<
.o.S: run-script
$(AS) $(AFLAGS) -o $@ $<
В зависимости от того, что на самом деле делает ваш скрипт, запуск его один раз на этапе перед Makefile (этап настройки в терминах autoconf) мог бы иметь еще больше смысла (и потребовать меньше усилий).
То, что вы предлагаете, кажется немного "непонятным". Почему бы просто не запустить команду в любом целевом файле makefile, который вам нужен раньше?
Пример, если вам нужно запустить ее перед компоновкой foo
:
foo: ${OBJS}
my-command-goes-here
${CC} -o $@ ${OBJS} ${LIBS}
Спасибо за ответы. 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 работает так, как мне нужно.