LINUX.ORG.RU

Как получить в makefile макро из .h файла?


0

1

Допустим есть сишный .h файл:

#define MYMAKROS 10

Нужно в makefile получить значение этого макроса, в данном случае 10. Макрос может использоваться в сишном файле несколько раз, что создаёт дополнительные трудности для grep.


Ответ на: комментарий от mono

Вы имеете в виду объявить переменную в самом makefile? Просто в мейкфайлах я не очень силён. Если да, то неполучится, т.к. в h файле макрос задаёт версию проги, нужен универсальный makefile, который в зависимости от версии будет выполнять различные действия.

IOne
() автор топика

в configure.ac можно пробить правила для заполнения config.h

ckotinko ☆☆☆
()
Ответ на: комментарий от IOne

как доберусь до дома, скину пример как это делать

ckotinko ☆☆☆
()
Ответ на: комментарий от arsi

У в h файле версия задаётся несколькими макросами, номера версий могут быть разной длинны, так что, я думаю, tail тут не подходит.

IOne
() автор топика
Ответ на: комментарий от IOne

> так что, я думаю, tail тут не подходит.

tail -1 выдает последнюю строку после препроцессора (которая, в данном случае, содержит развёрнутый макрос). а один макрос в несколько строк не может развернуться в принципе.

arsi ★★★★★
()

Не проверял:

$(eval $(shell grep '#define..' | sed s,#define (.*) (.*),\1=\2,))

Но идея не правильная.

Уж лучше

#ifndef MACRO
#define MACRO 10
#endif

CPPFLAGS += -DMACRO=11
r2d2
()
Ответ на: комментарий от r2d2

Собственно - да, именно эту «идею» я и имею в виду.

mono ★★★★★
()
Ответ на: комментарий от IOne

Я может быть не прав, но для таких вещей удобны системы контроля версий. От версии к версии изменяется Makefile. Если вам нужно собрать старую версию, вы просто переходите на нужный коммит(git checkout <хэш_коммита_со_старой_версией>).

netcat ★★
()
Ответ на: комментарий от r2d2

Собственно под Linux собирается образ встраиваемой операционки(ОС2000). Сперва ставится её ядро, потом т.н. пакет поддержки модуля(ППМ), который состоит из драйверов и т.д., что нужно для конкретного железа. Всё это компилируется компилятором, который по синтаксису похож на gcc. makefile один для всех ППМ и ветвится для каждого ППМ. Есть ньюансы сборки ППМ в зависимости от версии ядра. Версия ядра прописана в h файле с помощью трём макросов. Заставить всех клиентов использовать последнюю версию ядра не можем, т.к. техника военная, а военные консервативны и если всё работает, ничего менять не будут + гемор с приёмкой :)

Вариант с дефайном макроса в makefile видимо не подойдёт, т.к. нужно именно узнать макрос в h файле.

IOne
() автор топика
Ответ на: комментарий от r2d2

Ну что ж вы батенька обзываетесь.... autoloolz же :)

Jetty ★★★★★
()

Вообщем можно сделать так:

Допустим есть файл myfile.h и в нём [code]#define MYMAKROS 10[/code]

Создаём скрипт myScript.sh [code=Bash] function fver () { echo $3 ; }; fver `cat -v myfile.h | sed y/^/" «/ | grep -F MYMAKROS` [/code]

В makefile [code] MYMAKROS:= ${shell ./myScript.sh} [/code]

Т.е. функции передайтся 3 аргумента:#define, MYMAKROS и 10, выводим третий аргумент, в данном случае 10.

Но мне желательно сделать всё в makefile, но вот незадача, [code] MYMAKROS:= ${shell function fver () { echo $3 ; }; fver `cat -v myfile.h | sed y/^/» «/ | grep -F MYMAKROS`} [/code] не работает, почему-то функции не передаётся аргумент, хотя если набрать это в консоли: [code=Bash] function fver () { echo $3 ; }; fver `cat -v myfile.h | sed y/^/» «/ | grep -F MYMAKROS` [/code] то всё работает.

IOne
() автор топика
Ответ на: Дёшево и сердито от unsigned

И эту getversion надо собирать каждый раз перед началом сборки основной системы.

amomymous ★★★
()
Ответ на: комментарий от IOne

Проблема решена, нады было в мейкфайле ставить два $ перед переменной.

IOne
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.