Фикс ошибок компиляции библиотек в Termux
При компиляции библиотек или утилит порой возникают ошибки, связанные с несовместимостью опций компилятора или их недостаточностью для сборки.
Рабочее решение (проверено на sassc)
Компиляция успешна при использовании флага --disable-march-tune-native
:
gem install sassc --version=2.2.1 -- --disable-march-tune-native
Благодарим @over
!!! Остальная часть статьи остаётся для ознакомления.
Внимание: этот метод не даёт возможность пользоваться результатами компиляции, даже при использовании
-mcpu=native
. Только для ознакомления. Следим за ситуацией: GitHub issue
Источник проблем
Когда собирал этот блог в среде Termux с использованием новой версии Jekyll 4.0, столкнулся с проблемой, что sassc не хочет компилироваться при помощи clang. Ошибка возникала следующая:
error: the clang compiler does not support '-march=native'
Оптимальный вариант конечно сделать issue на GitHub по этому вопросу и ждать у моря погоды, но есть способ быстрее устранить эту проблему.
Убираем опцию
Первый способ решить проблему, который пришёл в голову, — залезть в Makefile и убрать опцию. Но что делать, если компилировать придётся новые версии библиотек? Долго и муторно.
Вторым решением представилось проксировать все вызовы clang через свой скрипт с обрезанием параметра march
. Что собственно я и сделал.
Создал файл ~/bin/clang:
#!/data/data/com.termux/files/usr/bin/env bash
~/../usr/bin/clang "${@/-march=native/}"
Конечно же нужно сделать файл исполняемым: chmod +x ~/bin/clang
.
Подменяем используемый бинарник
Более-менее нормальный способ подмены — дописать в приоритетном порядке к переменной $PATH путь к папке bin
в домашней директории.
Создадим файл ~/../usr/etc/profile.d/set_path_home_bin.sh
с содержанием:
export PATH=$HOME/bin:$PATH
После чего clang
будет искаться сначала в ~/bin.
Этого оказалось недостаточно, пришлось ещё добавить симлинки для архитектурно специфичных clang:
cd ~/bin
ln -s clang aarch64-linux-android-clang
ln -s clang aarch64-linux-android-clang++
После чего перезапускаем сессию терминала и пробуем скомпилировать библиотеки снова.