Использование 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 будет правильно восстановлен.

  • Невозможно выполнить сценарий Bash, если / while
  • Bash: Назначение переменной не похоже на «stick»
  • Разделить команду и аргументы и вставить в переменную в сценарий bash
  • grep переменная в выражении if
  • Как выбрать количество цифр в переменной в моих сценариях?
  • Столкновение видимых переменных переменных
  • Используйте sed для извлечения переменной из 1 файла и поместите ее в другую
  • Чтение переменных без bash из файла в скрипт bash
  • перечислить файлы и сохранить их в переменных
  • имя сценария скрипта echo text name для циклизации нескольких текстов
  • захватить из текстового файла диапазон с использованием двух переменных в качестве начального и конечного параметров
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.