Инструмент для легкого обновления файлов и restore

Make не оценивает назначения переменных в строках рецептов сборки; они строго код оболочки.

В GNU Make вы можете использовать назначение переменной цели для временного изменения значения переменной во время выполнения правил, которые обновляют данную цель.Чтобы воспользоваться этим, мы разделили правило на два:

.PHONY: clean-lib-32 clean-lib-64 clean-lib

clean-lib: clean-lib-32 clean-lib-64

# Target-specific assignments
clean-lib-32: ARCH := 32
clean-lib-64: ARCH := 64

clean-lib-32 clean-lib-64:
        rm -rf $(NEWLIB)$(LIBNAME).so  $(NEWLIB)$(LIBNAME).a

Чтобы это работало, NEWLIB должна быть переменной с задержкой, а не немедленной переменной. То есть:

NEWLIB = whatever$(ARCH)whateverelse

# NOT this:
NEWLIB := whatever$(ARCH)whateverelse

Переменные, созданные с использованием = , хранят нерасширенный текст, который раскрывается при замене (что-то вроде макроса), тогда как : = переменные хранят расширенный текст, который не содержит дополнительных расширений, когда он будет заменен позже. Конечно, нам нужно, чтобы $ (ARCH) было заменено поздно, чтобы его целевое назначение вступило в силу.

Полный тестовый пример:

$ cat Makefile
.PHONY: clean-lib-32 clean-lib-64 clean-lib

NEWLIB = newlib/
LIBNAME = lib-$(ARCH)

clean-lib: clean-lib-32 clean-lib-64

# Target-specific assignments
clean-lib-32: ARCH := 32
clean-lib-64: ARCH := 64

clean-lib-32 clean-lib-64:
        echo rm -rf $(NEWLIB)$(LIBNAME).so  $(NEWLIB)$(LIBNAME).a

Мы можем очистить 32-битную библиотеку, используя ее конкретную цель:

$ make clean-lib-32
echo rm -rf newlib/lib-32.so  newlib/lib-32.a
rm -rf newlib/lib-32.so newlib/lib-32.a

Аналогично с 64-битной библиотекой

$ make clean-lib-64
echo rm -rf newlib/lib-64.so  newlib/lib-64.a
rm -rf newlib/lib-64.so newlib/lib-64.a

Мы можем очистить и то, и другое, используя общую clean-lib цель:

$ make clean-lib
echo rm -rf newlib/lib-32.so  newlib/lib-32.a
rm -rf newlib/lib-32.so newlib/lib-32.a
echo rm -rf newlib/lib-64.so  newlib/lib-64.a
rm -rf newlib/lib-64.so newlib/lib-64.a
0
20.03.2018, 09:05
1 ответ

Похоже, вы пытаетесь заново изобрести колесоуправление версиями .

  1. «определить файлы (как файл манифеста -)для упаковки» — зарегистрировать файлы.
  2. «упаковка определенных файлов в один архив» — содержимое файлов сохраняется в репозитории.
  3. «распаковать эти файлы и при необходимости перезаписать исходные файлы» — проверить старую версию.
  4. «создать резервную копию всех файлов, которые были перезаписаны» — проверка в текущей версии (сделать это перед перезаписью, очевидно ).
  5. «восстановите перезаписанные файлы, если это необходимо» — проверка той другой версии.
1
28.01.2020, 02:43

Теги

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