find_package(Threads)
add_library(PackingSolver_irregular)
target_sources(PackingSolver_irregular PRIVATE
    instance.cpp
    instance_builder.cpp
    solution.cpp
    solution_builder.cpp
    algorithm_formatter.cpp
    optimize.cpp
    post_process.cpp
    shape_simplification.cpp
    rotations.cpp
    periodic_packing.cpp
    tree_search.cpp
    tree_search_periodic_packing.cpp
    linear_programming.cpp
    milp_raster.cpp
    trivial.cpp
    local_search.cpp
    sequential_feasibility.cpp
    reduction.cpp)
target_include_directories(PackingSolver_irregular PUBLIC
    ${PROJECT_SOURCE_DIR}/include)
target_include_directories(PackingSolver_irregular PRIVATE
    ${PROJECT_SOURCE_DIR}/src)
target_link_libraries(PackingSolver_irregular PUBLIC
    PackingSolver_algorithms
    PackingSolver_onedimensional
    TreeSearchSolver::treesearchsolver
    MathOptSolversCMake::mathopt
    Shape::shape
    Threads::Threads)
# Resource limits: the portable RSS reader in
# include/packingsolver/algorithms/thread_pool.hpp uses GetProcessMemoryInfo on
# Windows, which lives in psapi.
if (WIN32)
    target_link_libraries(PackingSolver_irregular PUBLIC psapi)
endif()
if (PackingSolver_USE_KNITRO)
    target_link_libraries(PackingSolver_irregular PUBLIC
        KnitroCpp::knitrocpp)
    target_compile_definitions(PackingSolver_irregular PRIVATE
        KNITRO_FOUND=1)
endif()
add_library(PackingSolver::irregular ALIAS PackingSolver_irregular)

add_library(PackingSolver_irregular_convert)
target_sources(PackingSolver_irregular_convert PRIVATE
    convert.cpp)
target_include_directories(PackingSolver_irregular_convert PUBLIC
    ${PROJECT_SOURCE_DIR}/include)
target_link_libraries(PackingSolver_irregular_convert PUBLIC
    PackingSolver_irregular)
add_library(PackingSolver::irregular_convert ALIAS PackingSolver_irregular_convert)

if(PACKINGSOLVER_BUILD_MAIN)
    add_executable(PackingSolver_irregular_main)
    target_sources(PackingSolver_irregular_main PRIVATE
        main.cpp)
    target_link_libraries(PackingSolver_irregular_main PUBLIC
        PackingSolver_irregular
        Boost::program_options)
    set_target_properties(PackingSolver_irregular_main PROPERTIES OUTPUT_NAME "packingsolver_irregular")
    install(TARGETS PackingSolver_irregular_main)

    add_executable(PackingSolver_irregular_fill_solution_file)
    target_sources(PackingSolver_irregular_fill_solution_file PRIVATE
        fill_solution_file_main.cpp)
    target_include_directories(PackingSolver_irregular_fill_solution_file PRIVATE
        ${PROJECT_SOURCE_DIR}/src)
    target_link_libraries(PackingSolver_irregular_fill_solution_file PUBLIC
        PackingSolver_irregular
        Boost::program_options)
    set_target_properties(PackingSolver_irregular_fill_solution_file PROPERTIES OUTPUT_NAME "fill_solution_file")
    install(TARGETS PackingSolver_irregular_fill_solution_file)

    add_executable(PackingSolver_irregular_convert_main)
    target_sources(PackingSolver_irregular_convert_main PRIVATE
        convert_main.cpp)
    target_link_libraries(PackingSolver_irregular_convert_main PUBLIC
        PackingSolver_irregular_convert
        Boost::program_options)
    set_target_properties(PackingSolver_irregular_convert_main PROPERTIES OUTPUT_NAME "irregular_convert")
    install(TARGETS PackingSolver_irregular_convert_main)
endif()
