From 06e65e537bd0570aa9de3cc8bad3a1ca006b38b8 Mon Sep 17 00:00:00 2001 From: Qyriad Date: Thu, 6 Jun 2024 12:46:26 -0600 Subject: [PATCH 1/2] build: expose option to enable or disable precompiled std headers They are enabled by default, and Meson will also prints whether or not they're enabled at the bottom at the end of configuration. Change-Id: I48db238510bf9e74340b86f243f4bbe360794281 --- meson.build | 14 ++++++++++++++ meson.options | 4 ++++ src/libcmd/meson.build | 2 +- src/libexpr/meson.build | 2 +- src/libfetchers/meson.build | 2 +- src/libmain/meson.build | 2 +- src/libstore/meson.build | 2 +- src/libutil/meson.build | 2 +- src/nix/meson.build | 2 +- tests/unit/meson.build | 12 ++++++------ 10 files changed, 31 insertions(+), 13 deletions(-) diff --git a/meson.build b/meson.build index b98b1fb15..7fd29bdf5 100644 --- a/meson.build +++ b/meson.build @@ -129,6 +129,20 @@ endif cxx = meson.get_compiler('cpp') + +# clangd breaks when GCC is using precompiled headers lmao +# https://git.lix.systems/lix-project/lix/issues/374 +should_pch = get_option('enable-pch-std') +summary('PCH C++ stdlib', should_pch, bool_yn : true) +if should_pch + # Unlike basically everything else that takes a file, Meson requires the arguments to + # cpp_pch : to be strings and doesn't accept files(). So absolute path it is. + cpp_pch = [meson.project_source_root() / 'src/pch/precompiled-headers.hh'] +else + cpp_pch = [] +endif + + # Translate some historical and Mesony CPU names to Lixy CPU names. # FIXME(Qyriad): the 32-bit x86 code is not tested right now, because cross compilation for Lix # to those architectures is currently broken for other reasons, namely: diff --git a/meson.options b/meson.options index 6b13fa8a0..fc2050809 100644 --- a/meson.options +++ b/meson.options @@ -64,3 +64,7 @@ option('internal-api-docs', type : 'feature', value : 'auto', option('profile-dir', type : 'string', value : 'etc/profile.d', description : 'the path to install shell profile files', ) + +option('enable-pch-std', type : 'boolean', value : true, + description : 'whether to use precompiled headers for C++\'s standard library (breaks clangd if you\'re using GCC)', +) diff --git a/src/libcmd/meson.build b/src/libcmd/meson.build index 4dc0714c8..3d92f36a4 100644 --- a/src/libcmd/meson.build +++ b/src/libcmd/meson.build @@ -54,7 +54,7 @@ libcmd = library( nlohmann_json, lix_doc ], - cpp_pch : ['../pch/precompiled-headers.hh'], + cpp_pch : cpp_pch, install : true, # FIXME(Qyriad): is this right? install_rpath : libdir, diff --git a/src/libexpr/meson.build b/src/libexpr/meson.build index e60a85b5d..080fdb443 100644 --- a/src/libexpr/meson.build +++ b/src/libexpr/meson.build @@ -145,7 +145,7 @@ libexpr = library( include_directories : [ '../libmain', ], - cpp_pch : ['../pch/precompiled-headers.hh'], + cpp_pch : cpp_pch, install : true, # FIXME(Qyriad): is this right? install_rpath : libdir, diff --git a/src/libfetchers/meson.build b/src/libfetchers/meson.build index ee38b6cda..b66d0b9f9 100644 --- a/src/libfetchers/meson.build +++ b/src/libfetchers/meson.build @@ -30,7 +30,7 @@ libfetchers = library( liblixutil, nlohmann_json, ], - cpp_pch : ['../pch/precompiled-headers.hh'], + cpp_pch : cpp_pch, install : true, # FIXME(Qyriad): is this right? install_rpath : libdir, diff --git a/src/libmain/meson.build b/src/libmain/meson.build index 075aa83b2..a7cce287c 100644 --- a/src/libmain/meson.build +++ b/src/libmain/meson.build @@ -20,7 +20,7 @@ libmain = library( liblixutil, liblixstore, ], - cpp_pch : ['../pch/precompiled-headers.hh'], + cpp_pch : cpp_pch, install : true, # FIXME(Qyriad): is this right? install_rpath : libdir, diff --git a/src/libstore/meson.build b/src/libstore/meson.build index 7a129d22c..fa363bd19 100644 --- a/src/libstore/meson.build +++ b/src/libstore/meson.build @@ -220,7 +220,7 @@ libstore = library( nlohmann_json, ], cpp_args : cpp_args, - cpp_pch : ['../pch/precompiled-headers.hh'], + cpp_pch : cpp_pch, install : true, # FIXME(Qyriad): is this right? install_rpath : libdir, diff --git a/src/libutil/meson.build b/src/libutil/meson.build index 8c3377e76..f6d14a11b 100644 --- a/src/libutil/meson.build +++ b/src/libutil/meson.build @@ -129,7 +129,7 @@ libutil = library( openssl, nlohmann_json, ], - cpp_pch : ['../pch/precompiled-headers.hh'], + cpp_pch : cpp_pch, implicit_include_directories : true, install : true, ) diff --git a/src/nix/meson.build b/src/nix/meson.build index 8115a3d08..22f148fcb 100644 --- a/src/nix/meson.build +++ b/src/nix/meson.build @@ -89,7 +89,7 @@ nix = executable( boehm, nlohmann_json, ], - cpp_pch : ['../pch/precompiled-headers.hh'], + cpp_pch : cpp_pch, install : true, # FIXME(Qyriad): is this right? install_rpath : libdir, diff --git a/tests/unit/meson.build b/tests/unit/meson.build index 06aff4626..0d3f00ba5 100644 --- a/tests/unit/meson.build +++ b/tests/unit/meson.build @@ -68,7 +68,7 @@ libutil_tester = executable( liblixutil_test_support, nlohmann_json, ], - cpp_pch : ['../../src/pch/precompiled-headers.hh'], + cpp_pch : cpp_pch, ) test( @@ -103,7 +103,7 @@ libstore_test_support = library( include_directories : include_directories( 'libstore-support', ), - cpp_pch : ['../../src/pch/precompiled-headers.hh'], + cpp_pch : cpp_pch, ) liblixstore_test_support = declare_dependency( include_directories : include_directories('libstore-support'), @@ -137,7 +137,7 @@ libstore_tester = executable( gtest, nlohmann_json, ], - cpp_pch : ['../../src/pch/precompiled-headers.hh'], + cpp_pch : cpp_pch, ) test( @@ -169,7 +169,7 @@ libexpr_test_support = library( include_directories : include_directories( 'libexpr-support', ), - cpp_pch : ['../../src/pch/precompiled-headers.hh'], + cpp_pch : cpp_pch, ) liblixexpr_test_support = declare_dependency( include_directories : include_directories('libexpr-support'), @@ -203,7 +203,7 @@ libexpr_tester = executable( gtest, nlohmann_json, ], - cpp_pch : ['../../src/pch/precompiled-headers.hh'], + cpp_pch : cpp_pch, ) test( @@ -230,7 +230,7 @@ libcmd_tester = executable( gtest, boost, ], - cpp_pch : ['../../src/pch/precompiled-headers.hh'], + cpp_pch : cpp_pch, ) test( From 766e718f6739e9098d18674bd71cb0f4bc5bbf43 Mon Sep 17 00:00:00 2001 From: Qyriad Date: Thu, 6 Jun 2024 12:48:13 -0600 Subject: [PATCH 2/2] devshells: only enable pch for clang clangd seems to break if GCC is using precompiled headers for C++'s standard library, so this sets -Denable-pch-std=${stdenv.cc.isClang} Fixes #374. Change-Id: Ic4be41ebe7576ebcb9c208275596f953c2003109 --- package.nix | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/package.nix b/package.nix index 43b709023..ec51a9530 100644 --- a/package.nix +++ b/package.nix @@ -424,9 +424,14 @@ stdenv.mkDerivation (finalAttrs: { # For Meson to find Boost. env = finalAttrs.env; - # I guess this is necessary because mesonFlags to mkDerivation doesn't propagate in inputsFrom, - # which only propagates stuff set in hooks? idk. - inherit (finalAttrs) mesonFlags; + mesonFlags = + # I guess this is necessary because mesonFlags to mkDerivation doesn't propagate in inputsFrom, + # which only propagates stuff set in hooks? idk. + finalAttrs.mesonFlags + # Clangd breaks when GCC is using precompiled headers, so for the devshell specifically + # we make precompiled C++ stdlib conditional on using Clang. + # https://git.lix.systems/lix-project/lix/issues/374 + ++ [ (lib.mesonBool "enable-pch-std" stdenv.cc.isClang) ]; packages = lib.optional (stdenv.cc.isClang && hostPlatform == buildPlatform) clang-tools_llvm