Использование eval в файле make

Я запускаю buildroot make, и во время этого процесса сборки создается текстовый файл. После этого происходит выполнение другого make как части сборки. Я хочу прочитать содержимое сгенерированного файла в переменной и использовать их. Это не работает, поскольку в начале моего buildroot он видит файл как не существующий, поэтому, даже если он создан до запуска кода, make уже решил, что он не существует.

Формат файла:

str1 str2 1.1.0_nightlybuild (1389:1497M@trunk) 

Я пытаюсь использовать eval (это должно проверять содержимое файла во время работы). Однако проблема сохраняется, я, кажется, не могу читать из файла после его создания. Кажется, make может расширять переменную, и поэтому eval не работает.

Ни одна из переменных не задается из содержимого файла. Я проверяю, и файл был сгенерирован правильно, поэтому, если я запустил make еще раз, когда файл уже сгенерирован, все работает нормально. Является ли eval правильным способом для этого?

Таким образом, файл не существует в начале make, возникает, а затем этот код запускается:

 define EXAMPLE $(eval s := $(shell cat output/target/version.txt)) $(eval FILENAME_BIN=$(word 1, $(s)).$(word 2, $(s)).$(word 3, $(s)).bin) $(eval FILENAME_JFFS2=$(word 1, $(s)).$(word 2, $(s)).$(word 3, $(s)).jffs2) mv $(BINARIES_DIR)/$(BOOTIMAGE) $(BINARIES_DIR)/$(FILENAME_BIN) mv $(BINARIES_DIR)/$(JFFS2IMAGE) $(BINARIES_DIR)/$(FILENAME_JFFS2) endef 

Он не работает, файл сгенерирован и последующие сборки будут работать, а не первый, где файл не существует в начале процесса. В первый раз, когда файлы просто вызывают ...bin и ...jffs2 поскольку переменные, считанные из файла, не заполняются. Когда он работает, файлы называются str1.str2.1.1.0_nightlybuild.bin str1.str2. 1.1.0_nightlybuild.jffs2 str1.str2. 1.1.0_nightlybuild.jffs2

Вот реальный пример использования makefile http://pastebin.com/6GdKcUg6 TEST_DEFAULT_RENAME, где я пытаюсь читать в файле, я использую buildroot (так много файлов make), когда я нажимаю make во время версии buildroot .txt создается по пути, этот код затем пытается прочитать этот файл, но он не работает, если version.text не существует до ввода make в каталог buildroot. Как вы можете видеть, я использую version.txt в другом месте через cat, но это работает нормально.

One Solution collect form web for “Использование eval в файле make”

Лучшим решением является изменение формата вашего файла на то, что make может анализировать напрямую, а затем просто – -include его. make будет знать, чтобы сгенерировать его, и автоматически перезапустить себя после того, как он это сделал. Вы можете выполнить преобразование в правиле, которое генерирует ваш текущий файл или добавляет отдельное правило для создания из него другого файла.

Например, поместите это в Makefile :

 -include datafile all: echo VAR is $(VAR) datafile: Makefile echo "VAR=value" > $@ 

При первом запуске make вы увидите команду, которая генерирует datafile . Если вы используете make -d вы увидите строку, в которой говорится, что Re-executing[1]: make -d где make снова запускается и может читать содержимое datafile .

Если вы запустите make только datafile существует, он запускается только один раз. Но поскольку у него есть параметр в Makefile , если вы отредактируете его, чтобы изменить value для какой-либо другой строки, datafile будет правильно восстановлен.

  • Как выбрать количество цифр в переменной в моих сценариях?
  • Установка переменной со значением по умолчанию ведет себя по-другому, если перед командой?
  • Присвоение нового значения непосредственно в индекс символа значения в массиве с zsh
  • Используйте sed для извлечения переменной из 1 файла и поместите ее в другую
  • Передача переменной из одного сценария в другой
  • Как изменить переменные
  • Как добавить текст в переменную в make-файле?
  • Невозможно назначить вывод вложенных команд переменной в bash
  • Использование sed в сценарии оболочки с многострочными переменными
  • Попытка присвоения не переменной?
  • Как присвоить значение переменной, когда значение содержит символ $ в ней
  • Linux и Unix - лучшая ОС в мире.