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