vscode-R
vscode-R copied to clipboard
Auto-generate C/C++ properties JSON
Is your feature request related to a problem? Please describe.
When writing an R package with native C/C++ code, VSCode needs the file .vscode/c_cpp_properties.json
to offer LSP services (linting, code completion, ...).
Whenever I create a new project or update some includes, this file needs to be updated manuall, while - in theory - all information is available in the package meta-data.
Describe the solution you'd like Either automatically or by an action: Collect all necessary information and generate/update the file.
Needed information:
- C/C++ standard
- Include directories
- Defines
- Compiler path (maybe)
These could be extracted from src/Makevars
+ configure
, but it might be easier just to compile the package and extract them from the compile output (this would also support more complicated build scripts):
Additional context
This is an example file I have been working with:
{
"env": {
"myDefaultIncludePath": [
"${workspaceFolder}/src",
"${workspaceFolder}/src/lib",
"${workspaceFolder}/inst/include",
"${workspaceFolder}/windows/harfbuzz-2.7.4/include",
"${workspaceFolder}/windows/cairo-1.16.0/include/cairo",
"${workspaceFolder}/windows/cairo-1.16.0/include/freetype2"
]
},
"configurations": [
{
"name": "MinGW",
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE",
"_WIN64",
"FMT_HEADER_ONLY",
"UNIGD_DEBUG_DEVICE"
],
"includePath": [
"${myDefaultIncludePath}",
"C:/Program Files/R/R-4.2.1/include",
"C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include",
"C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include"
],
"compilerPath": "C:/rtools42/x86_64-w64-mingw32.static.posix/bin/g++.exe",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
This would be the compile output that could be parsed:
Rcmd INSTALL . > log.txt
log.txt:
rm -f base_64.o compress.o cpp11.o draw_data.o plot_history.o r_thread_posix.o r_thread_win32.o renderer_cairo.o renderer_json.o renderer_meta.o renderer_strings.o renderer_svg.o renderer_tikz.o renderers.o unigd.o unigd_data_store.o unigd_dev.o unigd_external.o uuid.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c base_64.cpp -o base_64.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c compress.cpp -o compress.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c cpp11.cpp -o cpp11.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c draw_data.cpp -o draw_data.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c plot_history.cpp -o plot_history.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c r_thread_posix.cpp -o r_thread_posix.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c r_thread_win32.cpp -o r_thread_win32.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c renderer_cairo.cpp -o renderer_cairo.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c renderer_json.cpp -o renderer_json.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c renderer_meta.cpp -o renderer_meta.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c renderer_strings.cpp -o renderer_strings.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c renderer_svg.cpp -o renderer_svg.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c renderer_tikz.cpp -o renderer_tikz.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c renderers.cpp -o renderers.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c unigd.cpp -o unigd.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c unigd_data_store.cpp -o unigd_data_store.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c unigd_dev.cpp -o unigd_dev.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c unigd_external.cpp -o unigd_external.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.1/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I'C:/Users/floru/AppData/Local/R/win-library/4.2/cpp11/include' -I'C:/Users/floru/AppData/Local/R/win-library/4.2/systemfonts/include' -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c uuid.cpp -o uuid.o
g++ -shared -s -static-libgcc -o unigd.dll tmp.def base_64.o compress.o cpp11.o draw_data.o plot_history.o r_thread_posix.o r_thread_win32.o renderer_cairo.o renderer_json.o renderer_meta.o renderer_strings.o renderer_svg.o renderer_tikz.o renderers.o unigd.o unigd_data_store.o unigd_dev.o unigd_external.o uuid.o -lcairo -lpixman-1 -lfontconfig -lncrypt -lksecdd -lbcrypt -lexpat -lharfbuzz_too -lfreetype_too -lharfbuzz -lfreetype -lpng16 -lpng -lbz2 -lgdi32 -lintl -liconv -lz -lcfitsio -ltiff -ltiffxx -ljpeg -lzstd -lwebp -llzma -LC:/rtools42/x86_64-w64-mingw32.static.posix/lib/x64 -LC:/rtools42/x86_64-w64-mingw32.static.posix/lib -LC:/PROGRA~1/R/R-42~1.1/bin/x64 -lR
Edit: Some additional information after some research:
It seems RStudio is using R CMD SHLIB
for this purpose:
As I understand it, they copy one C/C++ file and the Makevars
files from src/
into a temporary folder and and then call R CMD SHLIB
and parse the output. (See: https://github.com/rstudio/rstudio/issues/6384#issuecomment-671362942)
I am not sure why they have to use an existing file and not just create an empty one. This is a test with an empty file and seems to contain all needed information:
> C:/PROGRA~1/R/R-42~1.0/bin/x64/Rcmd.exe SHLIB "test_file.cpp"
rm -f test_file.o
g++ -std=gnu++17 -I"C:/PROGRA~1/R/R-42~1.0/include" -DNDEBUG -Ilib -DFMT_HEADER_ONLY -IC:/rtools42/x86_64-w64-mingw32.static.posix/include/cairo -I../inst/include -I"C:/rtools42/x86_64-w64-mingw32.static.posix/include" -O2 -Wall -mfpmath=sse -msse2 -mstackrealign -c test_file.cpp -o test_file.o
g++ -shared -s -static-libgcc -o test_file.dll tmp.def test_file.o -lcairo -lpixman-1 -lfontconfig -lncrypt -lksecdd -lbcrypt -lexpat -lharfbuzz_too -lfreetype_too -lharfbuzz -lfreetype -lpng16 -lpng -lbz2 -lgdi32 -lintl -liconv -lz -lcfitsio -ltiff -ltiffxx -ljpeg -lzstd -lwebp -llzma -LC:/rtools42/x86_64-w64-mingw32.static.posix/lib/x64 -LC:/rtools42/x86_64-w64-mingw32.static.posix/lib -LC:/PROGRA~1/R/R-42~1.0/bin/x64 -lR
I am close to having this working. Will send a PR soon.
It would be very nice to have this feature! Thanks for working on this.