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

Во время make clean я пытаюсь переопределить определенную переменную, чтобы очистить все выходы:

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

LIBNAME построен как:

 ARCH=64 PROJNAME=libWebSightR220 LIBNAME=$(PROJNAME)x$(ARCH) 

Ожидается, что пользователь будет использовать make lib ARCH=32 для сборки 32. Мой код для изменения ARCH :

 make: override: Command not found 

Я также пытался обновить make, но он уже обновлен:

 XXXXX@debianvirtualbox:~/$ make --version GNU Make 4.0 Built for x86_64-pc-linux-gnu Copyright (C) 1988-2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. 

  • Как написать makefile для массовой обработки?
  • Пожалуйста, объясните, что происходит, когда я запускаю этот Makefile
  • Ошибка Makefile: имя пустой переменной
  • Создание файла Makefile
  • Переопределить a: = в другом файле makefile
  • Как перечислить все цели в make?
  • Ошибка «Нет цели» с использованием Make
  • Где расположена база данных?
  • 2 Solutions collect form web for “make: override: команда не найдена”

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

     override ARCH=64 all: echo $(ARCH) 

    EDIT: способ достижения желаемого (по крайней мере, с GNU make) заключается в следующем:

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

    BTW: таким образом оба make ARCH=45 и ARCH=45 make выведут «32 \ n64», без override первая будет выводить «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 
    Linux и Unix - лучшая ОС в мире.