diff --git a/.gitignore b/.gitignore index b2f55fd..ea4b235 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ +build/ .cache/ -a.out +.ccls-cache/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..c922b4a --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,16 @@ +cmake_minimum_required(VERSION 3.23) + +project(template) + +set(CMAKE_CXX_STANDARD 23) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +#string(REPLACE ":" ";" INCLUDE_LIST $ENV{CMAKE_STDLIB}) +#include_directories($ENV{CMAKE_STDLIB}) + +add_executable(template) + +target_sources(template + PRIVATE + main.cpp +) diff --git a/README.org b/README.org index 84a769f..bf84313 100644 --- a/README.org +++ b/README.org @@ -1,16 +1,2 @@ -* NixOS C++ Dev Template -Having issues getting clangd to detect std header files despite clang++ and g++ having no issues. So this template/workaround solves this. - -I assume this is due to some wrapper script nonsense. - -As a workaround I use bear to generate the necessary paths/arguments to get clangd to pick these up. - -#+BEGIN_SRC -bear -- clang++ main.cpp -#+END_SRC - -In the generated compile_commands.json. There is a command for generating the main project but also a temporary object file. - -I assume this is more weird wrapper stuff (Bear does not support nixos clang wrappers) - -You need to move the cxx_isystem related flags as these are where the c++ stdlibs are kept. Also just rename them to isystem otherwise they dont work for whatever reason. +* Nix C++ Dev Template +Basic C++ CMake template with Nix diff --git a/compile_commands.json b/compile_commands.json deleted file mode 100644 index a808858..0000000 --- a/compile_commands.json +++ /dev/null @@ -1,20 +0,0 @@ -[ - { - "arguments": [ - "/run/current-system/sw/bin/clang++", - "-std=c++23", - "-resource-dir", - "/nix/store/k2s6xfca52n25yb8b6f58i87kszp3m7g-clang-wrapper-21.1.2/resource-root", - "-idirafter", - "/nix/store/dqgfdpr53ldqmdfmginb1z6kzslkzsdl-glibc-2.40-66-dev/include", - "-isystem", - "/nix/store/68ndh04pl2hhhizsarvzwa9cnlp7zj3d-gcc-14.3.0/include/c++/14.3.0", - "-isystem", - "/nix/store/68ndh04pl2hhhizsarvzwa9cnlp7zj3d-gcc-14.3.0/include/c++/14.3.0/x86_64-unknown-linux-gnu", - "-c", - "main.cpp" - ], - "directory": "/home/cspark/Projects/CPP/hello_world", - "file": "/home/cspark/Projects/CPP/hello_world/main.cpp" - } -] diff --git a/compile_commands.json b/compile_commands.json new file mode 120000 index 0000000..25eb4b2 --- /dev/null +++ b/compile_commands.json @@ -0,0 +1 @@ +build/compile_commands.json \ No newline at end of file diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..e722ad8 --- /dev/null +++ b/default.nix @@ -0,0 +1,14 @@ +with (import {}); + +clangStdenv.mkDerivation { + name = "template"; + nativeBuildInputs = with pkgs; [ + cmake + + clang-tools + clang + ]; + + # Workaround as Clangd cannot see std header files, so include set of files manually just for Clangd + CXXFLAGS = "-isystem${pkgs.gcc.cc}/include/c++/14.3.0 -isystem${pkgs.gcc.cc}/include/c++/14.3.0/x86_64-unknown-linux-gnu -isystem${pkgs.glibc.dev}/include"; +} diff --git a/main.cpp b/main.cpp index 01ed3a0..8ec9f09 100644 --- a/main.cpp +++ b/main.cpp @@ -1,6 +1,6 @@ #include -#include int main() { - std::println("Hello, world!"); + std::cout << "Hello, world!" << std::endl; } + diff --git a/run.sh b/run.sh index 120684f..2b9c3be 100755 --- a/run.sh +++ b/run.sh @@ -1,7 +1,7 @@ #!/bin/sh -rm a.out +cmake -B build --fresh -clang++ -std=c++23 main.cpp +cmake --build build -./a.out +./build/discern