cmake_minimum_required(VERSION 3.30)

set(CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP 1)
set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD "d0edc3af-4c50-42ea-a356-e2862fe7a444")
set(CMAKE_CXX_MODULE_STD ON)

project(cargoxx LANGUAGES CXX)

# Generated by cargoxx — do not edit.
# Source of truth: ../Cargoxx.toml

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS ON)
set(CMAKE_CXX_SCAN_FOR_MODULES ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

add_compile_options(-Wall -Wextra -Wpedantic -Wconversion)

# ----- dependencies -----
find_package(reproc CONFIG REQUIRED)
find_package(PkgConfig REQUIRED)
pkg_check_modules(SQLITE3 REQUIRED IMPORTED_TARGET sqlite3)
find_package(Catch2 CONFIG REQUIRED)

# ----- library target -----
add_library(cargoxx STATIC)
target_sources(cargoxx
    PUBLIC
        FILE_SET CXX_MODULES BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/.. FILES
            ../src/cli/cli.cppm
            ../src/codegen/codegen.cppm
            ../src/exec/exec.cppm
            ../src/layout/layout.cppm
            ../src/lib.cppm
            ../src/linkdb/linkdb.cppm
            ../src/lockfile/lockfile.cppm
            ../src/manifest/manifest.cppm
            ../src/resolver/resolver.cppm
            ../src/util/util.cppm
    PRIVATE
        ../src/cli/cmd_add.cpp
        ../src/cli/cmd_build.cpp
        ../src/cli/cmd_clean.cpp
        ../src/cli/cmd_linkdb_add.cpp
        ../src/cli/cmd_new.cpp
        ../src/cli/cmd_remove.cpp
        ../src/cli/cmd_run.cpp
        ../src/cli/cmd_test.cpp
        ../src/cli/run.cpp
        ../src/codegen/cmake.cpp
        ../src/codegen/flake.cpp
        ../src/exec/subprocess.cpp
        ../src/layout/layout.cpp
        ../src/linkdb/database.cpp
        ../src/linkdb/overlay.cpp
        ../src/lockfile/lockfile.cpp
        ../src/manifest/parser.cpp
        ../src/manifest/writer.cpp
        ../src/resolver/conan_probe.cpp
        ../src/resolver/discover.cpp
        ../src/resolver/nix_cmake_scan.cpp
        ../src/resolver/nixpkgs_git.cpp
        ../src/resolver/nixpkgs_probe.cpp
        ../src/resolver/pc_scan.cpp
        ../src/resolver/search_devbox.cpp
        ../src/resolver/vcpkg_probe.cpp
        ../src/resolver/verify_link.cpp
        ../src/resolver/version_resolve.cpp
        ../src/util/error.cpp
        ../src/util/semver.cpp
)
target_include_directories(cargoxx SYSTEM PRIVATE ../third_party)
target_link_libraries(cargoxx PUBLIC
    reproc
    PkgConfig::SQLITE3
)

# ----- binary target -----
add_executable(cargoxx_bin ../src/main.cpp)
set_target_properties(cargoxx_bin PROPERTIES OUTPUT_NAME cargoxx)
target_link_libraries(cargoxx_bin PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
)

# ----- tests -----
enable_testing()
include(Catch)
add_executable(test_cmd_add ../tests/cmd_add.cpp)
target_link_libraries(test_cmd_add PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_cmd_add)
add_executable(test_cmd_build ../tests/cmd_build.cpp)
target_link_libraries(test_cmd_build PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_cmd_build)
add_executable(test_cmd_clean ../tests/cmd_clean.cpp)
target_link_libraries(test_cmd_clean PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_cmd_clean)
add_executable(test_cmd_new ../tests/cmd_new.cpp)
target_link_libraries(test_cmd_new PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_cmd_new)
add_executable(test_cmd_remove ../tests/cmd_remove.cpp)
target_link_libraries(test_cmd_remove PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_cmd_remove)
add_executable(test_cmd_run ../tests/cmd_run.cpp)
target_link_libraries(test_cmd_run PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_cmd_run)
add_executable(test_codegen_cmake ../tests/codegen_cmake.cpp)
target_link_libraries(test_codegen_cmake PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_codegen_cmake)
add_executable(test_codegen_flake ../tests/codegen_flake.cpp)
target_link_libraries(test_codegen_flake PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_codegen_flake)
add_executable(test_conan_probe_live ../tests/conan_probe_live.cpp)
target_link_libraries(test_conan_probe_live PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_conan_probe_live)
add_executable(test_conan_probe_parse ../tests/conan_probe_parse.cpp)
target_link_libraries(test_conan_probe_parse PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_conan_probe_parse)
add_executable(test_devbox_resolve_live ../tests/devbox_resolve_live.cpp)
target_link_libraries(test_devbox_resolve_live PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_devbox_resolve_live)
add_executable(test_devbox_resolve_parse ../tests/devbox_resolve_parse.cpp)
target_link_libraries(test_devbox_resolve_parse PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_devbox_resolve_parse)
add_executable(test_exec_run ../tests/exec_run.cpp)
target_link_libraries(test_exec_run PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_exec_run)
add_executable(test_layout_discovery ../tests/layout_discovery.cpp)
target_link_libraries(test_layout_discovery PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_layout_discovery)
add_executable(test_linkdb_lookup ../tests/linkdb_lookup.cpp)
target_link_libraries(test_linkdb_lookup PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_linkdb_lookup)
add_executable(test_linkdb_overlay ../tests/linkdb_overlay.cpp)
target_link_libraries(test_linkdb_overlay PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_linkdb_overlay)
add_executable(test_lockfile_round_trip ../tests/lockfile_round_trip.cpp)
target_link_libraries(test_lockfile_round_trip PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_lockfile_round_trip)
add_executable(test_manifest_parse ../tests/manifest_parse.cpp)
target_link_libraries(test_manifest_parse PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_manifest_parse)
add_executable(test_manifest_write ../tests/manifest_write.cpp)
target_link_libraries(test_manifest_write PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_manifest_write)
add_executable(test_nix_cmake_scan_live ../tests/nix_cmake_scan_live.cpp)
target_link_libraries(test_nix_cmake_scan_live PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_nix_cmake_scan_live)
add_executable(test_nix_cmake_scan_parse ../tests/nix_cmake_scan_parse.cpp)
target_link_libraries(test_nix_cmake_scan_parse PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_nix_cmake_scan_parse)
add_executable(test_nixpkgs_git_resolve ../tests/nixpkgs_git_resolve.cpp)
target_link_libraries(test_nixpkgs_git_resolve PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_nixpkgs_git_resolve)
add_executable(test_nixpkgs_probe_live ../tests/nixpkgs_probe_live.cpp)
target_link_libraries(test_nixpkgs_probe_live PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_nixpkgs_probe_live)
add_executable(test_nixpkgs_probe_parse ../tests/nixpkgs_probe_parse.cpp)
target_link_libraries(test_nixpkgs_probe_parse PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_nixpkgs_probe_parse)
add_executable(test_semver_satisfies ../tests/semver_satisfies.cpp)
target_link_libraries(test_semver_satisfies PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_semver_satisfies)
add_executable(test_util_error ../tests/util_error.cpp)
target_link_libraries(test_util_error PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_util_error)
add_executable(test_vcpkg_probe_live ../tests/vcpkg_probe_live.cpp)
target_link_libraries(test_vcpkg_probe_live PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_vcpkg_probe_live)
add_executable(test_vcpkg_probe_parse ../tests/vcpkg_probe_parse.cpp)
target_link_libraries(test_vcpkg_probe_parse PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_vcpkg_probe_parse)
add_executable(test_verify_link_unit ../tests/verify_link_unit.cpp)
target_link_libraries(test_verify_link_unit PRIVATE
    cargoxx
    reproc
    PkgConfig::SQLITE3
    Catch2::Catch2
    Catch2::Catch2WithMain
)
catch_discover_tests(test_verify_link_unit)
