LINUX.ORG.RU

Вставка bash-команд в Makefile. Передача переменных.

 , ,


0

1

Есть сборка RPM-пакетов софтины через rpmbuild. Задача стоит опакетить это под DEB. Для сборки запускается shell-скрипт, который тянет исходники из git, патчит их, парсит конфигурацию сборки и выставляет -D и -I для сборки в переменных для Makefile-ов через export, и запускает rpmbuild.

rpmbuild делает в итоге

make -C каталог all
и собирает RPM-ы из бинарников. На замену rpmbuild решено было использовать свой Makefile. Shell-скрипт поправлен так, чтобы вызывал этот скрипт
make -f make_deb.mak
. Из shell в Makefile переменные передаются через export, все нормально, переменные видны. Но в Makefile при сборке target-ов происходит что-то мне непонятное. Для теста сделал отдельный пример.

var = ""
val = "value"
num = 1

.PHONY: all

all: test6

test:
	echo "1#### "$$var ; \
	if [ -z $$var ] ; then \
	    var="$(val)";  \
	    echo "2#### var="$$var; \
	else \
	    echo "3#### FAIL"; \
	fi; \
	echo "4#### "$$var

test4:
	echo "##### test4"$(optflags)
	if [ -z "${CFLAGS}" ]; \
	then \
	    CFLAGS=${optflags}; \
	    echo $$CFLAGS ; \
	fi ; \
	echo $$CFLAGS

test6:
	@PYTHON=/usr/bin/python3 ; \
	TESTVAR=test ; \
	env ; \
	echo $(PYTHON) ; \
	./a.sh

Заданные в Makefile переменные, в нем же видны (test). Заданные в bash-консоли переменные видны (test4).

optflags=anyflags; make -f b.sh test4
Заданные во фрагменте shell-кода (test6) переменные не видны ни в следующих командах вставки, ни в вызываемом ./a.sh (там тоже просто echo $(PYTHON)). Какую магию нужно использовать в этом случае?

echo $(PYTHON)

Зачем там скобки?
Для отладки сценариев пропиши в начало скрипта set -x и смотри выхлоп в консоли

redwagon
()

Это нормальное поведение оболочки:

[~]$ BLA=test
[~]$ env | grep BLA
[~]$ export BLA=test
[~]$ env | grep BLA
BLA=test
xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Спасибо. Про export тоже подсказали коллеги. Что-то мне казалось, что я его уже пробовал сегодня.

bugs-bunny
() автор топика
Ответ на: комментарий от Deleted

Вот это не совсем понял про $$. Сейчас перечитаю. Экранирует 2-й $ чтобы он выполнился в shell команде, а не подставился в Makefile?

6.1 Basics of Variable References

To substitute a variable’s value, write a dollar sign followed by the name of the variable in parentheses or braces: either ‘$(foo)’ or ‘${foo}’ is a valid reference to the variable foo. This special signifcance of ‘$’ is why you must write ‘$$’ to have the effect of a single dollar sign in a file name or recipe

bugs-bunny
() автор топика
Ответ на: комментарий от vodz

У меня еще не кстати стоял коммент посреди строчки, который тоже портил ход выполнения скрипта не в тестовом, а в основном make_deb.mak. Как-то болезненно make к такому, к пустым строкам в правиле и отступам относится. Обязательно ему дай Tab-ы и пустую строку в конце.

test6:
	@export PYTHON=/usr/bin/python3 ; \
	export TESTVAR=test ; \
        # comment
	env ; \
	echo $${PYTHON} ; \
	./a.sh
bugs-bunny
() автор топика

а зачем делать rpm или deb именно через make ?
чем это лучше отдельных скриптов типа:
1. make all_from_source
2. make_rpm.sh
3. make_deb.sh

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

а зачем делать rpm или deb именно через make ?

Затем, что

1)вся сборка 9шт RPM уже сделана через sh и spec файлы, около 2,5К строк в 2 файлах. Make и опакечивание в RPM-ы описаны в spec-файле. Это стандартный путь сборки RPM https://rpm-packaging-guide.github.io/. В Debian есть rpmbuild, но собрать deb-пакет и даже rpm-пакет, как например под RHEL, не получится, см.п.3.

2) rpmbuild заточен только на RPM-ы. Сборка DEB выглядит иначе. Makefile для нее достаточно. Но боюсь под нее придется корежить и Makefile компонентов тоже, см.п.3.

3) Пакеты зависимостей для RHEL и Debian, библиотеки, называются по-разному.

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