Можно ли присваивать переменным make-файла значения, считанные из исходных файлов? - PullRequest
5 голосов
/ 20 июля 2010

Предположим, что есть программа на C, которая хранит свою версию в глобальном char* в main.c. Может ли система сборки (gnu make) каким-то образом извлечь значение этой переменной во время сборки, чтобы исполняемый файл мог иметь точное имя версии, как оно отображается в программе?

Чего я хотел бы добиться, так это источника:

char g_version[] = "Superprogram 1.32 build 1142";

система сборки сгенерирует исполняемый файл с именем Superprogram 1.32 build 1142.exe

Ответы [ 4 ]

5 голосов
/ 20 июля 2010

Определите переменную вашей версии из макроса:

char g_version[] = VERSION;

затем заставьте ваш make-файл поставить аргумент -D в командной строке при компиляции

gcc hack.c -DVERSION=\"Superprogram\ 1.99\"

И, конечно, в вашем примере вы должны использовать sed / grep / awk и т. Д. Для генерации строки версии.

5 голосов
/ 20 июля 2010

Функция shell позволяет вызывать внешние приложения, такие как sed, которые можно использовать для анализа источника на предмет требуемой информации.

1 голос
/ 20 июля 2010

Вы можете использовать любую комбинацию текстовых инструментов Unix (grep, sed, awk, perl, tail, ...) в вашем Makefile, чтобы извлечь эту информацию из исходного файла.

0 голосов
/ 03 апреля 2015

Обычно версия определяется как композиция из нескольких #define значений (например, в arv library ).

Итак, давайте рассмотрим простой и рабочий пример:

// myversion.h
#define  __MY_MAJOR__ 1
#define  __MY_MINOR__ 8

Затем в вашем Makefile:

# Makefile
source_file := myversion.h
MAJOR_Identifier := __MY_MAJOR__
MINOR_Identifier := __MY_MINOR__

MAJOR := `cat $(source_file) | tr -s ' ' | grep "\#define $(MAJOR_Identifier)" | cut -d" " -f 3`
MINOR := `cat $(source_file) | tr -s ' ' | grep '\#define $(MINOR_Identifier)' | cut -d" " -f 3`

all:
  @echo "From the Makefile we extract: MAJOR=$(MAJOR) MINOR=$(MINOR)"

Объяснение

Здесь я использовал несколько инструментов, чтобы они были более надежными:

  • tr -s ' ': чтобы удалить дополнительное пространство между элементами,
  • grep: чтобы выбрать уникальную строку, соответствующую нашей цели,
  • cut -d" " -f 3: извлечь третий элемент выбранной строки, который является целевым значением!

Обратите внимание, что определяемые значения могут быть любыми (не только числовыми).

Остерегайтесь использовать := (не =), см .: https://stackoverflow.com/a/10081105/4716013

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...