diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index 0d0e8259b..e177f59ed 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -63,6 +63,12 @@ jobs: grep -q 'JSON_USE_GLOBAL_UDLS=0;JSON_DIAGNOSTICS=1' install-options/share/cmake/nlohmann_json/nlohmann_jsonTargets.cmake cmake -S tests/cmake_import/project -B build-import-options -DCMAKE_PREFIX_PATH=${{ github.workspace }}/install-options cmake --build build-import-options + - name: Install with Meson and the include directory outside the prefix + run: | + meson setup build-meson-split --prefix=${{ github.workspace }}/install-split --includedir=${{ github.workspace }}/install-split-dev/include + meson install -C build-meson-split + cmake -S tests/cmake_import/project -B build-import-split -DCMAKE_PREFIX_PATH=${{ github.workspace }}/install-split + cmake --build build-import-split ci_infer: runs-on: ubuntu-latest diff --git a/cmake/nlohmann_jsonTargets.cmake.in b/cmake/nlohmann_jsonTargets.cmake.in index 8149eff9e..d8759423d 100644 --- a/cmake/nlohmann_jsonTargets.cmake.in +++ b/cmake/nlohmann_jsonTargets.cmake.in @@ -4,7 +4,8 @@ # do that, but as the library is header-only, the target only needs an include # directory, the C++ standard, and the compile definitions of the options that # differ from their defaults. Paths are computed relative to this file so that -# the installation can be relocated (e.g., into a sysroot). +# the installation can be relocated (e.g., into a sysroot), unless includedir or +# datadir is outside the prefix. if(TARGET @PROJECT_NAME@::@NLOHMANN_JSON_TARGET_NAME@) return() @@ -14,7 +15,7 @@ get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_DIR}/@NLOHMANN_JSON_ add_library(@PROJECT_NAME@::@NLOHMANN_JSON_TARGET_NAME@ INTERFACE IMPORTED) set_target_properties(@PROJECT_NAME@::@NLOHMANN_JSON_TARGET_NAME@ PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/@NLOHMANN_JSON_INCLUDE_INSTALL_DIR@" + INTERFACE_INCLUDE_DIRECTORIES "@NLOHMANN_JSON_INCLUDE_DIR@" ) if(CMAKE_VERSION VERSION_LESS 3.8) set_target_properties(@PROJECT_NAME@::@NLOHMANN_JSON_TARGET_NAME@ PROPERTIES diff --git a/meson.build b/meson.build index 4f93c17d1..33b2ff466 100644 --- a/meson.build +++ b/meson.build @@ -69,12 +69,22 @@ if not meson.is_subproject() install_dir: get_option('datadir') / 'pkgconfig', ) - # CMake package config files, so that find_package(nlohmann_json) works + # CMake package config files, so that find_package(nlohmann_json) works. The + # include directory is given relative to the config files, so that the + # installation can be relocated. This is not possible if includedir or datadir + # is an absolute path outside the prefix (e.g., with the separate outputs of + # Nix); then the absolute include directory is used, as CMake does. + fs = import('fs') cmake_install_dir = get_option('datadir') / 'cmake' / meson.project_name() cmake_to_prefix = [] - foreach component : cmake_install_dir.split('/') - cmake_to_prefix += '..' - endforeach + if fs.is_absolute(get_option('includedir')) or fs.is_absolute(cmake_install_dir) + cmake_include_dir = (get_option('prefix') / get_option('includedir')).replace('\\', '/') + else + foreach component : cmake_install_dir.split('/') + cmake_to_prefix += '..' + endforeach + cmake_include_dir = '${_IMPORT_PREFIX}/' + get_option('includedir') + endif cmake_conf = configuration_data() cmake_conf.set('PROJECT_NAME', meson.project_name()) @@ -82,7 +92,7 @@ if not meson.is_subproject() cmake_conf.set('PROJECT_VERSION_MAJOR', meson.project_version().split('.')[0]) cmake_conf.set('NLOHMANN_JSON_TARGET_NAME', meson.project_name()) cmake_conf.set('NLOHMANN_JSON_TARGETS_EXPORT_NAME', meson.project_name() + 'Targets') - cmake_conf.set('NLOHMANN_JSON_INCLUDE_INSTALL_DIR', get_option('includedir')) + cmake_conf.set('NLOHMANN_JSON_INCLUDE_DIR', cmake_include_dir) cmake_conf.set('NLOHMANN_JSON_CONFIG_TO_PREFIX', '/'.join(cmake_to_prefix)) cmake_conf.set('NLOHMANN_JSON_COMPILE_DEFINITIONS', ';'.join(json_defines))