wipefsТак что здесь у вас есть файловая система, или, может быть, только начало файловой системы, оставленное с раздела, который начинается с того же самого места. Многие версии [116237]mkfs[116238] отказываются перезаписывать то, что кажется существующей файловой системой, потому что часто это признак того, что вы указали неправильный раздел, и ошибка может быть катастрофической. Если вы хотите перезаписать существующую файловую систему, вам нужно сначала стереть часть ее, достаточно, чтобы сделать ее неузнаваемой. Linux поставляется с утилитой
для этого.
Обнуление достаточного количества байт (скажем, пары мегабайт) в начале раздела имеет тот же эффект.[115748].
Это не имеет ничего общего с используемой вами версией 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».
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