#/|/ Copyright (c) Prusa Research 2018 - 2023 Tomáš Mészáros @tamasmeszaros, Oleksandra Iushchenko @YuSanka, Enrico Turri @enricoturri1966, Vojtěch Bubník @bubnikv, Pavel Mikuš @Godrak, Lukáš Hejl @hejllukas, Lukáš Matěna @lukasmatena, Filip Sykala @Jony01, David Kocík @kocikdav, Vojtěch Král @vojtechkral
#/|/ Copyright (c) BambuStudio 2023 manch1n @manch1n
#/|/ Copyright (c) 2023 Mimoja @Mimoja
#/|/ Copyright (c) 2022 ole00 @ole00
#/|/
#/|/ PrusaSlicer is released under the terms of the AGPLv3 or higher
#/|/
cmake_minimum_required(VERSION 3.13)
project(libslic3r)

include(PrecompiledHeader)

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/libslic3r_version.h.in ${CMAKE_CURRENT_BINARY_DIR}/libslic3r_version.h @ONLY)

if (MINGW)
    add_compile_options(-Wa,-mbig-obj)
endif ()

set(OpenVDBUtils_SOURCES "")
if (TARGET OpenVDB::openvdb)
    set(OpenVDBUtils_SOURCES OpenVDBUtils.cpp OpenVDBUtils.hpp OpenVDBUtilsLegacy.hpp)
endif()

find_package(LibBGCode REQUIRED COMPONENTS Convert)
slic3r_remap_configs(LibBGCode::bgcode_core RelWithDebInfo Release)
slic3r_remap_configs(LibBGCode::bgcode_binarize RelWithDebInfo Release)
slic3r_remap_configs(LibBGCode::bgcode_convert RelWithDebInfo Release)

set(SLIC3R_SOURCES
    pchheader.cpp
    pchheader.hpp
    AStar.hpp
    AABBTreeIndirect.hpp
    AABBTreeLines.hpp
    AABBMesh.hpp
    AABBMesh.cpp
    ArrangeHelper.cpp
    ArrangeHelper.hpp
    Algorithm/LineSegmentation/LineSegmentation.cpp
    Algorithm/LineSegmentation/LineSegmentation.hpp
    Algorithm/PathSorting.hpp
    Algorithm/RegionExpansion.hpp
    Algorithm/RegionExpansion.cpp
    AnyPtr.hpp
    BoundingBox.cpp
    BoundingBox.hpp
    BridgeDetector.cpp
    BridgeDetector.hpp
    Brim.cpp
    Brim.hpp
    BuildVolume.cpp
    BuildVolume.hpp
    BoostAdapter.hpp
    clipper.cpp
    clipper.hpp
    ClipperUtils.cpp
    ClipperUtils.hpp
    ClipperZUtils.hpp
    Color.cpp
    Color.hpp
    Config.cpp
    Config.hpp
    CSGMesh/CSGMesh.hpp
    CSGMesh/SliceCSGMesh.hpp
    CSGMesh/ModelToCSGMesh.hpp
    CSGMesh/PerformCSGMeshBooleans.hpp
    CSGMesh/VoxelizeCSGMesh.hpp
    CSGMesh/TriangleMeshAdapter.hpp
    CSGMesh/CSGMeshCopy.hpp
    EdgeGrid.cpp
    EdgeGrid.hpp
    ElephantFootCompensation.cpp
    ElephantFootCompensation.hpp
    Emboss.cpp
    Emboss.hpp
    EmbossShape.hpp
    enum_bitmask.hpp
    ExPolygon.cpp
    ExPolygon.hpp
    ExPolygonSerialize.hpp
    ExPolygonsIndex.cpp
    ExPolygonsIndex.hpp
    Extruder.cpp
    Extruder.hpp
    ExtrusionEntity.cpp
    ExtrusionEntity.hpp
    ExtrusionEntityCollection.cpp
    ExtrusionEntityCollection.hpp
    ExtrusionRole.cpp
    ExtrusionRole.hpp
    ExtrusionSimulator.cpp
    ExtrusionSimulator.hpp
    Feature/Interlocking/InterlockingGenerator.cpp
    Feature/Interlocking/InterlockingGenerator.hpp
    Feature/Interlocking/VoxelUtils.cpp
    Feature/Interlocking/VoxelUtils.hpp
    FileParserError.hpp
    Feature/FuzzySkin/FuzzySkin.cpp
    Feature/FuzzySkin/FuzzySkin.hpp
    Feature/FullSpectrum/VirtualExtruder.cpp
    Feature/FullSpectrum/VirtualExtruder.hpp
    Fill/Fill.cpp
    Fill/Fill3DHoneycomb.cpp
    Fill/Fill3DHoneycomb.hpp
    Fill/FillAdaptive.cpp
    Fill/FillAdaptive.hpp
    Fill/FillBase.cpp
    Fill/FillBase.hpp
    Fill/FillConcentric.cpp
    Fill/FillConcentric.hpp
    Fill/FillEnsuring.cpp
    Fill/FillEnsuring.hpp
    Fill/FillHoneycomb.cpp
    Fill/FillHoneycomb.hpp
    Fill/FillGyroid.cpp
    Fill/FillGyroid.hpp
    Fill/FillPlanePath.cpp
    Fill/FillPlanePath.hpp
    Fill/FillLine.cpp
    Fill/FillLine.hpp
    Fill/FillLightning.cpp
    Fill/FillLightning.hpp
    Fill/Lightning/DistanceField.cpp
    Fill/Lightning/DistanceField.hpp
    Fill/Lightning/Generator.cpp
    Fill/Lightning/Generator.hpp
    Fill/Lightning/Layer.cpp
    Fill/Lightning/Layer.hpp
    Fill/Lightning/TreeNode.cpp
    Fill/Lightning/TreeNode.hpp
    Fill/FillRectilinear.cpp
    Fill/FillRectilinear.hpp
    Flow.cpp
    Flow.hpp
    format.hpp
    Format/3mf.cpp
    Format/3mf.hpp
    Format/AMF.cpp
    Format/AMF.hpp
    Format/OBJ.cpp
    Format/OBJ.hpp
    Format/objparser.cpp
    Format/objparser.hpp
    Format/STL.cpp
    Format/STL.hpp
    Format/SLAArchiveWriter.hpp
    Format/SLAArchiveWriter.cpp
    Format/SLAArchiveReader.hpp
    Format/SLAArchiveReader.cpp
    Format/ZipperArchiveImport.hpp
    Format/ZipperArchiveImport.cpp
    Format/SL1.hpp
    Format/SL1.cpp
    Format/SL1_SVG.hpp
    Format/SL1_SVG.cpp
    Format/AnycubicSLA.hpp
    Format/AnycubicSLA.cpp
    Format/STEP.hpp
    Format/STEP.cpp
    Format/SVG.hpp
    Format/SVG.cpp
    Format/SLAArchiveFormatRegistry.hpp
    Format/SLAArchiveFormatRegistry.cpp
    Format/PrintRequest.cpp
    Format/PrintRequest.cpp
    GCode/ThumbnailData.cpp
    GCode/ThumbnailData.hpp
    GCode/Thumbnails.cpp
    GCode/Thumbnails.hpp
    GCode/ConflictChecker.cpp
    GCode/ConflictChecker.hpp
    GCode/CoolingBuffer.cpp
    GCode/CoolingBuffer.hpp
    GCode/ExtrusionProcessor.cpp
    GCode/ExtrusionProcessor.hpp
    GCode/FindReplace.cpp
    GCode/FindReplace.hpp
    GCode/LabelObjects.cpp
    GCode/LabelObjects.hpp
    GCode/GCodeWriter.cpp
    GCode/GCodeWriter.hpp
    GCode/PostProcessor.cpp
    GCode/PostProcessor.hpp
    GCode/PressureEqualizer.cpp
    GCode/PressureEqualizer.hpp
    GCode/PrintExtents.cpp
    GCode/PrintExtents.hpp
    GCode/RetractWhenCrossingPerimeters.cpp
    GCode/RetractWhenCrossingPerimeters.hpp
    GCode/SpiralVase.cpp
    GCode/SpiralVase.hpp
    GCode/SeamPlacer.cpp
    GCode/SeamPlacer.hpp
    GCode/SeamChoice.cpp
    GCode/SeamChoice.hpp
    GCode/SeamPerimeters.cpp
    GCode/SeamPerimeters.hpp
    GCode/SeamShells.cpp
    GCode/SeamShells.hpp
    GCode/SeamGeometry.cpp
    GCode/SeamGeometry.hpp
    GCode/SeamAligned.cpp
    GCode/SeamAligned.hpp
    GCode/SeamRear.cpp
    GCode/SeamRear.hpp
    GCode/SeamRandom.cpp
    GCode/SeamRandom.hpp
    GCode/SeamPainting.cpp
    GCode/SeamPainting.hpp
    GCode/SeamScarf.cpp
    GCode/SeamScarf.hpp
    GCode/ModelVisibility.cpp
    GCode/ModelVisibility.hpp
    GCode/SmoothPath.cpp
    GCode/SmoothPath.hpp
    GCode/ToolOrdering.cpp
    GCode/ToolOrdering.hpp
    GCode/Wipe.cpp
    GCode/Wipe.hpp
    GCode/WipeTower.cpp
    GCode/WipeTower.hpp
    GCode/WipeTowerIntegration.cpp
    GCode/WipeTowerIntegration.hpp
    GCode/GCodeProcessor.cpp
    GCode/GCodeProcessor.hpp
    GCode/AvoidCrossingPerimeters.cpp
    GCode/AvoidCrossingPerimeters.hpp
    GCode/Travels.cpp
    GCode/Travels.hpp
    GCode/ExtrusionOrder.cpp
    GCode/ExtrusionOrder.hpp
    GCode.cpp
    GCode.hpp
    GCodeReader.cpp
    GCodeReader.hpp
    # GCodeSender.cpp
    # GCodeSender.hpp
    Geometry.cpp
    Geometry.hpp
    Geometry/ArcWelder.cpp
    Geometry/ArcWelder.hpp
    Geometry/Bicubic.hpp
    Geometry/Circle.cpp
    Geometry/Circle.hpp
    Geometry/ConvexHull.cpp
    Geometry/ConvexHull.hpp
    Geometry/Curves.hpp
    Geometry/MedialAxis.cpp
    Geometry/MedialAxis.hpp
    Geometry/Voronoi.hpp
    Geometry/VoronoiOffset.cpp
    Geometry/VoronoiOffset.hpp
    Geometry/VoronoiUtils.hpp
    Geometry/VoronoiUtils.cpp
    Geometry/VoronoiVisualUtils.hpp
    InfillAboveBridges.hpp
    InfillAboveBridges.cpp
    JumpPointSearch.cpp
    JumpPointSearch.hpp
    KDTreeIndirect.hpp
    Layer.cpp
    Layer.hpp
    LayerRegion.hpp
    LayerRegion.cpp
    libslic3r.h
    "${CMAKE_CURRENT_BINARY_DIR}/libslic3r_version.h"
    Line.cpp
    Line.hpp
    BlacklistedLibraryCheck.cpp
    BlacklistedLibraryCheck.hpp
    CutUtils.cpp
    CutUtils.hpp
    Model.cpp
    Model.hpp
    ModelProcessing.cpp
    ModelProcessing.hpp
    FileReader.cpp
    FileReader.hpp
    MultiMaterialSegmentation.cpp
    MultiMaterialSegmentation.hpp
    MeshNormals.hpp
    MeshNormals.cpp
    Measure.hpp
    Measure.cpp
    MeasureUtils.hpp
    CustomGCode.cpp
    CustomGCode.hpp
    CustomParametersHandling.cpp
    CustomParametersHandling.hpp
    MultiPoint.cpp
    MultiPoint.hpp
    MutablePriorityQueue.hpp
    NormalUtils.cpp
    NormalUtils.hpp
    NSVGUtils.cpp
    NSVGUtils.hpp
    ObjectID.cpp
    ObjectID.hpp
    PerimeterGenerator.cpp
    PerimeterGenerator.hpp
    PlaceholderParser.cpp
    PlaceholderParser.hpp
    Platform.cpp
    Platform.hpp
    Point.cpp
    Point.hpp
    Polygon.cpp
    Polygon.hpp
    MutablePolygon.cpp
    MutablePolygon.hpp
    PolygonTrimmer.cpp
    PolygonTrimmer.hpp
    Polyline.cpp
    Polyline.hpp
    Preset.cpp
    Preset.hpp
    PresetBundle.cpp
    PresetBundle.hpp
    PrincipalComponents2D.hpp
    PrincipalComponents2D.cpp
    AppConfig.cpp
    AppConfig.hpp
    Print.cpp
    Print.hpp
    PrintApply.cpp
    PrintBase.cpp
    PrintBase.hpp
    PrintConfig.cpp
    PrintConfig.hpp
    PrintObject.cpp
    PrintObjectSlice.cpp
    PrintRegion.cpp
    PointGrid.hpp
    PNGReadWrite.hpp
    PNGReadWrite.cpp
    QuadricEdgeCollapse.cpp
    QuadricEdgeCollapse.hpp
    Semver.cpp
    ShortEdgeCollapse.cpp
    ShortEdgeCollapse.hpp
    ShortestPath.cpp
    ShortestPath.hpp
    SLAPrint.cpp
    SLAPrintSteps.cpp
    SLAPrintSteps.hpp
    SLAPrint.hpp
    Slicing.cpp
    Slicing.hpp
    SlicesToTriangleMesh.hpp
    SlicesToTriangleMesh.cpp
    SlicingAdaptive.cpp
    SlicingAdaptive.hpp
    Subdivide.cpp
    Subdivide.hpp
    Support/SupportCommon.cpp
    Support/SupportCommon.hpp
    Support/SupportDebug.cpp
    Support/SupportDebug.hpp
    Support/SupportLayer.hpp
    Support/SupportMaterial.cpp
    Support/SupportMaterial.hpp
    Support/SupportParameters.cpp
    Support/SupportParameters.hpp
    Support/OrganicSupport.cpp
    Support/OrganicSupport.hpp
    Support/TreeSupport.cpp
    Support/TreeSupport.hpp
    Support/TreeSupportCommon.cpp
    Support/TreeSupportCommon.hpp
    Support/TreeModelVolumes.cpp
    Support/TreeModelVolumes.hpp
    SupportSpotsGenerator.cpp
    SupportSpotsGenerator.hpp
    Surface.cpp
    Surface.hpp
    SurfaceCollection.cpp
    SurfaceCollection.hpp
    SurfaceMesh.hpp
    SVG.cpp
    SVG.hpp
    Technologies.hpp
    Tesselate.cpp
    Tesselate.hpp
    TextConfiguration.hpp
    TriangleMesh.cpp
    TriangleMesh.hpp
    TriangleMeshSlicer.cpp
    TriangleMeshSlicer.hpp
    MeshSplitImpl.hpp
    TriangulateWall.hpp
    utils.cpp
    Utils.hpp
    Time.cpp
    Time.hpp
    Timer.cpp
    Timer.hpp
    Thread.cpp
    Thread.hpp
    TriangleSelector.cpp
    TriangleSelector.hpp
    TriangleSetSampling.cpp
    TriangleSetSampling.hpp
    TriangleSelectorWrapper.cpp
    TriangleSelectorWrapper.hpp
    MTUtils.hpp
    Zipper.hpp
    Zipper.cpp
    MinAreaBoundingBox.hpp
    MinAreaBoundingBox.cpp
    miniz_extension.hpp
    miniz_extension.cpp
    MarchingSquares.hpp
    MultipleBeds.cpp
    MultipleBeds.hpp
    Execution/Execution.hpp
    Execution/ExecutionSeq.hpp
    Execution/ExecutionTBB.hpp
    Optimize/Optimizer.hpp
    Optimize/NLoptOptimizer.hpp
    Optimize/BruteforceOptimizer.hpp
    ${OpenVDBUtils_SOURCES}
    SLA/Pad.hpp
    SLA/Pad.cpp
    SLA/PrinterCorrections.hpp
    SLA/PrinterCorrections.cpp
    SLA/SupportTreeBuilder.hpp
    SLA/SupportTreeMesher.hpp
    SLA/SupportTreeSlicer.hpp
    SLA/SupportTreeSlicer.cpp
    SLA/SupportSlicesCache.hpp
    SLA/SupportSlicesCache.cpp
    SLA/SupportTreeMesher.cpp
    SLA/SupportTreeUtils.hpp
    SLA/SupportTreeUtilsLegacy.hpp
    SLA/SupportTreeBuilder.cpp
    SLA/SupportTree.hpp
    SLA/SupportTree.cpp
    SLA/SupportTreeStrategies.hpp
#    SLA/SupportTreeIGL.cpp
    SLA/Rotfinder.hpp
    SLA/Rotfinder.cpp
    SLA/SpatIndex.hpp
    SLA/SpatIndex.cpp
    SLA/RasterBase.hpp
    SLA/RasterBase.cpp
    SLA/AGGRaster.hpp
    SLA/RasterToPolygons.hpp
    SLA/RasterToPolygons.cpp
    SLA/ConcaveHull.hpp
    SLA/ConcaveHull.cpp
    SLA/Hollowing.hpp
    SLA/Hollowing.cpp
    SLA/JobController.hpp
    SLA/SupportPoint.hpp
    SLA/SupportPointGenerator.hpp
    SLA/SupportPointGenerator.cpp
    SLA/Clustering.hpp
    SLA/Clustering.cpp
    SLA/ReprojectPointsOnMesh.hpp
    SLA/DefaultSupportTree.hpp
    SLA/DefaultSupportTree.cpp
    SLA/BranchingTreeSLA.hpp
    SLA/BranchingTreeSLA.cpp
    SLA/ZCorrection.hpp
    SLA/ZCorrection.cpp
    SLA/Workflows.hpp
    SLA/Workflows.cpp
    SLA/SupportIslands/EvaluateNeighbor.cpp
    SLA/SupportIslands/EvaluateNeighbor.hpp
    SLA/SupportIslands/ExpandNeighbor.cpp
    SLA/SupportIslands/ExpandNeighbor.hpp
    SLA/SupportIslands/IStackFunction.hpp
    SLA/SupportIslands/LineUtils.cpp
    SLA/SupportIslands/LineUtils.hpp
    SLA/SupportIslands/NodeDataWithResult.hpp
    SLA/SupportIslands/Parabola.hpp
    SLA/SupportIslands/ParabolaUtils.cpp
    SLA/SupportIslands/ParabolaUtils.hpp
    SLA/SupportIslands/PointUtils.cpp
    SLA/SupportIslands/PointUtils.hpp
    SLA/SupportIslands/PolygonUtils.cpp
    SLA/SupportIslands/PolygonUtils.hpp
    SLA/SupportIslands/PostProcessNeighbor.cpp
    SLA/SupportIslands/PostProcessNeighbor.hpp
    SLA/SupportIslands/PostProcessNeighbors.cpp
    SLA/SupportIslands/PostProcessNeighbors.hpp
    SLA/SupportIslands/SampleConfig.hpp
    SLA/SupportIslands/SampleConfigFactory.cpp
    SLA/SupportIslands/SampleConfigFactory.hpp
    SLA/SupportIslands/SupportIslandPoint.cpp
    SLA/SupportIslands/SupportIslandPoint.hpp
    SLA/SupportIslands/UniformSupportIsland.cpp
    SLA/SupportIslands/UniformSupportIsland.hpp
    SLA/SupportIslands/VectorUtils.hpp
    SLA/SupportIslands/VoronoiGraph.hpp
    SLA/SupportIslands/VoronoiGraphUtils.cpp
    SLA/SupportIslands/VoronoiGraphUtils.hpp
    BranchingTree/BranchingTree.cpp
    BranchingTree/BranchingTree.hpp
    BranchingTree/PointCloud.cpp
    BranchingTree/PointCloud.hpp
    Arachne/BeadingStrategy/BeadingStrategy.hpp
    Arachne/BeadingStrategy/BeadingStrategy.cpp
    Arachne/BeadingStrategy/BeadingStrategyFactory.hpp
    Arachne/BeadingStrategy/BeadingStrategyFactory.cpp
    Arachne/BeadingStrategy/DistributedBeadingStrategy.hpp
    Arachne/BeadingStrategy/DistributedBeadingStrategy.cpp
    Arachne/BeadingStrategy/LimitedBeadingStrategy.hpp
    Arachne/BeadingStrategy/LimitedBeadingStrategy.cpp
    Arachne/BeadingStrategy/OuterWallInsetBeadingStrategy.hpp
    Arachne/BeadingStrategy/OuterWallInsetBeadingStrategy.cpp
    Arachne/BeadingStrategy/RedistributeBeadingStrategy.hpp
    Arachne/BeadingStrategy/RedistributeBeadingStrategy.cpp
    Arachne/BeadingStrategy/WideningBeadingStrategy.hpp
    Arachne/BeadingStrategy/WideningBeadingStrategy.cpp
    Arachne/utils/ExtrusionJunction.hpp
    Arachne/utils/ExtrusionLine.hpp
    Arachne/utils/ExtrusionLine.cpp
    Arachne/utils/HalfEdge.hpp
    Arachne/utils/HalfEdgeGraph.hpp
    Arachne/utils/HalfEdgeNode.hpp
    Arachne/utils/SparseGrid.hpp
    Arachne/utils/SparsePointGrid.hpp
    Arachne/utils/SparseLineGrid.hpp
    Arachne/utils/SquareGrid.hpp
    Arachne/utils/SquareGrid.cpp
    Arachne/utils/PolygonsPointIndex.hpp
    Arachne/utils/PolygonsSegmentIndex.hpp
    Arachne/utils/PolylineStitcher.hpp
    Arachne/utils/PolylineStitcher.cpp
    Geometry/Voronoi.cpp
    Geometry/VoronoiUtils.hpp
    Geometry/VoronoiUtils.cpp
    Arachne/PerimeterOrder.hpp
    Arachne/PerimeterOrder.cpp
    Arachne/SkeletalTrapezoidation.hpp
    Arachne/SkeletalTrapezoidation.cpp
    Arachne/SkeletalTrapezoidationEdge.hpp
    Arachne/SkeletalTrapezoidationGraph.hpp
    Arachne/SkeletalTrapezoidationGraph.cpp
    Arachne/SkeletalTrapezoidationJoint.hpp
    Arachne/WallToolPaths.hpp
    Arachne/WallToolPaths.cpp
    StaticMap.hpp
    Utils/DirectoriesUtils.hpp
    Utils/DirectoriesUtils.cpp
    Utils/JsonUtils.hpp
    Utils/JsonUtils.cpp
)

if (APPLE)
    list(APPEND SLIC3R_SOURCES
            MacUtils.mm
        )
endif ()

add_library(libslic3r STATIC ${SLIC3R_SOURCES})

if (WIN32)
    target_compile_definitions(libslic3r PUBLIC NOMINMAX)
endif()

foreach(_source IN ITEMS ${SLIC3R_SOURCES})
    get_filename_component(_source_path "${_source}" PATH)
    string(REPLACE "/" "\\" _group_path "${_source_path}")
    source_group("${_group_path}" FILES "${_source}")
endforeach()

# Create the source groups for source tree with root at CMAKE_CURRENT_SOURCE_DIR.
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${SOURCE_LIST_SLA})

if (SLIC3R_STATIC)
    set(CGAL_Boost_USE_STATIC_LIBS ON CACHE BOOL "" FORCE)
endif ()
set(CGAL_DO_NOT_WARN_ABOUT_CMAKE_BUILD_TYPE ON CACHE BOOL "" FORCE)

cmake_policy(PUSH)
cmake_policy(SET CMP0011 NEW)
find_package(CGAL REQUIRED)
cmake_policy(POP)

add_library(libslic3r_cgal STATIC
    CutSurface.hpp CutSurface.cpp
    Geometry/VoronoiUtilsCgal.hpp Geometry/VoronoiUtilsCgal.cpp
    IntersectionPoints.hpp IntersectionPoints.cpp
    MeshBoolean.hpp MeshBoolean.cpp
    TryCatchSignal.hpp TryCatchSignal.cpp
    Triangulation.hpp Triangulation.cpp
    SLA/SupportIslands/VoronoiDiagramCGAL.hpp SLA/SupportIslands/VoronoiDiagramCGAL.cpp
)
target_include_directories(libslic3r_cgal PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
target_include_directories(libslic3r_cgal PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/..)

# Reset compile options of libslic3r_cgal. Despite it being linked privately, CGAL options
# (-frounding-math) still propagate to dependent libs which is not desired.
get_target_property(_cgal_tgt CGAL::CGAL ALIASED_TARGET)
if (NOT TARGET ${_cgal_tgt})
    set (_cgal_tgt CGAL::CGAL)
endif ()
get_target_property(_opts ${_cgal_tgt} INTERFACE_COMPILE_OPTIONS)
if (_opts)
    set(_opts_bad "${_opts}")
    set(_opts_good "${_opts}")
    list(FILTER _opts_bad INCLUDE REGEX frounding-math)
    list(FILTER _opts_good EXCLUDE REGEX frounding-math)
    set_target_properties(${_cgal_tgt} PROPERTIES INTERFACE_COMPILE_OPTIONS "${_opts_good}")
    target_compile_options(libslic3r_cgal PRIVATE "${_opts_bad}")
endif()

target_link_libraries(libslic3r_cgal PRIVATE ${_cgal_tgt} libigl)
target_link_libraries(libslic3r_cgal PUBLIC semver admesh localesutils)

if (MSVC AND "${CMAKE_SIZEOF_VOID_P}" STREQUAL "4") # 32 bit MSVC workaround
    target_compile_definitions(libslic3r_cgal PRIVATE CGAL_DO_NOT_USE_MPZF)
endif ()

encoding_check(libslic3r)

target_compile_definitions(libslic3r PUBLIC -DUSE_TBB -DTBB_USE_CAPTURED_EXCEPTION=0)
target_include_directories(libslic3r PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/.. ${CMAKE_CURRENT_BINARY_DIR})
target_include_directories(libslic3r PUBLIC ${EXPAT_INCLUDE_DIRS})

find_package(JPEG REQUIRED)
find_package(nlohmann_json REQUIRED)

target_link_libraries(libslic3r PRIVATE
    sla_time_estimate
    libnest2d
    libcereal
    boost_libs
    clipper
    libexpat
    glu-libtess
    qhull
    TBB::tbb
    TBB::tbbmalloc
    libslic3r_cgal
    ${CMAKE_DL_LIBS}
    PNG::PNG
    ZLIB::ZLIB
	JPEG::JPEG
    qoi
    fastfloat
    int128
    nlohmann_json::nlohmann_json
)
target_link_libraries(libslic3r PUBLIC
    Eigen3::Eigen
    semver
    admesh
    localesutils
    LibBGCode::bgcode_convert
    tcbspan
    miniz
    libigl
    agg
    ankerl
    boost_headeronly
    libseqarrange
    prusa_fdm_mixer
)

if (APPLE)
    # TODO: we need to fix notarization with the separate shared library
    target_link_libraries(libslic3r PUBLIC OCCTWrapper)
endif ()

if (TARGET OpenVDB::openvdb)
    target_link_libraries(libslic3r PUBLIC OpenVDB::openvdb)
endif()

if(WIN32)
    target_link_libraries(libslic3r PUBLIC Psapi.lib)
endif()

if (APPLE)
    # This flag prevents the need for minimum SDK version 10.14
    # currently, PS targets v10.12
    target_compile_options(libslic3r PUBLIC "-fno-aligned-allocation")
    target_compile_options(libslic3r_cgal PUBLIC "-fno-aligned-allocation")
endif ()

if (SLIC3R_PCH AND NOT SLIC3R_SYNTAXONLY)
    add_precompiled_header(libslic3r pchheader.hpp FORCEINCLUDE)
endif ()
