vscode-R icon indicating copy to clipboard operation
vscode-R copied to clipboard

Auto-generate C/C++ properties JSON

Open nx10 opened this issue 2 years ago • 2 comments

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

nx10 avatar Sep 19 '22 15:09 nx10

I am close to having this working. Will send a PR soon.

nx10 avatar Sep 21 '22 20:09 nx10

It would be very nice to have this feature! Thanks for working on this.

renkun-ken avatar Sep 21 '22 22:09 renkun-ken