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. 

  • Функция файла в make-файле принимает аргументы с префиксом '@'
  • Ошибка «Нет цели» с использованием Make
  • makefile использует тот же прием для нескольких целей
  • Ошибка Makefile: имя пустой переменной
  • Как удалить конечные пробелы из переменной makefile?
  • Получить каталог верхнего уровня из переменной makefile
  • Уроки GNU Makefile
  • Есть ли прочь, чтобы заставить 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 
    Interesting Posts

    Почему время «кражи» постепенно увеличивается?

    База данных команд команд и идентификационные файлы

    Создать dpkg .deb имя файла

    Родная и не родная поддержка потокового / процесса программирования в Linux?

    netcat: отправить текст в службу эха, прочитать ответ, затем выйти

    /usr/include/stdio.h:140: ошибка синтаксического анализа перед `__gnuc_va_list '

    Являются ли модули, перечисленные в разделе / ​​sys / module, всеми загруженными модулями?

    udisks2 – acl не может получить права на запись для обычного пользователя

    apache2 Неверная команда 'SSLEngine'

    Как получить список приложений, связанных с файлом, используя командную строку

    ssh туннель на ssh-туннеле между Windows и двумя Linux-машинами

    Linux / FVWM / Acroread – не авторизовать

    Как использовать tshark для выполнения этой задачи

    Яркость экрана в Debian после сна / спящего режима на Macbook с графической картой Intel

    Как удалить символы текста в одной строке перед конкретным символом?

    Linux и Unix - лучшая ОС в мире.