cmake_minimum_required(VERSION 3.13) project(libslic3r) include(PrecompiledHeader) if(NOT DEFINED ORCA_CHECK_GCODE_PLACEHOLDERS) set(ORCA_CHECK_GCODE_PLACEHOLDERS "0") endif() 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) endif() option(BUILD_SHARED_LIBS "Build shared libs" OFF) option(USE_SLIC3R_CONSOLE_LOG "Enable console logging in RelWithDebInfo builds" OFF) # SolveSpace constraint solver (2D sketch solver backbone), built in deps/SLVS. if (SLIC3R_CAD) find_package(SLVS REQUIRED) endif () set(lisbslic3r_sources AABBMesh.cpp AABBMesh.hpp AABBTreeIndirect.hpp AABBTreeLines.hpp Algorithm/LineSplit.cpp Algorithm/LineSplit.hpp Algorithm/RegionExpansion.cpp Algorithm/RegionExpansion.hpp AnyPtr.hpp AppConfig.cpp AppConfig.hpp Arachne/BeadingStrategy/BeadingStrategy.cpp Arachne/BeadingStrategy/BeadingStrategyFactory.cpp Arachne/BeadingStrategy/BeadingStrategyFactory.hpp Arachne/BeadingStrategy/BeadingStrategy.hpp Arachne/BeadingStrategy/DistributedBeadingStrategy.cpp Arachne/BeadingStrategy/DistributedBeadingStrategy.hpp Arachne/BeadingStrategy/LimitedBeadingStrategy.cpp Arachne/BeadingStrategy/LimitedBeadingStrategy.hpp Arachne/BeadingStrategy/OuterWallInsetBeadingStrategy.cpp Arachne/BeadingStrategy/OuterWallInsetBeadingStrategy.hpp Arachne/BeadingStrategy/RedistributeBeadingStrategy.cpp Arachne/BeadingStrategy/RedistributeBeadingStrategy.hpp Arachne/BeadingStrategy/WideningBeadingStrategy.cpp Arachne/BeadingStrategy/WideningBeadingStrategy.hpp Arachne/SkeletalTrapezoidation.cpp Arachne/SkeletalTrapezoidationEdge.hpp Arachne/SkeletalTrapezoidationGraph.cpp Arachne/SkeletalTrapezoidationGraph.hpp Arachne/SkeletalTrapezoidation.hpp Arachne/SkeletalTrapezoidationJoint.hpp Arachne/utils/ExtrusionJunction.hpp Arachne/utils/ExtrusionLine.cpp Arachne/utils/ExtrusionLine.hpp Arachne/utils/HalfEdgeGraph.hpp Arachne/utils/HalfEdge.hpp Arachne/utils/HalfEdgeNode.hpp Arachne/utils/PolygonsPointIndex.hpp Arachne/utils/PolygonsSegmentIndex.hpp Arachne/utils/PolylineStitcher.cpp Arachne/utils/PolylineStitcher.hpp Arachne/utils/SparseGrid.hpp Arachne/utils/SparseLineGrid.hpp Arachne/utils/SparsePointGrid.hpp Arachne/utils/SquareGrid.cpp Arachne/utils/SquareGrid.hpp Arachne/WallToolPaths.cpp Arachne/WallToolPaths.hpp ArcFitter.cpp ArcFitter.hpp Arrange.cpp Arrange.hpp BlacklistedLibraryCheck.cpp BlacklistedLibraryCheck.hpp BoundingBox.cpp BoundingBox.hpp BridgeDetector.cpp BridgeDetector.hpp BeltBrim.cpp BeltBrim.hpp BeltGCode.cpp BeltGCode.hpp BeltPurge.cpp BeltSliceStrategy.cpp BeltSliceStrategy.hpp BeltTransform.cpp BeltTransform.hpp Brim.cpp BrimEarsPoint.hpp Brim.hpp BuildVolume.cpp BuildVolume.hpp calib.cpp calib.hpp Circle.cpp Circle.hpp ClipperUtils.cpp ClipperUtils.hpp ClipperZUtils.cpp ClipperZUtils.hpp Color.cpp Color.hpp CommonDefs.hpp Config.cpp Config.hpp ContourZ.cpp CustomGCode.cpp CustomGCode.hpp CutUtils.cpp CutUtils.hpp EdgeGrid.cpp EdgeGrid.hpp ElephantFootCompensation.cpp ElephantFootCompensation.hpp Emboss.cpp Emboss.hpp EmbossShape.hpp enum_bitmask.hpp Execution/Execution.hpp Execution/ExecutionSeq.hpp Execution/ExecutionTBB.hpp ExPolygon.cpp ExPolygon.hpp ExPolygonSerialize.hpp ExPolygonsIndex.cpp ExPolygonsIndex.hpp Extruder.cpp Extruder.hpp ExtrusionEntityCollection.cpp ExtrusionEntityCollection.hpp ExtrusionEntity.cpp ExtrusionEntity.hpp ExtrusionSimulator.cpp ExtrusionSimulator.hpp FaceDetector.cpp FaceDetector.hpp Feature/FuzzySkin/FuzzySkin.cpp Feature/FuzzySkin/FuzzySkin.hpp Feature/Interlocking/InterlockingGenerator.cpp Feature/Interlocking/InterlockingGenerator.hpp Feature/Interlocking/VoxelUtils.cpp Feature/Interlocking/VoxelUtils.hpp FileParserError.hpp 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/FillSpiralInset.cpp Fill/FillSpiralInset.hpp Fill/FillConcentricInternal.cpp Fill/FillConcentricInternal.hpp Fill/FillCornerSmoothing.cpp Fill/FillCornerSmoothing.hpp Fill/Fill.cpp Fill/FillCrossHatch.cpp Fill/FillCrossHatch.hpp Fill/FillGyroid.cpp Fill/FillGyroid.hpp Fill/FillHoneycomb.cpp Fill/FillHoneycomb.hpp Fill/Fill.hpp Fill/FillLightning.cpp Fill/FillLightning.hpp Fill/FillLine.cpp Fill/FillLine.hpp Fill/FillPlanePath.cpp Fill/FillPlanePath.hpp Fill/FillRectilinear.cpp Fill/FillRectilinear.hpp Fill/FillTpmsD.cpp Fill/FillTpmsD.hpp Fill/FillTpmsFK.cpp Fill/FillTpmsFK.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 FilamentMixer.cpp FilamentMixer.hpp FilamentMixerModel.hpp ColorDecomposeRecipe.cpp ColorDecomposeRecipe.hpp TexturePainting.hpp TexturePainting.cpp TextureToColor/TextureToColor.hpp TextureToColor/TextureToColor.cpp TextureToColor/ColorUtils.hpp TextureToColor/ColorUtils.cpp Flow.cpp Flow.hpp FlushVolCalc.cpp FlushVolCalc.hpp Format/3mf.cpp Format/3mf.hpp Format/AMF.cpp Format/AMF.hpp Format/AssembleList.cpp Format/AssembleList.hpp Format/DRC.cpp Format/DRC.hpp Format/bbs_3mf.cpp Format/bbs_3mf.hpp format.hpp Format/OBJ.cpp Format/OBJ.hpp Format/AssimpImport.hpp Format/AssimpImport.cpp Format/ResourcePathUtils.hpp Format/objparser.cpp Format/objparser.hpp Format/SL1.cpp Format/SL1.hpp Format/STEP.cpp Format/STEP.hpp Format/STL.cpp Format/STL.hpp Format/svg.cpp Format/svg.hpp Format/ZipperArchiveImport.cpp Format/ZipperArchiveImport.hpp GCode/AdaptivePAInterpolator.cpp GCode/AdaptivePAInterpolator.hpp GCode/AdaptivePAProcessor.cpp GCode/AdaptivePAProcessor.hpp GCode/AvoidCrossingPerimeters.cpp GCode/AvoidCrossingPerimeters.hpp GCode/BeltBackTransform.cpp GCode/BeltBackTransform.hpp GCode/MachineFrameTransform.cpp GCode/MachineFrameTransform.hpp GCode/BeltKinematics.cpp GCode/BeltKinematics.hpp GCode/MachineKinematics.cpp GCode/MachineKinematics.hpp GCode/ConflictChecker.cpp GCode/ConflictChecker.hpp GCode/CoolingBuffer.cpp GCode/CoolingBuffer.hpp GCode/TimelapsePosPicker.cpp GCode/TimelapsePosPicker.hpp GCode.cpp GCode/ExtrusionProcessor.hpp GCode/FanMover.cpp GCode/FanMover.hpp GCode/GCodeProcessor.cpp GCode/GCodeProcessor.hpp GCode/ElegooGCodeProcessorHelper.cpp GCode.hpp GCode/PchipInterpolatorHelper.cpp GCode/PchipInterpolatorHelper.hpp GCode/PressureEqualizer.cpp GCode/PressureEqualizer.hpp GCode/PrintExtents.cpp GCode/PrintExtents.hpp GCodeReader.cpp GCodeReader.hpp GCode/RetractWhenCrossingPerimeters.cpp GCode/RetractWhenCrossingPerimeters.hpp GCode/SeamPlacer.cpp GCode/SeamPlacer.hpp GCode/PreciseSeam.cpp GCode/PreciseSeam.hpp GCode/PreciseSeamInternal.hpp #GCodeSender.cpp #GCodeSender.hpp GCode/SmallAreaInfillFlowCompensator.cpp GCode/SmallAreaInfillFlowCompensator.hpp GCode/SpiralVase.cpp GCode/SpiralVase.hpp GCode/WipePathHelpers.cpp GCode/WipePathHelpers.hpp GCode/ThumbnailData.cpp GCode/ThumbnailData.hpp GCode/Thumbnails.cpp GCode/Thumbnails.hpp GCode/ToolOrdering.cpp GCode/ToolOrdering.hpp GCode/OrderingStrategies.cpp GCode/OrderingStrategies.hpp GCode/WipeTower2.cpp GCode/WipeTower2.hpp GCode/WipeTower.cpp GCode/WipeTower.hpp GCode/WipeTowerEstimate.cpp GCode/WipeTowerEstimate.hpp GCodeWriter.cpp GCodeWriter.hpp Geometry/ArcWelder.hpp Geometry/ArcWelder.cpp Geometry/Bicubic.hpp Geometry/Circle.cpp Geometry/Circle.hpp Geometry/ConvexHull.cpp Geometry/ConvexHull.hpp Geometry.cpp Geometry/Curves.hpp Geometry.hpp Geometry/MedialAxis.cpp Geometry/MedialAxis.hpp Geometry/Voronoi.cpp Geometry/Voronoi.hpp Geometry/VoronoiOffset.cpp Geometry/VoronoiOffset.hpp Geometry/VoronoiUtilsCgal.cpp Geometry/VoronoiUtilsCgal.hpp Geometry/VoronoiUtils.cpp Geometry/VoronoiUtils.hpp Geometry/VoronoiVisualUtils.hpp InstanceLock.cpp InstanceLock.hpp Int128.hpp KDTreeIndirect.hpp Layer.cpp Layer.hpp LayerRegion.cpp LayOnFace.cpp LayOnFace.hpp libslic3r.cpp libslic3r.h Line.cpp Line.hpp LocalesUtils.cpp LocalesUtils.hpp MarchingSquares.hpp Measure.cpp Measure.hpp MeasureUtils.hpp MeshSplitImpl.hpp MinAreaBoundingBox.cpp MinAreaBoundingBox.hpp MinimumSpanningTree.cpp MinimumSpanningTree.hpp miniz_extension.cpp miniz_extension.hpp ModelArrange.cpp ModelArrange.hpp Model.cpp Model.hpp MTUtils.hpp MultiMaterialSegmentation.cpp MultiMaterialSegmentation.hpp MultiPoint.cpp MultiPoint.hpp MutablePolygon.cpp MutablePolygon.hpp MutablePriorityQueue.hpp NormalUtils.cpp NormalUtils.hpp NSVGUtils.cpp NSVGUtils.hpp ObjColorUtils.cpp ObjColorUtils.hpp ObjectID.cpp ObjectID.hpp Optimize/BruteforceOptimizer.hpp Optimize/NLoptOptimizer.hpp Optimize/Optimizer.hpp Orient.cpp Orient.hpp ParallelResolve.hpp ParameterUtils.cpp ParameterUtils.hpp pchheader.cpp pchheader.hpp PerimeterGenerator.cpp PerimeterGenerator.hpp PlaceholderParser.cpp PlaceholderParser.hpp Platform.cpp Platform.hpp PNGReadWrite.cpp PNGReadWrite.hpp Point.cpp Point.hpp Polygon.cpp Polygon.hpp PolygonTrimmer.cpp PolygonTrimmer.hpp Polyline.cpp Polyline.hpp PresetBundle.cpp PresetBundle.hpp PresetCacheFormat.cpp PresetCacheFormat.hpp Preset.cpp Preset.hpp PrincipalComponents2D.cpp PrincipalComponents2D.hpp PublishSettings.cpp PublishSettings.hpp PrintApply.cpp PrintBase.cpp PrintBase.hpp MaterialType.cpp MaterialType.hpp PrintConfig.cpp PrintConfig.hpp Print.cpp Print.hpp PrintObject.cpp PrintObjectSlice.cpp PrintRegion.cpp ProjectTask.cpp ProjectTask.hpp QuadricEdgeCollapse.cpp QuadricEdgeCollapse.hpp Semver.cpp Shape/TextShape.cpp Shape/TextShape.hpp ShortEdgeCollapse.cpp ShortEdgeCollapse.hpp ShortestPath.cpp ShortestPath.hpp SLA/AGGRaster.hpp SLA/BoostAdapter.hpp SLA/Clustering.cpp SLA/Clustering.hpp SLA/ConcaveHull.cpp SLA/ConcaveHull.hpp SLA/Concurrency.hpp SLA/Hollowing.cpp SLA/Hollowing.hpp SLA/IndexedMesh.cpp SLA/IndexedMesh.hpp SLA/JobController.hpp SLA/Pad.cpp SLA/Pad.hpp SLAPrint.cpp SLAPrint.hpp SLAPrintSteps.cpp SLAPrintSteps.hpp SLA/RasterBase.cpp SLA/RasterBase.hpp SLA/RasterToPolygons.cpp SLA/RasterToPolygons.hpp SLA/ReprojectPointsOnMesh.hpp SLA/Rotfinder.cpp SLA/Rotfinder.hpp SLA/SpatIndex.cpp SLA/SpatIndex.hpp SLA/SupportPointGenerator.cpp SLA/SupportPointGenerator.hpp SLA/SupportPoint.hpp SLA/SupportTreeBuilder.cpp SLA/SupportTreeBuilder.hpp SLA/SupportTreeBuildsteps.cpp SLA/SupportTreeBuildsteps.hpp SLA/SupportTree.cpp SLA/SupportTree.hpp #SLA/SupportTreeIGL.cpp SLA/SupportTreeMesher.cpp SLA/SupportTreeMesher.hpp SlicesToTriangleMesh.cpp SlicesToTriangleMesh.hpp SlicingAdaptive.cpp SlicingAdaptive.hpp Slicing.cpp Slicing.hpp Support/BeltFloorContext.cpp Support/BeltFloorContext.hpp Support/SupportCommon.cpp Support/SupportCommon.hpp Support/SupportLayer.hpp Support/SupportMaterial.cpp Support/SupportMaterial.hpp Support/SupportParameters.hpp Support/SupportSpotsGenerator.cpp Support/SupportSpotsGenerator.hpp Support/TreeModelVolumes.cpp Support/TreeModelVolumes.hpp Support/TreeSupport3D.cpp Support/TreeSupport3D.hpp Support/TreeSupportCommon.hpp Support/TreeSupport.cpp Support/TreeSupport.hpp SurfaceCollection.cpp SurfaceCollection.hpp Surface.cpp Surface.hpp SurfaceMesh.hpp SVG.cpp SVG.hpp Technologies.hpp Tesselate.cpp Tesselate.hpp TextConfiguration.hpp TextureDisplacement.cpp TextureDisplacement.hpp TextureBake/TextureBakeIndex.cpp TextureBake/TextureBakeIndex.hpp TextureBake/TextureBakeSubdivide.cpp TextureBake/TextureBakeSubdivide.hpp TextureBake/TextureBakeRegularize.cpp TextureBake/TextureBakeRegularize.hpp TextureBake/TextureBakeRelocate.cpp TextureBake/TextureBakeRelocate.hpp TextureBake/TextureBakeFlip.cpp TextureBake/TextureBakeFlip.hpp TextureBake/TextureBakeDebug.cpp TextureBake/TextureBakeDebug.hpp TextureBake/TextureBakeDisplace.cpp TextureBake/TextureBakeDisplace.hpp TextureBake/TextureBakeDecimate.cpp TextureBake/TextureBakeDecimate.hpp TextureBake/TextureBakeRepair.cpp TextureBake/TextureBakeRepair.hpp TextureBake/TextureBakePipeline.cpp TextureBake/TextureBakePipeline.hpp TextureBake/TextureBakeMesh.cpp TextureBake/TextureBakeMesh.hpp Thread.cpp Thread.hpp Time.cpp Time.hpp Timer.cpp Timer.hpp TriangleMesh.cpp TriangleMesh.hpp TriangleMeshDeal.cpp TriangleMeshDeal.hpp TriangleMeshSlicer.cpp TriangleMeshSlicer.hpp TriangleSelector.cpp TriangleSelector.hpp TriangleSetSampling.cpp TriangleSetSampling.hpp TriangulateWall.cpp TriangulateWall.hpp utils.cpp Utils.hpp VariableWidth.cpp VariableWidth.hpp Zipper.cpp Zipper.hpp FilamentGroup.hpp FilamentGroup.cpp FilamentGroupUtils.hpp FilamentGroupUtils.cpp MultiNozzleUtils.hpp MultiNozzleUtils.cpp GCode/ToolOrderUtils.hpp GCode/ToolOrderUtils.cpp FlushVolPredictor.hpp FlushVolPredictor.cpp ) # Parametric Design/CAD kernel. Needs OCCT's ModelingAlgorithms module and the # vendored SolveSpace solver; both are pulled in only when SLIC3R_CAD is ON. if (SLIC3R_CAD) list(APPEND lisbslic3r_sources CAD/GeometryEngine.cpp CAD/GeometryEngine.hpp CAD/SketchEngine.cpp CAD/SketchEngine.hpp CAD/SketchConstraints.cpp CAD/SketchConstraints.hpp CAD/SketchSolver.cpp CAD/SketchSolver.hpp CAD/SketchInference.cpp CAD/SketchInference.hpp CAD/SketchImport.cpp CAD/SketchImport.hpp CAD/CadDocument.cpp CAD/CadDocument.hpp CAD/ThreadStandards.cpp CAD/ThreadStandards.hpp ) endif () if (APPLE) list(APPEND lisbslic3r_sources MacUtils.mm Format/ModelIO.hpp Format/ModelIO.mm ) endif () add_library(libslic3r STATIC ${lisbslic3r_sources} "${CMAKE_CURRENT_BINARY_DIR}/libslic3r_version.h" ${OpenVDBUtils_SOURCES}) source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${lisbslic3r_sources}) 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) # CGAL's config resets policies (cmake_minimum_required ...3.23), so a plain SET # can't reach it; the default opts its Boost lookup into BoostConfig (CMP0167). set(CMAKE_POLICY_DEFAULT_CMP0167 NEW) find_package(CGAL REQUIRED) find_package(OpenCV REQUIRED core) find_package(assimp REQUIRED) unset(CMAKE_POLICY_DEFAULT_CMP0167) cmake_policy(POP) add_library(libslic3r_cgal STATIC CutSurface.hpp CutSurface.cpp IntersectionPoints.hpp IntersectionPoints.cpp MeshBoolean.hpp MeshBoolean.cpp TryCatchSignal.hpp TryCatchSignal.cpp Triangulation.hpp Triangulation.cpp ) target_include_directories(libslic3r_cgal PRIVATE ${CMAKE_CURRENT_BINARY_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() if (IS_CLANG_CL) # CGAL passes /fp:strict /fp:except-. clang-cl reports the second as overriding part of # the first; the settings cc1 receives are the same ones MSVC produces from that pair. target_compile_options(libslic3r_cgal PRIVATE -Wno-overriding-option) endif () target_link_libraries(libslic3r_cgal PRIVATE ${_cgal_tgt} admesh libigl mcut boost_libs) 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) if (USE_SLIC3R_CONSOLE_LOG) target_compile_definitions(libslic3r PRIVATE $<$:SLIC3R_CONSOLE_LOG>) endif() target_include_directories(libslic3r PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/TextureToColor PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) target_include_directories(libslic3r SYSTEM PUBLIC ${EXPAT_INCLUDE_DIRS}) # Find the OCCT and related libraries set(OpenCASCADE_DIR "${CMAKE_PREFIX_PATH}/lib/cmake/occt") find_package(OpenCASCADE REQUIRED) target_include_directories(libslic3r SYSTEM PUBLIC ${OpenCASCADE_INCLUDE_DIR}) find_package(JPEG REQUIRED) find_package(Draco REQUIRED) set(OCCT_LIBS TKDESTEP TKDE TKXCAF TKXSBase TKVCAF TKCAF TKLCAF TKCDF TKV3d TKService TKMesh TKBO TKPrim TKHLR TKShHealing TKTopAlgo TKGeomAlgo TKBRep TKGeomBase TKG3d TKG2d TKMath TKernel ) # The CAD kernel is the only consumer of OCCT's ModelingAlgorithms module: TKFillet # (BRepFilletAPI), TKOffset (BRepOffsetAPI) and TKBool, which the other two need. # # PREPEND, never append: this list is single-pass static link order, dependents before # dependencies — note TKernel, which everything needs, is deliberately last. TKOffset # references BRepAlgo_Loop, which TKBool defines, so TKOffset must come BEFORE TKBool. # Appending put it after, and a strictly single-pass linker (the Flatpak build) failed with # libTKOffset.a(BRepOffset_MakeLoops.cxx.o): undefined reference to # `BRepAlgo_Loop::BRepAlgo_Loop()' # while the ordinary Linux, macOS and Windows links resolved it anyway. Use set() rather # than list(PREPEND), which needs CMake 3.15 and this project supports 3.13. if (SLIC3R_CAD) set(OCCT_LIBS TKFillet TKOffset TKBool ${OCCT_LIBS}) # deps is configured separately, so its SLIC3R_CAD can differ from ours. The module is # all-or-nothing, so one absent toolkit proves it; fail here rather than at link time. if (NOT TARGET TKFillet) message(FATAL_ERROR "SLIC3R_CAD is ON, but the OpenCASCADE in ${CMAKE_PREFIX_PATH} was built without " "BUILD_MODULE_ModelingAlgorithms. Rebuild the dependencies with -DSLIC3R_CAD=ON, " "or configure this project with -DSLIC3R_CAD=OFF.") endif () endif () # Published for the Windows packaging step in the top-level CMakeLists.txt. set(OCCT_LIBS "${OCCT_LIBS}" CACHE INTERNAL "OCCT toolkits linked by libslic3r") if (WIN32) # OCCT installs RelWithDebInfo and Debug builds to bin/occti and bin/occtd, so each build # type's DLL directory is read from the imported target, falling back to the first installed # build, as CMake does when linking. get_target_property(_occt_configs TKernel IMPORTED_CONFIGURATIONS) list(GET _occt_configs 0 _occt_fallback) foreach (_build_config IN ITEMS DEBUG RELEASE RELWITHDEBINFO MINSIZEREL) set(_occt_config ${_occt_fallback}) if (_build_config IN_LIST _occt_configs) set(_occt_config ${_build_config}) endif () get_target_property(_occt_dll TKernel IMPORTED_LOCATION_${_occt_config}) get_filename_component(_occt_bin "${_occt_dll}" DIRECTORY) set(OCCT_BIN_DIR_${_build_config} "${_occt_bin}" CACHE INTERNAL "OCCT DLL directory for ${_build_config} builds") endforeach () endif () target_link_libraries(libslic3r PUBLIC Eigen3::Eigen admesh libigl libnest2d miniz opencv_world assimp::assimp PRIVATE ${CMAKE_DL_LIBS} ${EXPAT_LIBRARIES} ${OCCT_LIBS} boost_libs cereal::cereal Clipper2 draco::draco glu-libtess JPEG::JPEG libslic3r_cgal mcut noise::noise PNG::PNG qhull qoi semver TBB::tbb TBB::tbbmalloc ZLIB::ZLIB OpenSSL::Crypto ) if(NOT WIN32) # OCCT's static targets name FreeType as a bare "freetype", which the macOS linker cannot # find; this target maps that name to FREETYPE_LIBRARIES. if (NOT TARGET freetype) add_library(freetype INTERFACE IMPORTED GLOBAL) target_link_libraries(freetype INTERFACE ${FREETYPE_LIBRARIES}) endif () # Link freetype for OCCT dependency (CAD operations need font rendering) target_link_libraries(libslic3r PRIVATE ${FREETYPE_LIBRARIES}) if (NOT APPLE) target_link_libraries(libslic3r PRIVATE fontconfig) endif() endif() if (APPLE) find_library(FOUNDATION Foundation REQUIRED) find_library(MODELIO ModelIO REQUIRED) target_link_libraries(libslic3r PRIVATE ${FOUNDATION} ${MODELIO}) endif () if (TARGET OpenVDB::openvdb) target_link_libraries(libslic3r PRIVATE OpenVDB::openvdb) endif() if (SLIC3R_CAD) target_link_libraries(libslic3r PUBLIC SLVS::slvs) endif () if(WIN32) target_link_libraries(libslic3r PRIVATE Psapi.lib bcrypt.lib) endif() if(SLIC3R_PROFILE) target_link_libraries(libslic3r PRIVATE Shiny) endif() if (WIN32) # Public, since BlacklistedLibraryCheck.hpp includes windows.h. Empty # WIN32_LEAN_AND_MEAN matches the sources that define it themselves; bare # NOMINMAX matches the one libigl already passes. target_compile_definitions(libslic3r PUBLIC "WIN32_LEAN_AND_MEAN=" "NOMINMAX") endif () if (SLIC3R_PCH AND NOT SLIC3R_SYNTAXONLY) add_precompiled_header(libslic3r pchheader.hpp FORCEINCLUDE) endif ()