cmake_minimum_required(VERSION 3.20)
project(ValentinaBrowser LANGUAGES CXX)
option(VALENTINA_FAST_WASM_LINK "Skip final size optimization while iterating browser runtime" OFF)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
set(VALENTINA_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/../valentina-src" CACHE PATH "Valentina v0.7.53 source")
find_package(Qt6 6.7 REQUIRED COMPONENTS Core Gui Widgets Network Xml Svg SvgWidgets PrintSupport OpenGL OpenGLWidgets Concurrent)
# Qt's binary package disables exception catching by default. Valentina and
# Xerces use exceptions for invalid formulas/XML, so retain Emscripten's JS EH.
get_target_property(qt_platform_link_options Qt6::Platform INTERFACE_LINK_OPTIONS)
list(TRANSFORM qt_platform_link_options REPLACE "DISABLE_EXCEPTION_CATCHING=1" "DISABLE_EXCEPTION_CATCHING=0")
set_property(TARGET Qt6::Platform PROPERTY INTERFACE_LINK_OPTIONS "${qt_platform_link_options}")
find_package(XercesC 3.2 REQUIRED)
set(libs fervor ifc qmuparser vdxf vformat vgeometry vlayout vmisc vobj vpatterndb vpropertyexplorer vtools vwidgets vganalytics vhpgl)
set(sources)
set(includes "${VALENTINA_SOURCE}/src/libs" "${VALENTINA_SOURCE}/src/app/valentina")
foreach(lib IN LISTS libs)
  file(GLOB_RECURSE lib_sources CONFIGURE_DEPENDS "${VALENTINA_SOURCE}/src/libs/${lib}/*.cpp" "${VALENTINA_SOURCE}/src/libs/${lib}/*.h" "${VALENTINA_SOURCE}/src/libs/${lib}/*.qrc" "${VALENTINA_SOURCE}/src/libs/${lib}/*.ui")
  list(APPEND sources ${lib_sources})
  list(APPEND includes "${VALENTINA_SOURCE}/src/libs/${lib}")
endforeach()
file(GLOB_RECURSE app_sources CONFIGURE_DEPENDS "${VALENTINA_SOURCE}/src/app/valentina/*.cpp" "${VALENTINA_SOURCE}/src/app/valentina/*.h" "${VALENTINA_SOURCE}/src/app/valentina/*.qrc" "${VALENTINA_SOURCE}/src/app/valentina/*.ui")
list(APPEND sources ${app_sources})
list(FILTER sources EXCLUDE REGEX "/(stable|appimage|vtestapplication)\\.cpp$")
list(FILTER sources EXCLUDE REGEX "/crashhandler/")
list(FILTER sources EXCLUDE REGEX "/(mac_light_theme|mac_dark_theme|win_light_theme|win_dark_theme)\\.qrc$")
list(FILTER sources EXCLUDE REGEX "/theme\\.qrc$")
foreach(theme win_light_theme win_dark_theme)
  if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/resources/${theme}.qrc")
    list(APPEND sources "${CMAKE_CURRENT_SOURCE_DIR}/resources/${theme}.qrc")
  else()
    file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/empty-theme.txt" CONTENT "Platform icon theme omitted for WebAssembly.\n")
    file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${theme}.qrc" CONTENT "<RCC><qresource prefix=\"/wasm\"><file alias=\"${theme}.txt\">${CMAKE_CURRENT_BINARY_DIR}/empty-theme.txt</file></qresource></RCC>")
    list(APPEND sources "${CMAKE_CURRENT_BINARY_DIR}/${theme}.qrc")
  endif()
endforeach()
qt_add_executable(valentina ${sources})
set(ui_dirs)
foreach(source IN LISTS sources)
  if(source MATCHES "\\.ui$")
    get_filename_component(ui_dir "${source}" DIRECTORY)
    list(APPEND ui_dirs "${ui_dir}")
  endif()
endforeach()
list(REMOVE_DUPLICATES ui_dirs)
set_target_properties(valentina PROPERTIES AUTOUIC_SEARCH_PATHS "${ui_dirs}")
target_include_directories(valentina PRIVATE ${includes})
target_link_libraries(valentina PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets Qt6::Network Qt6::Xml Qt6::Svg Qt6::SvgWidgets Qt6::PrintSupport Qt6::OpenGL Qt6::OpenGLWidgets Qt6::Concurrent XercesC::XercesC)
target_compile_definitions(valentina PRIVATE QBS_BUILD V_NO_ASSERT QT_MESSAGELOGCONTEXT QT_NO_FOREACH QMU_PARSER_STATIC VPROPERTYEXPLORER_STATIC BINDIR="/" DATADIR="/" PKGDATADIR="/" BUILD_REVISION="f9b773" LATEST_TAG_DISTANCE=0)
target_compile_options(valentina PRIVATE -fexceptions)
target_link_options(valentina PRIVATE -fexceptions -sASYNCIFY -sASYNCIFY_STACK_SIZE=1048576 -sALLOW_MEMORY_GROWTH=1 -sINITIAL_MEMORY=268435456 -sSTACK_SIZE=8388608 -sPTHREAD_POOL_SIZE=8 "-sEXPORTED_RUNTIME_METHODS=['FS','ccall']")
if(VALENTINA_FAST_WASM_LINK)
  target_link_options(valentina PRIVATE -O0)
else()
  target_link_options(valentina PRIVATE -Os)
endif()
set_target_properties(valentina PROPERTIES QT_WASM_INITIAL_MEMORY 268435456 QT_WASM_PTHREAD_POOL_SIZE 8 QT_WASM_EXTRA_EXPORTED_METHODS ccall)
set(VALENTINA_BUILD_PYTHON "${CMAKE_CURRENT_SOURCE_DIR}/emsdk/python/3.13.3_64bit/python.exe")
add_custom_command(TARGET valentina POST_BUILD
  COMMAND "${VALENTINA_BUILD_PYTHON}" "${CMAKE_CURRENT_SOURCE_DIR}/patch_runtime.py" "$<TARGET_FILE:valentina>"
  COMMAND "${VALENTINA_BUILD_PYTHON}" "${CMAKE_CURRENT_SOURCE_DIR}/write_build_profile.py" "$<TARGET_FILE:valentina>"
  VERBATIM)
