Есть ли способ на VS Code для импорта проектов Makefile?
Как сказано в заголовке, могу ли я автоматически заполнить c_cpp_properties.json из существующего Makefile?
5 ответов
Этот ответ может не полностью дать вам то, что вы хотите, но, надеюсь, он поможет вам настроить среду VS Code.
В заголовке вашего вопроса вы упоминаете "Проекты Makefile", что указывает на неправильное представление о том, что (GNU) Makefile фиксирует настройки проекта так же, как и файлы проекта Visual Studio. Makefiles не работают так, и краткий ответ на ваш вопрос - Нет, похоже, нет способа "импортировать" Makefiles в VS Code, и он автоматически устанавливает значения в вашем c_cpp_properties.json
файл.
Сказав это, есть некоторые другие механизмы, которые могут помочь вам начать работу с VS Code в вашей ситуации, в зависимости от других элементов, которые есть в вашем наборе инструментов.
VS Code работает при условии, что он открывает один или несколько каталогов в вашей файловой системе. Когда вы это сделаете, он автоматически просканирует все свои подкаталоги, отобразит дерево и выполнит линтинг (если он включен) для выявления проблем. Действительно, включаемые каталоги должны быть добавлены вручную в ваш c_cpp_properties.json
файл, но чтобы рекурсивно добавить все ваши подкаталоги в список включаемых каталогов, вы можете использовать выражение
"${workspaceRoot}/**"
как один из элементов в вашем includePath
установка. См. Сообщение в блоге Расширение Visual Studio Code C/C++. Обновление за май 2018 г. - настройка IntelliSense стала намного проще! Больше подробностей. Это часто решает множество пропущенных символов. Если вы используете внешние или сторонние библиотеки, то вам нужно добавить их в свой includePath
установка вручную, нет никакого способа обойти это.
Кроме того, вы можете создавать VS Code Tasks для выполнения ваших make
Команда по своему вкусу. Это объясняется здесь: интеграция с внешними инструментами с помощью задач. Расширение Microsoft C/C++ поставляется с набором так называемых problemMatchers, которые анализируют выходные данные вашей команды и могут интерпретировать это для определенных известных компиляторов. Вы увидите гиперссылки на ошибки и предупреждения, чтобы перейти непосредственно к соответствующему местоположению в вашем коде.
Пример такой задачи может выглядеть так:
{
"label": "Build All Debug",
"type": "shell",
"command": "make -f path/to/Makefile DEBUG=1",
"group": {
"kind": "build",
"isDefault": true
},
"presentation": {
"reveal": "always",
"panel": "new"
},
"problemMatcher": [
"$gcc"
]
}
Расширение Visual Studio Code Intellisense для C/C++ поддерживает базу данных compile_commands.json. Некоторые утилиты makefile могут сами генерировать эти базы данных, но у меня нет опыта их использования. Для GNU make вам понадобится какой-нибудь вспомогательный скрипт или инструмент. Я использовал скомпилированный пакет pythonb:
sudo pip install compiledb
cd projectfolder
make clean
compiledb make
После этого вы должны получить файл compile_commands.json. Затем в VS Code вам нужно отредактировать c_cpp_properties.json для рассматриваемой рабочей области. Один из способов открыть его - щелкнуть имя конфигурации в правом нижнем углу строки состояния и затем щелкнуть "Редактировать конфигурации (json)". Или вы можете открыть панель команд (CTRL + SHIFT + P в моей системе) и ввестиC/C++: Edit configurations (JSON)
Затем в конфигурации, которую вы используете, добавьте свойство "compileCommands": "${workspaceFolder}/compile_commands.json"
Полный пример:
{
"configurations": [
{
"name": "geany",
"includePath": [
"${workspaceFolder}/**"
],
"compilerPath": "/usr/bin/gcc",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "gcc-x64",
"browse": {
"path": [
"${workspaceFolder}/**"
],
"limitSymbolsToIncludedHeaders": true
},
"compileCommands": "${workspaceFolder}/compile_commands.json"
}
],
"version": 4
}
Теперь анализ кода Visual Studio Intellisense должен использовать точно правильные каталоги включения, директивы определения и другие флаги компилятора командной строки, уникальные для каждого отдельного исходного файла.
Для других, пытающихся импортировать make-файлы, я нашел набор сценариев, которые выполняют именно то, что я хотел достичь, управление встроенными проектами STM32 через VS Code. Если вы покопаетесь в папке scripts, вы найдете парсер make и попутный файл проекта VSCode.
Здесь репо, наслаждайтесь!
GNU Make обычно используется для компиляции проектов C, но он может создавать любые выходные файлы, какие захотите.
Вы можете создать сценарий для этой цели или сделать это из другого make-файла, например: VSCode.mk
что ты include
на вашем высшем уровне Makefile
.
В этом решении используется One Shell, но если это невозможно, отдельный сценарий выглядел бы лучше.
@ Делает свой выход лучше.
Скорее всего, вы не можете безопасно скопировать и вставить этот код, потому что Make использует буквальные табуляции, а не пробелы.
.ONESHELL:
SOURCE_DIRECTORY := src
DEFINED_VALUE := 1
# Recipe:
.vscode/c_cpp_properties.json:
@
cat << EOF > "$@"
{
"configurations": [
{
"name": "Linux",
"includePath": [
"\$${workspaceFolder}/$(SOURCE_DIRECTORY)*"
],
"defines": [
"DEFINED_VALUE=$(DEFINED_VALUE)"
],
"compilerPath": "$(CC)",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64",
"browse" : {
"limitSymbolsToIncludedHeaders" : true
}
}
],
"version": 4
}
EOF
Обратите внимание: если все, что вам нужно, — это получить IntelliSense в VS Code при использовании файлов Makefile, вам не нужно создавать файл базы данных команд компиляции. Просто используйтеms-vscode.makefile-tools
расширение с расширением C/C++ и установите его в качестве поставщика конфигурации для расширения C/C++ (поместите"C_Cpp.default.configurationProvider": "ms-vscode.makefile-tools",
в файле settings.json вашего рабочего пространства ). Настроитьmakefile.makefilePath
настройка по мере необходимости. Затем, пока целевые файлы Makefile в вашем проекте охватывают интересующие файлы C/C++, эти файлы будут получать IntelliSense от инструментов Makefile Tools и расширений C/C++. Файлы C/C++, которые не охватываются целевыми объектами в вашем Makefile, получат возможность IntelliSense вернуться к конфигурации расширения C/C++.