2025-07-06 20:43:53 +03:00
cmake_minimum_required(VERSION 3.27.0)
set(CMAKE_CXX_STANDARD 23)
project(infinipaint)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Options to set
2025-08-09 10:45:39 +03:00
set(availableGraphicsBackends OpenGL3.3 OpenGL2.1 OpenGLES3.0 Vulkan)
2026-02-04 11:57:04 +03:00
set(GRAPHICS_BACKEND OpenGL3.3 CACHE STRING "Graphics backend to use")
2026-02-04 10:53:23 +03:00
2025-08-09 10:45:39 +03:00
set_property(CACHE GRAPHICS_BACKEND PROPERTY STRINGS ${availableGraphicsBackends})
list(FIND availableGraphicsBackends ${GRAPHICS_BACKEND} graphicsBackendIndex)
if(graphicsBackendIndex EQUAL -1)
message(FATAL_ERROR "Graphics backend must be one of: ${availableGraphicsBackends}")
endif()
option(USE_GRAPHITE "Use Skia Graphite Backend (only works for Vulkan graphics backend)" OFF)
2025-07-06 20:43:53 +03:00
option(USE_ASAN "Enable Address Sanitizer" OFF)
option(USE_UBSAN "Enable Undefined Behaviour Sanitizer" OFF)
option(USE_LEAKSAN "Enable Leak Sanitizer" OFF)
option(USE_THREADSAN "Enable Thread Sanitizer" OFF)
option(USE_MEMORYSAN "Enable Memory Sanitizer" OFF)
2025-11-14 16:37:49 +03:00
option(NO_CONAN_BUILD "Not using conan to get packages" OFF)
2025-10-02 14:30:11 +03:00
option(CONFIG_NEXT_TO_EXECUTABLE "Place configuration folder next to executable (portable executable)" OFF)
2025-11-24 02:00:06 -08:00
option(MACOS_MAKE_BUNDLE "Package the application as a bundle" ON)
2025-07-06 20:43:53 +03:00
# Setting sources
set(sources "src/main.cpp"
"src/SwitchCWD.cpp"
"src/MainProgram.cpp"
"src/DrawData.cpp"
"src/FontData.cpp"
2025-12-17 14:46:27 +03:00
"src/ClientData.cpp"
2025-07-06 20:43:53 +03:00
"src/GridManager.cpp"
2025-09-06 19:06:30 +03:00
"src/WorldGrid.cpp"
2025-07-06 20:43:53 +03:00
"src/TimePoint.cpp"
"src/InputManager.cpp"
"src/UndoManager.cpp"
2025-12-16 23:06:46 +03:00
"src/CanvasTheme.cpp"
2025-07-06 20:43:53 +03:00
"src/DrawCamera.cpp"
"src/DrawCollision.cpp"
"src/CoordSpaceHelper.cpp"
2025-08-04 10:47:24 +03:00
"src/CoordSpaceHelperTransform.cpp"
2025-07-06 20:43:53 +03:00
"src/ResourceManager.cpp"
"src/Toolbar.cpp"
"src/World.cpp"
"src/FileHelpers.cpp"
2025-11-16 16:39:12 +03:00
"src/VersionConstants.cpp"
2025-12-31 16:30:56 +03:00
"src/ScaleUpCanvas.cpp"
2026-01-02 17:11:32 +03:00
"src/WorldUndoManager.cpp"
2026-03-31 13:17:58 +03:00
"src/GUIHolder.cpp"
"src/GlobalConfig.cpp"
2026-04-03 23:02:33 +03:00
"src/RichTextUserInput.cpp"
2026-04-04 17:52:43 +03:00
"src/CustomEvents.cpp"
2026-04-12 12:36:00 +03:00
"src/Screens/Screen.cpp"
"src/Screens/DrawingProgramScreen.cpp"
2026-04-26 09:54:58 +03:00
"src/Screens/DesktopDrawingProgramScreen.cpp"
2026-04-26 13:21:05 +03:00
"src/Screens/PhoneDrawingProgramScreen.cpp"
2026-04-12 17:31:32 +03:00
"src/Screens/FileSelectScreen.cpp"
2025-12-18 17:01:42 +03:00
"src/Bookmarks/BookmarkListItem.cpp"
2025-12-20 16:38:51 +03:00
"src/Bookmarks/BookmarkManager.cpp"
2025-07-06 20:43:53 +03:00
"src/ResourceDisplay/ResourceDisplay.cpp"
2025-08-07 12:44:31 +03:00
"src/ResourceDisplay/SvgResourceDisplay.cpp"
2025-07-06 20:43:53 +03:00
"src/ResourceDisplay/ImageResourceDisplay.cpp"
"src/ResourceDisplay/FileResourceDisplay.cpp"
2025-11-10 14:45:51 +03:00
"src/RichText/TextBox.cpp"
"src/RichText/TextStyleModifier.cpp"
"src/RichText/ParagraphStyleData.cpp"
2026-01-26 19:08:36 +03:00
"src/DrawingProgram/ToolConfiguration.cpp"
2025-12-29 15:04:32 +03:00
"src/DrawingProgram/DrawingProgramSelection.cpp"
2025-07-19 15:57:09 +03:00
"src/DrawingProgram/DrawingProgramCache.cpp"
2025-07-06 20:43:53 +03:00
"src/DrawingProgram/DrawingProgram.cpp"
2025-12-26 10:40:58 +03:00
"src/DrawingProgram/Tools/BrushTool.cpp"
2026-01-08 11:13:49 +03:00
"src/DrawingProgram/Tools/LineDrawTool.cpp"
2025-12-26 10:40:58 +03:00
"src/DrawingProgram/Tools/TextBoxTool.cpp"
"src/DrawingProgram/Tools/EraserTool.cpp"
"src/DrawingProgram/Tools/RectSelectTool.cpp"
"src/DrawingProgram/Tools/LassoSelectTool.cpp"
"src/DrawingProgram/Tools/RectDrawTool.cpp"
"src/DrawingProgram/Tools/EllipseDrawTool.cpp"
"src/DrawingProgram/Tools/EyeDropperTool.cpp"
"src/DrawingProgram/Tools/ScreenshotTool.cpp"
"src/DrawingProgram/Tools/EditTool.cpp"
"src/DrawingProgram/Tools/ZoomCanvasTool.cpp"
"src/DrawingProgram/Tools/PanCanvasTool.cpp"
"src/DrawingProgram/Tools/GridModifyTool.cpp"
"src/DrawingProgram/Tools/DrawingProgramToolBase.cpp"
"src/DrawingProgram/Tools/EditTools/DrawingProgramEditToolBase.cpp"
"src/DrawingProgram/Tools/EditTools/ImageEditTool.cpp"
"src/DrawingProgram/Tools/EditTools/EllipseDrawEditTool.cpp"
"src/DrawingProgram/Tools/EditTools/RectDrawEditTool.cpp"
"src/DrawingProgram/Tools/EditTools/TextBoxEditTool.cpp"
2026-01-27 16:55:09 +03:00
"src/DrawingProgram/Tools/EditTools/BrushEditTool.cpp"
2025-12-25 17:18:28 +03:00
"src/DrawingProgram/Layers/DrawingProgramLayerManagerGUI.cpp"
"src/DrawingProgram/Layers/DrawingProgramLayerManager.cpp"
2025-12-24 12:42:27 +03:00
"src/DrawingProgram/Layers/DrawingProgramLayerListItem.cpp"
2025-12-25 17:18:28 +03:00
"src/DrawingProgram/Layers/DrawingProgramLayerFolder.cpp"
"src/DrawingProgram/Layers/DrawingProgramLayer.cpp"
2025-12-25 19:37:41 +03:00
"src/DrawingProgram/Layers/SerializedBlendMode.cpp"
2025-12-13 13:03:27 +03:00
"src/CanvasComponents/CanvasComponentContainer.cpp"
"src/CanvasComponents/CanvasComponentAllocator.cpp"
"src/CanvasComponents/BrushStrokeCanvasComponent.cpp"
"src/CanvasComponents/RectangleCanvasComponent.cpp"
"src/CanvasComponents/TextBoxCanvasComponent.cpp"
"src/CanvasComponents/EllipseCanvasComponent.cpp"
"src/CanvasComponents/ImageCanvasComponent.cpp"
"src/CanvasComponents/CanvasComponent.cpp"
2025-07-06 20:43:53 +03:00
"src/GUIStuff/GUIManager.cpp"
2026-04-24 11:07:15 +03:00
"src/GUIStuff/GUIFloatAnimation.cpp"
2025-07-06 20:43:53 +03:00
"src/GUIStuff/GUIManagerID.cpp"
"src/GUIStuff/ClayImplement.cpp"
2026-03-27 09:51:53 +03:00
"src/GUIStuff/Elements/GUIStuffHelpers.cpp"
2025-07-06 20:43:53 +03:00
"src/GUIStuff/Elements/Element.cpp"
2026-04-19 17:44:48 +03:00
"src/GUIStuff/Elements/ImageDisplay.cpp"
2026-04-23 20:56:11 +03:00
"src/GUIStuff/Elements/MutableTextLabel.cpp"
2025-07-06 20:43:53 +03:00
"src/GUIStuff/Elements/SVGIcon.cpp"
"src/GUIStuff/Elements/RadioButton.cpp"
"src/GUIStuff/Elements/CheckBox.cpp"
"src/GUIStuff/Elements/SelectableButton.cpp"
"src/GUIStuff/Elements/MovableTabList.cpp"
"src/GUIStuff/Elements/PaintCircleMenu.cpp"
2025-09-28 16:32:57 +03:00
"src/GUIStuff/Elements/RotateWheel.cpp"
2025-10-15 16:33:24 +03:00
"src/GUIStuff/Elements/TextParagraph.cpp"
2025-11-08 20:50:23 +03:00
"src/GUIStuff/Elements/FontPicker.cpp"
2025-12-20 16:38:51 +03:00
"src/GUIStuff/Elements/TreeListing.cpp"
2026-03-27 09:51:53 +03:00
"src/GUIStuff/Elements/LayoutElement.cpp"
"src/GUIStuff/Elements/ColorRectangleDisplay.cpp"
"src/GUIStuff/Elements/ScrollArea.cpp"
"src/GUIStuff/Elements/PositionAdjustingPopupMenu.cpp"
"src/GUIStuff/Elements/ColorPickerShaders.cpp"
2026-04-18 20:51:45 +03:00
"src/GUIStuff/Elements/GridScrollArea.cpp"
2026-03-27 09:51:53 +03:00
"src/GUIStuff/ElementHelpers/PopupHelpers.cpp"
"src/GUIStuff/ElementHelpers/ButtonHelpers.cpp"
"src/GUIStuff/ElementHelpers/LayoutHelpers.cpp"
"src/GUIStuff/ElementHelpers/TextBoxHelpers.cpp"
"src/GUIStuff/ElementHelpers/TextLabelHelpers.cpp"
"src/GUIStuff/ElementHelpers/RadioButtonHelpers.cpp"
"src/GUIStuff/ElementHelpers/CheckBoxHelpers.cpp"
"src/GUIStuff/ElementHelpers/ScrollAreaHelpers.cpp"
2025-07-06 20:43:53 +03:00
"include/Helpers/Networking/NetLibrary.cpp"
"include/Helpers/Networking/NetServer.cpp"
"include/Helpers/Networking/NetClient.cpp"
"include/Helpers/Networking/ByteStream.cpp"
2025-12-10 17:23:05 +03:00
"include/Helpers/NetworkingObjects/DelayUpdateSerializedClassManager.cpp"
2025-12-09 13:00:38 +03:00
"include/Helpers/NetworkingObjects/NetObjManagerTypeList.cpp"
2025-12-06 14:16:50 +03:00
"include/Helpers/NetworkingObjects/NetObjManager.cpp"
2025-12-08 14:28:01 +03:00
"include/Helpers/NetworkingObjects/NetObjID.cpp"
2025-07-06 20:43:53 +03:00
"include/Helpers/Hashes.cpp"
"include/Helpers/BezierEasing.cpp"
"include/Helpers/Random.cpp"
"include/Helpers/Logger.cpp"
"include/Helpers/StringHelpers.cpp"
"include/Helpers/Serializers.cpp"
2025-10-01 17:54:23 +03:00
"include/Helpers/FileDownloader.cpp"
2025-10-09 13:04:39 +03:00
"include/Helpers/FileDownloaderEmscripten.cpp"
2025-10-01 20:08:01 +03:00
"include/Helpers/VersionNumber.cpp"
2025-07-06 20:43:53 +03:00
)
2025-08-09 10:45:39 +03:00
if((NOT EMSCRIPTEN) AND (GRAPHICS_BACKEND STREQUAL "Vulkan"))
2025-07-06 20:43:53 +03:00
list(APPEND sources
"src/VulkanContext/VkTestMemoryAllocator.cpp"
"src/VulkanContext/VkTestUtils.cpp"
"src/VulkanContext/WindowContext.cpp"
"src/VulkanContext/VulkanWindowContext.cpp"
)
if(USE_GRAPHITE)
list(APPEND sources
"src/VulkanContext/GraphiteNativeVulkanWindowContext.cpp"
"src/VulkanContext/GraphiteToolUtils.cpp"
)
endif()
endif()
if(WIN32)
2025-11-19 15:07:01 +03:00
list(APPEND sources
"src/WindowsFontData/CustomFontSetManager.cpp"
2025-11-21 10:03:11 +03:00
"windowsinstall/infinipaint.manifest"
2025-11-19 15:07:01 +03:00
"windowsinstall/app.rc")
2025-07-06 20:43:53 +03:00
endif()
# Get libraries
2025-11-14 16:37:49 +03:00
find_package(ICU 77.1 REQUIRED COMPONENTS uc)
2025-10-13 18:54:33 +03:00
2025-11-14 16:37:49 +03:00
if(NO_CONAN_BUILD)
2025-07-06 20:43:53 +03:00
set(SKIA_INCLUDE "modules/skia" CACHE PATH "Path to Skia root directory")
set(SKIA_LIB_PATH "modules/skia/out/Static" CACHE PATH "Path to Skia libs")
find_library(SKIA_LIB skia PATHS ${SKIA_LIB_PATH})
find_library(SKIA_SVG_LIB svg PATHS ${SKIA_LIB_PATH})
find_library(SKIA_RESOURCES_LIB skresources PATHS ${SKIA_LIB_PATH})
find_library(SKIA_PARAGRAPH_LIB skparagraph PATHS ${SKIA_LIB_PATH})
find_library(SKIA_SHAPER_LIB skshaper PATHS ${SKIA_LIB_PATH})
find_library(SKIA_UNICODE_ICU_LIB skunicode_icu PATHS ${SKIA_LIB_PATH})
find_library(SKIA_UNICODE_CORE_LIB skunicode_core PATHS ${SKIA_LIB_PATH})
2025-11-14 16:37:49 +03:00
find_package(Freetype REQUIRED)
find_package(Fontconfig REQUIRED)
find_package(PNG REQUIRED)
find_package(ZLIB REQUIRED)
2025-07-06 20:43:53 +03:00
else()
2025-11-19 20:08:59 +03:00
find_package(skia-infinipaint REQUIRED)
2025-07-06 20:43:53 +03:00
endif()
if(NOT EMSCRIPTEN)
2026-04-26 15:47:28 +03:00
if(NOT ANDROID)
2026-02-24 17:21:41 +03:00
find_package(SDL3 REQUIRED CONFIG REQUIRED COMPONENTS SDL3-shared)
endif()
2025-07-06 20:43:53 +03:00
find_package(LibDataChannel REQUIRED)
2025-10-01 17:54:23 +03:00
find_package(CURL REQUIRED)
2025-10-13 18:54:33 +03:00
find_package(harfbuzz REQUIRED)
2025-07-06 20:43:53 +03:00
else()
find_package(SDL3 REQUIRED CONFIG REQUIRED COMPONENTS SDL3-static)
endif()
if((NOT EMSCRIPTEN) AND (NOT APPLE))
find_package(TBB REQUIRED)
endif()
2026-03-29 20:23:38 +03:00
if((NOT (GRAPHICS_BACKEND STREQUAL "Vulkan")) AND (NOT EMSCRIPTEN) AND LINUX AND (NOT NO_CONAN_BUILD))
find_package(egl)
endif()
2025-07-28 17:07:39 +03:00
find_package(zstd REQUIRED)
2025-07-06 20:43:53 +03:00
message("Skia root: " ${SKIA_INCLUDE})
message("Build type: " ${CMAKE_BUILD_TYPE})
2026-02-24 17:21:41 +03:00
if(ANDROID)
add_library(main SHARED ${sources})
else()
add_executable(main ${sources})
endif()
2026-03-07 20:15:20 +03:00
if(NOT ANDROID)
2026-02-24 17:21:41 +03:00
set_target_properties(main PROPERTIES OUTPUT_NAME "infinipaint")
endif()
2025-07-06 20:43:53 +03:00
if(WIN32)
2026-02-24 17:21:41 +03:00
set_target_properties(main PROPERTIES WIN32_EXECUTABLE TRUE)
2025-07-06 20:43:53 +03:00
elseif(APPLE)
2025-11-24 02:00:06 -08:00
if(MACOS_MAKE_BUNDLE)
2026-02-24 17:21:41 +03:00
target_compile_definitions(main PRIVATE MACOS_MAKE_BUNDLE)
set_target_properties(main PROPERTIES MACOSX_BUNDLE TRUE)
set_target_properties(main PROPERTIES
2025-11-24 02:00:06 -08:00
BUNDLE True
2026-02-24 17:21:41 +03:00
MACOSX_BUNDLE_GUI_IDENTIFIER com.infinipaint.infinipaint
2025-11-24 02:00:06 -08:00
MACOSX_BUNDLE_BUNDLE_NAME infinipaint
2026-02-03 12:16:39 +03:00
MACOSX_BUNDLE_BUNDLE_VERSION "0.4.1"
MACOSX_BUNDLE_SHORT_VERSION_STRING "0.4.1"
2025-11-24 02:00:06 -08:00
MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/macosinstall/Info.plist
)
2026-02-24 17:21:41 +03:00
add_custom_command(TARGET main POST_BUILD
2025-11-24 02:00:06 -08:00
COMMAND ${CMAKE_COMMAND} -E copy_directory
2026-02-24 17:21:41 +03:00
"${CMAKE_SOURCE_DIR}/assets/data"
"$<TARGET_FILE_DIR:main>/../Resources/data"
2025-11-24 02:00:06 -08:00
)
2026-02-24 17:21:41 +03:00
add_custom_command(TARGET main POST_BUILD
2025-11-24 02:00:06 -08:00
COMMAND ${CMAKE_COMMAND} -E copy
"${CMAKE_SOURCE_DIR}/macosinstall/appicon.icns"
2026-02-24 17:21:41 +03:00
"$<TARGET_FILE_DIR:main>/../Resources/appicon.icns"
2025-11-24 02:00:06 -08:00
)
endif()
2025-07-06 20:43:53 +03:00
endif()
if(EMSCRIPTEN)
2026-04-12 17:31:32 +03:00
set(SDL_EMSCRIPTEN_PERSISTENT_PATH "/infinipaint" CACHE STRING "SDL emscripten persistent path")
2025-10-02 10:42:01 +03:00
if(CMAKE_BUILD_TYPE STREQUAL Debug)
2026-02-24 17:21:41 +03:00
target_compile_options(main PRIVATE -g3)
target_link_options(main PRIVATE -g3)
2025-10-02 10:42:01 +03:00
else()
2026-02-24 17:21:41 +03:00
target_compile_options(main PRIVATE -O3)
target_link_options(main PRIVATE -O3)
2025-10-02 10:42:01 +03:00
endif()
2026-02-24 17:21:41 +03:00
target_compile_options(main PRIVATE -Wall -sUSE_HARFBUZZ=1 -fdiagnostics-color -sUSE_SDL=0 -include functional -fexceptions -pthread)
target_link_options(main PRIVATE --emrun -sUSE_HARFBUZZ=1 -sUSE_SDL=0 -sFULL_ES2 -sUSE_WEBGL2=1 -sFETCH --embed-file data -sALLOW_MEMORY_GROWTH=1 -sEXPORTED_RUNTIME_METHODS=ccall,HEAPU8,HEAPU32 -sEXPORTED_FUNCTIONS=[_main,_malloc,_free] -sMAXIMUM_MEMORY=4GB -sSINGLE_FILE -lidbfs.js -fexceptions -pthread) # -sINITIAL_MEMORY=67108864
2026-02-06 08:55:51 +03:00
set(CMAKE_EXECUTABLE_SUFFIX ".js")
2025-07-06 20:43:53 +03:00
message("In Emscripten Mode")
endif()
if(USE_ASAN)
2026-02-24 17:21:41 +03:00
target_compile_options(main PRIVATE -fsanitize=address)
target_link_options(main PRIVATE -fsanitize=address)
2025-07-06 20:43:53 +03:00
message("Using ASAN")
endif()
if(USE_UBSAN)
2026-02-24 17:21:41 +03:00
target_compile_options(main PRIVATE -fsanitize=undefined)
target_link_options(main PRIVATE -fsanitize=undefined)
2025-07-06 20:43:53 +03:00
message("Using UBSan")
endif()
if(USE_LEAKSAN)
2026-02-24 17:21:41 +03:00
target_compile_options(main PRIVATE -fsanitize=leak)
target_link_options(main PRIVATE -fsanitize=leak)
2025-07-06 20:43:53 +03:00
message("Using LeakSan")
endif()
if(USE_THREADSAN)
2026-02-24 17:21:41 +03:00
target_compile_options(main PRIVATE -fsanitize=thread)
target_link_options(main PRIVATE -fsanitize=thread)
2025-07-06 20:43:53 +03:00
message("Using ThreadSan")
endif()
if(USE_MEMORYSAN)
2026-02-24 17:21:41 +03:00
target_compile_options(main PRIVATE -fsanitize=memory)
target_link_options(main PRIVATE -fsanitize=memory)
2025-07-06 20:43:53 +03:00
message("Using MemSan")
endif()
if(NOT WIN32)
if(CMAKE_BUILD_TYPE STREQUAL Debug)
2026-02-24 17:21:41 +03:00
target_compile_options(main PRIVATE -g -Wall -fdiagnostics-color)
2025-07-06 20:43:53 +03:00
message("In Debug Mode")
else()
2026-02-24 17:21:41 +03:00
target_compile_options(main PRIVATE -O3 -Wall -fdiagnostics-color)
target_link_options(main PRIVATE -O3) # Other things to consider: -ffast-math and -march=native
2025-07-06 20:43:53 +03:00
message("In Release Mode")
endif()
endif()
2026-02-24 17:21:41 +03:00
target_include_directories(main PRIVATE "include")
2026-03-23 10:04:32 +03:00
if(ANDROID)
target_include_directories(main PRIVATE "android-project/SDL/include")
endif()
2025-07-06 20:43:53 +03:00
2026-02-24 17:21:41 +03:00
target_compile_definitions(main PRIVATE IS_CLIENT)
2025-07-06 20:43:53 +03:00
if(WIN32)
2026-02-24 17:21:41 +03:00
target_compile_definitions(main PRIVATE WIN32_LEAN_AND_MEAN NOMINMAX)
2025-07-06 20:43:53 +03:00
endif()
2025-10-02 14:30:11 +03:00
if(CONFIG_NEXT_TO_EXECUTABLE)
2026-02-24 17:21:41 +03:00
target_compile_definitions(main PRIVATE CONFIG_NEXT_TO_EXECUTABLE)
2025-10-02 14:34:41 +03:00
message("Place config next to executable")
else()
message("Place config in global config folder")
2025-10-02 14:30:11 +03:00
endif()
2025-08-09 10:45:39 +03:00
if(NOT EMSCRIPTEN AND ((GRAPHICS_BACKEND STREQUAL "OpenGL3.3") OR (GRAPHICS_BACKEND STREQUAL "OpenGLES3.0") OR (GRAPHICS_BACKEND STREQUAL "OpenGL2.1")))
2025-07-06 20:43:53 +03:00
find_package(OpenGL REQUIRED)
2025-08-09 10:45:39 +03:00
if(GRAPHICS_BACKEND STREQUAL "OpenGLES3.0")
2026-02-24 17:21:41 +03:00
target_link_libraries(main OpenGL::GLES3)
2025-08-01 16:16:40 +03:00
else()
2026-02-24 17:21:41 +03:00
target_link_libraries(main OpenGL::GL)
2025-08-01 16:16:40 +03:00
endif()
2025-07-06 20:43:53 +03:00
endif()
2026-02-24 17:21:41 +03:00
if((NOT EMSCRIPTEN) AND (NOT APPLE) AND (NOT ANDROID))
2025-11-14 16:37:49 +03:00
if(NO_CONAN_BUILD)
2026-02-24 17:21:41 +03:00
target_link_libraries(main TBB::tbb)
2025-07-06 20:43:53 +03:00
else()
2026-02-24 17:21:41 +03:00
target_link_libraries(main onetbb::onetbb)
2025-07-06 20:43:53 +03:00
endif()
endif()
2026-02-24 17:21:41 +03:00
target_link_libraries(main zstd::libzstd_static)
2025-07-06 20:43:53 +03:00
2025-11-19 15:07:01 +03:00
if((NOT EMSCRIPTEN) AND WIN32)
2026-02-24 17:21:41 +03:00
target_link_libraries(main dwrite)
2026-01-12 11:27:41 +03:00
# Clip library for retrieving images from windows clipboard
set(CLIP_EXAMPLES OFF CACHE BOOL "Compile clip examples")
set(CLIP_TESTS OFF CACHE BOOL "Compile clip tests")
set(CLIP_ENABLE_IMAGE ON CACHE BOOL "Compile with image clipboard support")
add_subdirectory(deps/clip)
2026-02-24 17:21:41 +03:00
target_link_libraries(main clip)
2025-11-19 15:07:01 +03:00
endif()
2025-07-06 20:43:53 +03:00
if(EMSCRIPTEN)
add_subdirectory(deps/datachannel-wasm EXCLUDE_FROM_ALL)
2026-02-06 08:55:51 +03:00
target_compile_options(datachannel-wasm PRIVATE -pthread)
2026-02-24 17:21:41 +03:00
target_link_libraries(main datachannel-wasm)
2025-07-06 20:43:53 +03:00
else()
2026-02-24 17:21:41 +03:00
target_link_libraries(main LibDataChannel::LibDataChannel CURL::libcurl)
2025-07-06 20:43:53 +03:00
endif()
2026-03-23 10:04:32 +03:00
if(ANDROID)
add_subdirectory(deps/SDL EXCLUDE_FROM_ALL)
endif()
2025-11-14 16:37:49 +03:00
if(NO_CONAN_BUILD)
2026-02-24 17:21:41 +03:00
target_link_libraries(main ${SKIA_SVG_LIB} ${SKIA_RESOURCES_LIB} ${SKIA_LIB} ${SKIA_UNICODE_CORE_LIB} ${SKIA_UNICODE_ICU_LIB} ${SKIA_UNICODE_CORE_LIB} ${SKIA_PARAGRAPH_LIB} ${SKIA_SHAPER_LIB})
target_include_directories(main PRIVATE ${SKIA_INCLUDE})
target_link_libraries(main SDL3::SDL3 ICU::uc Fontconfig::Fontconfig Freetype::Freetype PNG::PNG ZLIB::ZLIB)
2025-07-06 20:43:53 +03:00
else()
2026-02-24 17:21:41 +03:00
target_link_libraries(main skia-infinipaint::skia-infinipaint)
if(ANDROID)
2026-04-26 15:47:28 +03:00
target_link_libraries(main SDL3::SDL3)
2026-02-24 17:21:41 +03:00
else()
2026-04-12 17:31:32 +03:00
target_link_libraries(main sdl-infinipaint::sdl-infinipaint)
2026-02-24 17:21:41 +03:00
endif()
target_link_libraries(main icu-infinipaint::icu-infinipaint)
2025-11-14 16:37:49 +03:00
endif()
if(NOT EMSCRIPTEN)
2026-02-24 17:21:41 +03:00
target_link_libraries(main harfbuzz::harfbuzz)
2025-07-06 20:43:53 +03:00
endif()
2025-08-09 10:45:39 +03:00
if((NOT (GRAPHICS_BACKEND STREQUAL "Vulkan")) AND (NOT EMSCRIPTEN) AND LINUX)
2026-02-24 17:21:41 +03:00
target_link_libraries(main OpenGL::EGL)
endif()
2026-03-29 20:23:38 +03:00
if((NOT (GRAPHICS_BACKEND STREQUAL "Vulkan")) AND (NOT EMSCRIPTEN) AND LINUX AND (NOT NO_CONAN_BUILD))
2026-03-30 12:32:41 +03:00
target_link_libraries(main egl::egl)
2026-03-29 20:23:38 +03:00
endif()
2026-02-24 17:21:41 +03:00
if(ANDROID)
target_link_libraries(main EGL)
2025-07-06 20:43:53 +03:00
endif()
2025-08-09 10:45:39 +03:00
if(GRAPHICS_BACKEND STREQUAL "Vulkan")
2026-02-24 17:21:41 +03:00
target_compile_definitions(main PRIVATE USE_BACKEND_VULKAN SK_VULKAN)
2025-07-06 20:43:53 +03:00
if(USE_GRAPHITE)
2026-02-24 17:21:41 +03:00
target_compile_definitions(main PRIVATE SK_GRAPHITE USE_SKIA_BACKEND_GRAPHITE)
2025-08-08 17:53:57 +03:00
message("Using Vulkan Graphite Backend")
2025-07-06 20:43:53 +03:00
else()
2026-02-24 17:21:41 +03:00
target_compile_definitions(main PRIVATE USE_SKIA_BACKEND_GANESH)
2025-08-08 17:53:57 +03:00
message("Using Vulkan Ganesh Backend")
2025-07-06 20:43:53 +03:00
endif()
else()
2025-08-09 10:45:39 +03:00
if(GRAPHICS_BACKEND STREQUAL "OpenGLES3.0")
2026-02-24 17:21:41 +03:00
target_compile_definitions(main PRIVATE USE_BACKEND_OPENGLES_3_0)
2025-08-09 10:45:39 +03:00
message("Using OpenGL ES 3.0")
elseif(GRAPHICS_BACKEND STREQUAL "OpenGL2.1")
2026-02-24 17:21:41 +03:00
target_compile_definitions(main PRIVATE USE_BACKEND_OPENGL_2_1)
2025-08-09 10:45:39 +03:00
message("Using OpenGL 2.1")
2025-08-08 17:53:57 +03:00
else()
2026-02-24 17:21:41 +03:00
target_compile_definitions(main PRIVATE USE_BACKEND_OPENGL_3_3)
2025-08-09 10:45:39 +03:00
message("Using OpenGL 3.3")
2025-08-01 16:16:40 +03:00
endif()
2026-02-24 17:21:41 +03:00
target_compile_definitions(main PRIVATE USE_BACKEND_OPENGL USE_SKIA_BACKEND_GANESH)
2025-07-06 20:43:53 +03:00
endif()
2026-02-24 17:21:41 +03:00
target_compile_definitions(main PRIVATE BOOST_MP_STANDALONE EIGEN_MPL2_ONLY)
2025-07-06 20:43:53 +03:00
2025-10-03 13:44:19 +03:00
include(CheckCCompilerFlag)
check_c_compiler_flag(-Wdeprecated-declarations HAS_DEPRECATED_DECLARATIONS)
if(HAS_DEPRECATED_DECLARATIONS)
2026-02-24 17:21:41 +03:00
target_compile_options(main PRIVATE -Wno-deprecated-declarations)
2025-10-03 13:44:19 +03:00
endif()
2025-07-06 20:43:53 +03:00
if(APPLE OR WIN32)
2026-02-24 17:21:41 +03:00
install(TARGETS main DESTINATION .)
2025-07-06 20:43:53 +03:00
set(CPACK_PACKAGE_NAME "infinipaint")
set(CPACK_PACKAGE_VERSION_MAJOR "0")
2026-01-10 19:27:54 +03:00
set(CPACK_PACKAGE_VERSION_MINOR "4")
2026-02-03 12:16:39 +03:00
set(CPACK_PACKAGE_VERSION_PATCH "1")
2025-07-06 20:43:53 +03:00
set(CPACK_PACKAGE_VENDOR "ErrorAtLine0")
set(CPACK_PACKAGE_CONTACT "erroratline0@gmail.com")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE")
endif()
if(APPLE)
# Nothing specific here for now
elseif(WIN32)
2026-02-24 17:21:41 +03:00
install(DIRECTORY assets/data DESTINATION .)
2025-07-06 20:43:53 +03:00
set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE)
include(InstallRequiredSystemLibraries)
install(PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION .)
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
set(CPACK_NSIS_DISPLAY_NAME "InfiniPaint")
set(CPACK_NSIS_PACKAGE_NAME "InfiniPaint")
set(CPACK_NSIS_UNINSTALL_NAME "InfiniPaint Uninstall")
set(CPACK_NSIS_WELCOME_TITLE "Welcome to InfiniPaint Installer")
set(CPACK_NSIS_EXECUTABLES_DIRECTORY .)
set(CPACK_NSIS_URL_INFO_ABOUT "https://infinipaint.com")
set(CPACK_NSIS_MENU_LINKS "infinipaint.exe" "InfiniPaint")
set(CPACK_NSIS_INSTALLED_ICON_NAME "infinipaint.exe")
set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/windowsinstall/icon.ico")
set(CPACK_NSIS_MUI_UNIICON "${CMAKE_SOURCE_DIR}/windowsinstall/icon.ico")
# A backslash character uses 4 backslashes, since we have to escape twice
# Double quote uses 3 backslashes, since we have to escape the backslash (two slashes), and escape the double quote (one slash)
set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS "
WriteRegStr HKCR '.infpnt' '' 'InfiniPaintCanvas'
WriteRegStr HKCR 'InfiniPaintCanvas' '' 'InfiniPaint Canvas File'
WriteRegStr HKCR 'InfiniPaintCanvas\\\\shell' '' 'open'
WriteRegStr HKCR 'InfiniPaintCanvas\\\\DefaultIcon' '' '\\\"$INSTDIR\\\\infinipaint.exe\\\",0'
WriteRegStr HKCR 'InfiniPaintCanvas\\\\shell\\\\open\\\\command' '' '\\\"$INSTDIR\\\\infinipaint.exe\\\" \\\"%1\\\"'
WriteRegStr HKCR 'InfiniPaintCanvas\\\\shell\\\\edit' '' 'Edit InfiniPaint Canvas File'
WriteRegStr HKCR 'InfiniPaintCanvas\\\\shell\\\\edit\\\\command' '' '\\\"$INSTDIR\\\\infinipaint.exe\\\" \\\"%1\\\"'
System::Call 'Shell32::SHChangeNotify(i 0x8000000, i 0, i 0, i 0)'
")
set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS "
DeleteRegKey HKCR '.infpnt'
DeleteRegKey HKCR 'InfiniPaintCanvas'
")
2025-08-18 09:29:42 +03:00
set(CPACK_PACKAGE_INSTALL_DIRECTORY "infinipaint")
2025-07-06 20:43:53 +03:00
else()
2026-02-24 17:21:41 +03:00
install(DIRECTORY assets/data DESTINATION bin)
install(TARGETS main DESTINATION bin)
2025-07-11 15:55:53 +03:00
install(FILES linuxinstall/com.infinipaint.infinipaint.desktop DESTINATION share/applications)
install(FILES logo.svg DESTINATION share/icons/hicolor/scalable/apps RENAME com.infinipaint.infinipaint.svg)
2025-08-16 12:24:55 +03:00
install(FILES logo.svg DESTINATION share/icons/hicolor/scalable/mimetypes RENAME com.infinipaint.infinipaint-application-infpnt.svg)
2025-07-11 15:55:53 +03:00
install(FILES linuxinstall/com.infinipaint.infinipaint.metainfo.xml DESTINATION share/metainfo)
install(FILES linuxinstall/com.infinipaint.infinipaint.xml DESTINATION share/mime/packages)
2025-07-06 20:43:53 +03:00
endif()
if(APPLE OR WIN32)
include(CPack)
endif()