Flymake CFGERR с помощью пользовательской команды g++
Я пытаюсь получить подсветку синтаксиса для кода C++, работающего в Emacs, используя flymake. Я знаю, что со стандартной конфигурацией flymake для C++ он попытается запустить make syntax-check
Однако моя система сборки не использует Makefile (или, по крайней мере, не напрямую). Он использует rosmake, который является оберткой над cmake для системы ROS.
Чтобы обойти тот факт, что у меня нет контроля над Makefile, я пытался добавить пользовательскую проверку flymake на основе сайта flymake и этого вопроса stackru.
Я создал команду g++ -Wall -Wextra -fsyntax-only -Iinclude_dir file_to_check.cpp
, Когда я запускаю команду в bash, я получаю ожидаемый результат. Без синтаксических ошибок у меня есть код выхода 0 и нет вывода. С синтаксическими ошибками у меня есть код выхода 1 и ошибки, перечисленные в строке. Однако всякий раз, когда я пытаюсь запустить это с flymake, я получаю CFGERR и мне говорят, что flymake отключен.
Я почти уверен, что выполняется правильная команда, потому что ошибка отображает полную команду, и все выглядит так же, как то, что я печатаю в терминале. Я поднял уровень регистрации до 3, чтобы увидеть, в чем проблема. Есть ошибка примерно на полпути через журнал
file /home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster.cpp, init=flymake-cc-init [3 times]
create-temp-inplace: file=/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster.cpp temp=/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster_flymake.cpp
saved buffer Broadcaster.cpp in file /home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster_flymake.cpp
started process 14517, command=(g++ -Wall -Wextra -fsyntax-only -std=c++0x -I/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/include -I/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/msg_gen/cpp/include -I/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/srv_gen/cpp/include -I/opt/ros/fuerte/include
Broadcaster_flymake.cpp), dir=/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/
received 40 byte(s) of output from process 14517
file /home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster.cpp, init=flymake-cc-init
parsed 'g++: error: : No such file or directory', no line-err-info
file /home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster.cpp, init=flymake-cc-init
process 14517 exited with code 1
cleaning up using flymake-simple-cleanup
deleted file /home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/src/Broadcaster_flymake.cpp
Broadcaster.cpp: 0 error(s), 0 warning(s), 0 info in 0.07 second(s)
switched OFF Flymake mode for buffer Broadcaster.cpp due to fatal status CFGERR, warning Configuration error has occured while running (g++ -Wall -Wextra -fsyntax-only -std=c++0x -I/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/include -I/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/msg_gen/cpp/include -I/home/rhololkeolke/ros_workspace/team-hku-drc/robot_code/state_trigger/srv_gen/cpp/include -I/opt/ros/fuerte/include
Broadcaster_flymake.cpp)
Основной ошибкой является parsed 'g++: error: : No such file or directory', no line-err-info
, Я подумал, что это может быть из-за того, что Broadcaster_flymake.cpp так и не был создан, но я проверил это, и похоже, что оно работает. Я получаю эти ошибки независимо от того, есть ли синтаксическая ошибка. Я не могу понять, почему он не может найти файл, так как копирование и вставка команды в Bash работает отлично. Я тоже пробовал (shell-command "g++")
в буфере только для того, чтобы убедиться, что emacs находит двоичный файл g++, и это так.
Если у вас есть идеи, почему flymake не запускает команду, пожалуйста, дайте мне знать. Спасибо.
1 ответ
Я понял, в чем проблема. Я перегружал функцию flymake-get-project-include-dirs
, В этой функции я управлял rospack cflags-only-I
команда, чтобы получить каталоги, необходимые для текущего пакета ROS. Чего я не понял, так это того, что последний каталог include включал символ новой строки в конце после того, как я закончил обрабатывать вывод команды rospack. Когда я увидел команду, которую она пыталась запустить в буфере, я заметил, что имя файла, которое он пытался проверить, всегда было в новой строке, но я подумал, что это просто форматирование.
Теперь, когда я удалил все новые строки из моих каталогов, все работает отлично.