make: override: Команда не найдена

[115743]Когда вы создаете раздел, он содержит все, что было раньше. Например, если вы удалите раздел, содержащий файловую систему, и воссоздадите раздел в том же самом месте, не записывая его в это пространство между разделами, то файловая система, которая была там раньше, останется нетронутой. Если новый раздел начинается в том же месте, что и старый, но больше, вы можете продолжить использовать файловую систему или (если файловая система поддерживает его) расширить его, чтобы заполнить лишнее пространство. Если новый раздел меньше, вы можете продолжать использовать файловую систему - но вы должны уменьшить его до размера нового раздела перед удалением старого раздела.

Так что здесь у вас есть файловая система, или, может быть, только начало файловой системы, оставленное с раздела, который начинается с того же самого места. Многие версии [116237]mkfs[116238] отказываются перезаписывать то, что кажется существующей файловой системой, потому что часто это признак того, что вы указали неправильный раздел, и ошибка может быть катастрофической. Если вы хотите перезаписать существующую файловую систему, вам нужно сначала стереть часть ее, достаточно, чтобы сделать ее неузнаваемой. Linux поставляется с утилитой

wipefs

для этого.

Обнуление достаточного количества байт (скажем, пары мегабайт) в начале раздела имеет тот же эффект.[115748].

1
30.09.2015, 15:24
2 ответа

Это не имеет ничего общего с используемой вами версией make. Команда, которую вы вводите после строки 'target: dependencies', выполняется через оболочку, и просто нет команды Linux с именем override . переопределение является внутренней директивой make и не может применяться в этой позиции. Это будет работать, например, вот так:

override ARCH=64
all:
    echo $(ARCH)

РЕДАКТИРОВАТЬ: Путь к достижению желаемого (по крайней мере, с помощью GNU make) следующий

all:
    $(eval override ARCH=32)
    echo $(ARCH)
    $(eval override ARCH=64)
    echo $(ARCH)

Кстати: таким образом оба делают ARCH = 45 и ARCH = 45 make выведет «32 \ n64», без переопределения первый выведет «45 \ n45», и только последний выведет «32 \ n64».

2
27.01.2020, 23:27

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
1
27.01.2020, 23:27

Теги

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