Я пытаюсь установить ripgrep
(ссылка на репо) с функцией pcre2
из исходного кода.
Для этого я запускаю команду cargo build --release --feature 'pcre2'
для сборки exec.
При этом груз пытается собрать несколько файлов C, выдает error: ‘for’ loop initial declarations are only allowed in C99 mode
, а также note: use option -std=c99 or -std=gnu99 to compile your code
и останавливается.
Команда, которую он запускает, — cc -O3 -ffunction-sections -fdata-sections -fPIC -gdwarf-4 [more args...] -o <path-to>-pcre2_script_run.o -c upstream/src/pcre2_script_run.c
.
Я пробовал использовать псевдоним cc
для разных компиляторов, но это не дало эффекта. Как я могу указать флаг cc
(в данном случае std=c99
), чтобы я мог скомпилировать этот проект?
Выполнение cargo new foo ; cd foo ; cargo add pcre2-sys ; cargo build
вызывает ту же ошибку.
Какую ОС вы используете? Какая у вас версия gcc/clang?
Я использую CentOS 7 как пользователь без полномочий root. На нем существует бесчисленное множество версий gcc и clang, включая недавние, честно говоря, я не знаю, какой из них является псевдонимом cc
. Я попробовал изменить псевдонимы cc
, но, к сожалению, это не дало никакого эффекта.
pcre2-sys (от которого зависит ripgrep) действительно не компилируется на CentOS.
Исправление, предложенное в этой проблеме, заключается в использовании export CC=c99
, поскольку крейт cc (который pcre2-sys
использует для компиляции PCRE) использует эту переменную среды, если она определена, для выбора компилятора C.
Он не работал с CC=c99
, потому что тогда возникла другая проблема (опция -gwarf-4
не распознавалась), но это поставило меня на правильный путь (я использовал псевдоним вместо установки переменной env). Мой CC был установлен на gcc. Используя CC=clang cargo build ...
, я смог создать ripgrep с нужной функцией, большое спасибо. Возможно, отредактируйте свое сообщение для тех, кто будет искать правильный ответ. Использование clang версии 17.0.6.
Сможете ли вы создать новый проект с зависимостью
pcre2-sys
или получите ту же ошибку?