Универсальное экранирование знака доллара

Я работаю над встроенным проектом, который состоит из моего собственного кода, а также сторонних библиотек и исполняемых файлов. Чтобы собрать все части последовательно, я написал скрипт, который устанавливает переменные окружения для кросс-компиляции (CC, CXX, CFLAGS и т.д.). Среди прочего он устанавливает LDFLAGS для передачи флага rpath компоновщику. Значение rpath содержит токен $ORIGIN, который не должен расширяться и должен быть виден компоновщику и записан в выходной двоичный файл как есть. Затем я создаю несколько необходимых сторонних проектов, используя среду, заданную сценарием. В проектах используются разные системы сборки (make, CMake, возможно, другие). Из-за этого и, возможно, из-за того, что скрипты сборки написаны по-разному, знак доллара раскрывается по-разному. То есть, какой бы экран я ни пробовал, я получаю разные результаты в разных проектах (например, $$ORIGIN, RIGIN, пустая строка), но мне никогда не удавалось получить одно и то же значение $ORIGIN во всех двоичных файлах. Есть ли универсальный способ избежать знака доллара, чтобы он работал одинаково, по крайней мере, в make и shell, но в любой комбинации?


person Alex Che    schedule 04.10.2018    source источник


Ответы (2)


Вот как я наконец решил эту проблему. В дополнение к предыдущим переменным среды, необходимым для сборки для моей платформы, я добавил еще две:

ORIGIN=$ORIGIN
O=$$O

Первый из них предназначен для обхода расширения оболочки, а второй — для обхода расширения make-файла. С этим исправлением переменные разрешаются сами в себя. Да, это не похоже на идеальное решение, больше похоже на хак, но пока оно работает, позволяя мне не адаптировать мою среду сборки для каждого стороннего проекта, который я использую.

person Alex Che    schedule 05.10.2018

Я столкнулся с той же проблемой расширения, и вот адаптированная версия для скрипта bash.

LDFLAGS="-Wl,-rpath=\$ORIGIN"

LDFLAGS="-lfoo $LDFLAGS"
LDFLAGS="-L. $LDFLAGS"

echo $LDFLAGS
# -L. -lfoo -Wl,-rpath=$ORIGIN  # <== correct ORIGIN

ORIGIN='$ORIGIN'
eval echo $LDFLAGS
# -L. -lfoo -Wl,-rpath=$ORIGIN  # <== correct ORIGIN
person neok    schedule 28.01.2019