include(FindPkgConfig)
pkg_check_modules(SDL2 REQUIRED
  sdl2>=2.0.10
  SDL2_image
  SDL2_mixer
  SDL2_net
  SDL2_ttf>=2.0.12)
find_package(PhysFS REQUIRED)
find_package(CURL REQUIRED)
find_package(LibXml2 REQUIRED)
find_package(Intl REQUIRED)
find_package(ZLIB REQUIRED)

add_compile_options(-Wall)

add_compile_definitions(PACKAGE_VERSION="${PROJECT_VERSION}"
                        BUILD_DIR="${CMAKE_BINARY_DIR}/"
                        $<$<CONFIG:Debug>:DEBUG>)

if(WIN32)
  add_compile_definitions(PKG_DATADIR="${CMAKE_INSTALL_DATADIR}/"
                          LOCALEDIR="${CMAKE_INSTALL_LOCALEDIR}/")
elseif(NOT APPLE)
  add_compile_definitions(PKG_DATADIR="${CMAKE_INSTALL_FULL_DATADIR}/"
                          LOCALEDIR="${CMAKE_INSTALL_FULL_LOCALEDIR}/")
endif()

if(ENABLE_MANASERV)
  if(NOT USE_SYSTEM_ENET)
    message(STATUS "Using ENet submodule")
    set(ENET_INCLUDE_DIR "../libs/enet/include")
    set(ENET_LIBRARIES enet)
    link_directories("../libs/enet")
  else()
    message(STATUS "Using system ENet")
    find_package(ENet REQUIRED)
  endif()

  add_compile_definitions(MANASERV_SUPPORT=1)
  message(STATUS "Manaserv support enabled")
endif()

if(NOT USE_SYSTEM_GUICHAN)
  message(STATUS "Using Guichan submodule")
  set(GUICHAN_INCLUDE_DIR "../libs/guichan/include")
  set(GUICHAN_LIBRARIES guichan)
  link_directories("../libs/guichan")
else()
  message(STATUS "Using system Guichan")
  find_package(Guichan REQUIRED)
endif()

if(ENABLE_NLS)
  add_compile_definitions(ENABLE_NLS=1)
  message(STATUS "i18n support enabled")
endif()

if(WITH_OPENGL)
  find_package(OpenGL REQUIRED)
  include_directories(${OPENGL_INCLUDE_DIR})
  add_compile_definitions(USE_OPENGL)
  message(STATUS "OpenGL support enabled")
endif(WITH_OPENGL)

include_directories(
  ${CMAKE_CURRENT_SOURCE_DIR}
  ${SDL2_INCLUDE_DIRS}
  ${PHYSFS_INCLUDE_DIR}
  ${LIBXML2_INCLUDE_DIR}
  ${ENET_INCLUDE_DIR}
  ${GUICHAN_INCLUDE_DIR}
  ${Intl_INCLUDE_DIRS})

set(SRCS
    gui/widgets/avatarlistbox.cpp
    gui/widgets/avatarlistbox.h
    gui/widgets/browserbox.cpp
    gui/widgets/browserbox.h
    gui/widgets/button.cpp
    gui/widgets/button.h
    gui/widgets/channeltab.cpp
    gui/widgets/channeltab.h
    gui/widgets/chattab.cpp
    gui/widgets/chattab.h
    gui/widgets/checkbox.cpp
    gui/widgets/checkbox.h
    gui/widgets/container.cpp
    gui/widgets/container.h
    gui/widgets/desktop.cpp
    gui/widgets/desktop.h
    gui/widgets/dropdown.cpp
    gui/widgets/dropdown.h
    gui/widgets/emoteshortcutcontainer.cpp
    gui/widgets/emoteshortcutcontainer.h
    gui/widgets/flowcontainer.cpp
    gui/widgets/flowcontainer.h
    gui/widgets/icon.cpp
    gui/widgets/icon.h
    gui/widgets/inttextfield.cpp
    gui/widgets/inttextfield.h
    gui/widgets/itemcontainer.cpp
    gui/widgets/itemcontainer.h
    gui/widgets/itemlinkhandler.cpp
    gui/widgets/itemlinkhandler.h
    gui/widgets/itemshortcutcontainer.cpp
    gui/widgets/itemshortcutcontainer.h
    gui/widgets/label.cpp
    gui/widgets/label.h
    gui/widgets/layout.cpp
    gui/widgets/layout.h
    gui/widgets/layouthelper.cpp
    gui/widgets/layouthelper.h
    gui/widgets/linkhandler.h
    gui/widgets/listbox.cpp
    gui/widgets/listbox.h
    gui/widgets/menu.cpp
    gui/widgets/menu.h
    gui/widgets/outfitcontainer.cpp
    gui/widgets/outfitcontainer.h
    gui/widgets/passwordfield.cpp
    gui/widgets/passwordfield.h
    gui/widgets/playerbox.cpp
    gui/widgets/playerbox.h
    gui/widgets/popup.cpp
    gui/widgets/popup.h
    gui/widgets/progressbar.cpp
    gui/widgets/progressbar.h
    gui/widgets/progressindicator.cpp
    gui/widgets/progressindicator.h
    gui/widgets/radiobutton.cpp
    gui/widgets/radiobutton.h
    gui/widgets/resizegrip.cpp
    gui/widgets/resizegrip.h
    gui/widgets/scrollarea.cpp
    gui/widgets/scrollarea.h
    gui/widgets/setuptab.cpp
    gui/widgets/setuptab.h
    gui/widgets/shopitems.cpp
    gui/widgets/shopitems.h
    gui/widgets/shoplistbox.cpp
    gui/widgets/shoplistbox.h
    gui/widgets/shortcutcontainer.cpp
    gui/widgets/shortcutcontainer.h
    gui/widgets/slider.cpp
    gui/widgets/slider.h
    gui/widgets/spacer.cpp
    gui/widgets/spacer.h
    gui/widgets/tab.cpp
    gui/widgets/tab.h
    gui/widgets/tabbedarea.cpp
    gui/widgets/tabbedarea.h
    gui/widgets/table.cpp
    gui/widgets/table.h
    gui/widgets/tablemodel.cpp
    gui/widgets/tablemodel.h
    gui/widgets/textbox.cpp
    gui/widgets/textbox.h
    gui/widgets/textfield.cpp
    gui/widgets/textfield.h
    gui/widgets/textpreview.cpp
    gui/widgets/textpreview.h
    gui/widgets/vertcontainer.cpp
    gui/widgets/vertcontainer.h
    gui/widgets/whispertab.cpp
    gui/widgets/whispertab.h
    gui/widgets/window.cpp
    gui/widgets/window.h
    gui/widgets/windowcontainer.cpp
    gui/widgets/windowcontainer.h
    gui/beingpopup.cpp
    gui/beingpopup.h
    gui/buydialog.cpp
    gui/buydialog.h
    gui/buyselldialog.cpp
    gui/buyselldialog.h
    gui/changeemaildialog.cpp
    gui/changeemaildialog.h
    gui/changepassworddialog.cpp
    gui/changepassworddialog.h
    gui/charselectdialog.cpp
    gui/charselectdialog.h
    gui/charcreatedialog.cpp
    gui/charcreatedialog.h
    gui/chatwindow.cpp
    gui/chatwindow.h
    gui/confirmdialog.cpp
    gui/confirmdialog.h
    gui/connectiondialog.cpp
    gui/connectiondialog.h
    gui/customserverdialog.cpp
    gui/customserverdialog.h
    gui/debugwindow.cpp
    gui/debugwindow.h
    gui/emotepopup.cpp
    gui/emotepopup.h
    gui/equipmentwindow.cpp
    gui/equipmentwindow.h
    gui/dragndrop.cpp
    gui/dragndrop.h
    gui/focushandler.cpp
    gui/focushandler.h
    gui/gui.cpp
    gui/gui.h
    gui/helpwindow.cpp
    gui/helpwindow.h
    gui/inventorywindow.cpp
    gui/inventorywindow.h
    gui/itempopup.cpp
    gui/itempopup.h
    gui/itemamountwindow.cpp
    gui/itemamountwindow.h
    gui/logindialog.cpp
    gui/logindialog.h
    gui/minimap.cpp
    gui/minimap.h
    gui/ministatuswindow.cpp
    gui/ministatuswindow.h
    gui/monsterpopup.cpp
    gui/monsterpopup.h
    gui/npcdialog.cpp
    gui/npcdialog.h
    gui/npcpostdialog.cpp
    gui/npcpostdialog.h
    gui/okdialog.cpp
    gui/okdialog.h
    gui/outfitwindow.cpp
    gui/outfitwindow.h
    gui/palette.cpp
    gui/palette.h
    gui/popupmenu.cpp
    gui/popupmenu.h
    gui/questswindow.cpp
    gui/questswindow.h
    gui/quitdialog.cpp
    gui/quitdialog.h
    gui/recorder.cpp
    gui/recorder.h
    gui/register.cpp
    gui/register.h
    gui/sdlinput.cpp
    gui/sdlinput.h
    gui/selldialog.cpp
    gui/selldialog.h
    gui/serverdialog.cpp
    gui/serverdialog.h
    gui/setup.cpp
    gui/setup.h
    gui/setup_audio.cpp
    gui/setup_audio.h
    gui/setup_colors.cpp
    gui/setup_colors.h
    gui/setup_interface.cpp
    gui/setup_interface.h
    gui/setup_joystick.cpp
    gui/setup_joystick.h
    gui/setup_keyboard.cpp
    gui/setup_keyboard.h
    gui/setup_players.cpp
    gui/setup_players.h
    gui/setup_video.cpp
    gui/setup_video.h
    gui/shortcutwindow.cpp
    gui/shortcutwindow.h
    gui/skilldialog.cpp
    gui/skilldialog.h
    gui/socialwindow.cpp
    gui/socialwindow.h
    gui/speechbubble.cpp
    gui/speechbubble.h
    gui/abilitieswindow.cpp
    gui/abilitieswindow.h
    gui/statuswindow.cpp
    gui/statuswindow.h
    gui/textdialog.cpp
    gui/textdialog.h
    gui/textpopup.cpp
    gui/textpopup.h
    gui/tradewindow.cpp
    gui/tradewindow.h
    gui/truetypefont.cpp
    gui/truetypefont.h
    gui/unregisterdialog.cpp
    gui/unregisterdialog.h
    gui/updaterwindow.cpp
    gui/updaterwindow.h
    gui/viewport.cpp
    gui/viewport.h
    gui/windowmenu.cpp
    gui/windowmenu.h
    gui/worldselectdialog.cpp
    gui/worldselectdialog.h
    net/adminhandler.h
    net/charhandler.cpp
    net/charhandler.h
    net/chathandler.h
    net/download.cpp
    net/download.h
    net/gamehandler.h
    net/generalhandler.h
    net/guildhandler.h
    net/inventoryhandler.h
    net/logindata.h
    net/loginhandler.h
    net/messagehandler.h
    net/npchandler.h
    net/net.cpp
    net/net.h
    net/offlinehandler.cpp
    net/offlinehandler.h
    net/partyhandler.h
    net/playerhandler.h
    net/serverinfo.h
    net/serverstatus.cpp
    net/serverstatus.h
    net/serverstatusbackend.h
    net/abilityhandler.h
    net/tradehandler.h
    net/worldinfo.h
    resources/ambientlayer.cpp
    resources/ambientlayer.h
    resources/animation.cpp
    resources/animation.h
    resources/attributes.cpp
    resources/attributes.h
    resources/beinginfo.cpp
    resources/beinginfo.h
    resources/chardb.cpp
    resources/chardb.h
    resources/dye.cpp
    resources/dye.h
    resources/emotedb.cpp
    resources/emotedb.h
    resources/hairdb.cpp
    resources/hairdb.h
    resources/image.cpp
    resources/image.h
    resources/imageset.h
    resources/imageset.cpp
    resources/itemdb.cpp
    resources/itemdb.h
    resources/iteminfo.h
    resources/iteminfo.cpp
    resources/mapreader.cpp
    resources/mapreader.h
    resources/monsterdb.cpp
    resources/monsterdb.h
    resources/music.cpp
    resources/music.h
    resources/npcdb.cpp
    resources/npcdb.h
    resources/questdb.cpp
    resources/questdb.h
    resources/resource.cpp
    resources/resource.h
    resources/resourcemanager.cpp
    resources/resourcemanager.h
    resources/settingsmanager.cpp
    resources/settingsmanager.h
    resources/soundeffect.h
    resources/soundeffect.cpp
    resources/abilitydb.cpp
    resources/abilitydb.h
    resources/spritedef.h
    resources/spritedef.cpp
    resources/statuseffectdb.cpp
    resources/statuseffectdb.h
    resources/theme.cpp
    resources/theme.h
    resources/userpalette.cpp
    resources/userpalette.h
    resources/wallpaper.cpp
    resources/wallpaper.h
    utils/base64.cpp
    utils/base64.h
    utils/copynpaste.cpp
    utils/copynpaste.h
    utils/dtor.h
    utils/filesystem.h
    utils/gettext.h
    utils/language.cpp
    utils/language.h
    utils/mathutils.h
    utils/mkdir.cpp
    utils/mkdir.h
    utils/mutex.h
    utils/path.cpp
    utils/path.h
    utils/physfsrwops.c
    utils/physfsrwops.h
    utils/sha256.cpp
    utils/sha256.h
    utils/specialfolder.cpp
    utils/specialfolder.h
    utils/stringutils.cpp
    utils/stringutils.h
    utils/time.cpp
    utils/time.h
    utils/xml.cpp
    utils/xml.h
    utils/zlib.cpp
    utils/zlib.h
    actor.cpp
    actor.h
    actorsprite.cpp
    actorsprite.h
    actorspritemanager.cpp
    actorspritemanager.h
    animationparticle.cpp
    animationparticle.h
    avatar.cpp
    avatar.h
    being.cpp
    being.h
    channel.cpp
    channel.h
    channelmanager.cpp
    channelmanager.h
    chatlogger.cpp
    chatlogger.h
    client.cpp
    client.h
    commandhandler.cpp
    commandhandler.h
    compoundsprite.cpp
    compoundsprite.h
    configuration.cpp
    configuration.h
    effectmanager.cpp
    effectmanager.h
    emoteshortcut.cpp
    emoteshortcut.h
    equipment.h
    event.cpp
    event.h
    eventlistener.cpp
    eventlistener.h
    flooritem.cpp
    flooritem.h
    game.cpp
    game.h
    graphics.cpp
    graphics.h
    guichanfwd.h
    guild.cpp
    guild.h
    imageparticle.cpp
    imageparticle.h
    inventory.cpp
    inventory.h
    item.cpp
    item.h
    itemshortcut.cpp
    itemshortcut.h
    joystick.cpp
    joystick.h
    keyboardconfig.cpp
    keyboardconfig.h
    localplayer.cpp
    localplayer.h
    log.cpp
    log.h
    main.cpp
    main.h
    map.cpp
    map.h
    openglgraphics.cpp
    openglgraphics.h
    particle.cpp
    particle.h
    particleemitter.cpp
    particleemitter.h
    particleemitterprop.h
    party.cpp
    party.h
    playerinfo.cpp
    playerinfo.h
    playerrelations.cpp
    playerrelations.h
    position.cpp
    position.h
    properties.h
    rotationalparticle.cpp
    rotationalparticle.h
    sdlgraphics.cpp
    sdlgraphics.h
    shopitem.cpp
    shopitem.h
    simpleanimation.cpp
    simpleanimation.h
    sound.cpp
    sound.h
    sprite.cpp
    sprite.h
    statuseffect.cpp
    statuseffect.h
    text.cpp
    text.h
    textmanager.cpp
    textmanager.h
    textparticle.cpp
    textparticle.h
    tileset.h
    units.cpp
    units.h
    variabledata.h
    vector.cpp
    vector.h
    video.cpp
    video.h)

set(SRCS_TMWA
    net/tmwa/gui/guildtab.cpp
    net/tmwa/gui/guildtab.h
    net/tmwa/gui/partytab.cpp
    net/tmwa/gui/partytab.h
    net/tmwa/adminhandler.cpp
    net/tmwa/adminhandler.h
    net/tmwa/beinghandler.cpp
    net/tmwa/beinghandler.h
    net/tmwa/buysellhandler.cpp
    net/tmwa/buysellhandler.h
    net/tmwa/charserverhandler.cpp
    net/tmwa/charserverhandler.h
    net/tmwa/chathandler.cpp
    net/tmwa/chathandler.h
    net/tmwa/gamehandler.cpp
    net/tmwa/gamehandler.h
    net/tmwa/generalhandler.cpp
    net/tmwa/generalhandler.h
    net/tmwa/guildhandler.cpp
    net/tmwa/guildhandler.h
    net/tmwa/inventoryhandler.cpp
    net/tmwa/inventoryhandler.h
    net/tmwa/itemhandler.cpp
    net/tmwa/itemhandler.h
    net/tmwa/loginhandler.cpp
    net/tmwa/loginhandler.h
    net/tmwa/messagehandler.cpp
    net/tmwa/messagehandler.h
    net/tmwa/messagein.cpp
    net/tmwa/messagein.h
    net/tmwa/messageout.cpp
    net/tmwa/messageout.h
    net/tmwa/network.cpp
    net/tmwa/network.h
    net/tmwa/npchandler.cpp
    net/tmwa/npchandler.h
    net/tmwa/partyhandler.cpp
    net/tmwa/partyhandler.h
    net/tmwa/playerhandler.cpp
    net/tmwa/playerhandler.h
    net/tmwa/protocol.h
    net/tmwa/serverstatusbackend.cpp
    net/tmwa/serverstatusbackend.h
    net/tmwa/abilityhandler.cpp
    net/tmwa/abilityhandler.h
    net/tmwa/token.h
    net/tmwa/tradehandler.cpp
    net/tmwa/tradehandler.h)

set(SRCS_MANA
    net/manaserv/adminhandler.cpp
    net/manaserv/adminhandler.h
    net/manaserv/beinghandler.cpp
    net/manaserv/beinghandler.h
    net/manaserv/buysellhandler.cpp
    net/manaserv/buysellhandler.h
    net/manaserv/charhandler.cpp
    net/manaserv/charhandler.h
    net/manaserv/chathandler.cpp
    net/manaserv/chathandler.h
    net/manaserv/connection.cpp
    net/manaserv/connection.h
    net/manaserv/defines.h
    net/manaserv/enethost.cpp
    net/manaserv/enethost.h
    net/manaserv/effecthandler.cpp
    net/manaserv/effecthandler.h
    net/manaserv/gamehandler.cpp
    net/manaserv/gamehandler.h
    net/manaserv/generalhandler.cpp
    net/manaserv/generalhandler.h
    net/manaserv/guildhandler.cpp
    net/manaserv/guildhandler.h
    net/manaserv/internal.cpp
    net/manaserv/internal.h
    net/manaserv/inventoryhandler.cpp
    net/manaserv/inventoryhandler.h
    net/manaserv/itemhandler.h
    net/manaserv/itemhandler.cpp
    net/manaserv/loginhandler.cpp
    net/manaserv/loginhandler.h
    net/manaserv/messagehandler.cpp
    net/manaserv/messagehandler.h
    net/manaserv/messagein.cpp
    net/manaserv/messagein.h
    net/manaserv/messageout.cpp
    net/manaserv/messageout.h
    net/manaserv/network.cpp
    net/manaserv/network.h
    net/manaserv/npchandler.cpp
    net/manaserv/npchandler.h
    net/manaserv/partyhandler.cpp
    net/manaserv/partyhandler.h
    net/manaserv/playerhandler.cpp
    net/manaserv/playerhandler.h
    net/manaserv/manaserv_protocol.h
    net/manaserv/serverstatusbackend.cpp
    net/manaserv/serverstatusbackend.h
    net/manaserv/abilityhandler.cpp
    net/manaserv/abilityhandler.h
    net/manaserv/tradehandler.cpp
    net/manaserv/tradehandler.h)

if(WIN32)
  configure_file(mana.rc.in mana.rc)
  set(SRCS ${SRCS} ${CMAKE_CURRENT_BINARY_DIR}/mana.rc)
endif(WIN32)

set(APP_ICON_NAME "mana.icns")
set(APP_ICON_FILE "${CMAKE_SOURCE_DIR}/data/icons/${APP_ICON_NAME}")
set_source_files_properties(${APP_ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION
                                                        "Resources")

if(ENABLE_MANASERV)
  add_executable(mana WIN32 ${SRCS} ${SRCS_MANA} ${SRCS_TMWA} ${APP_ICON_FILE})
else(ENABLE_MANASERV)
  add_executable(mana WIN32 ${SRCS} ${SRCS_TMWA} ${APP_ICON_FILE})
endif(ENABLE_MANASERV)

target_link_libraries(
  mana
  PRIVATE ${ENET_LIBRARIES}
          ${SDL2_LINK_LIBRARIES}
          ${PHYSFS_LIBRARY}
          CURL::libcurl
          ${LIBXML2_LIBRARIES}
          ${GUICHAN_LIBRARIES}
          ${OPENGL_LIBRARIES}
          ${Intl_LIBRARIES}
          ZLIB::ZLIB)

# Link with ws2_32 when using "system" ENet on Windows
if(WIN32 AND ENABLE_MANASERV AND USE_SYSTEM_ENET)
  target_link_libraries(mana PRIVATE ws2_32)
endif()

set_target_properties(
  mana
  PROPERTIES MACOSX_BUNDLE TRUE
             MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME}
             MACOSX_BUNDLE_GUI_IDENTIFIER org.manasource.Mana
             MACOSX_BUNDLE_ICON_FILE ${APP_ICON_NAME}
             MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
             MACOSX_BUNDLE_COPYRIGHT "(C) 2004-2024 ${CPACK_PACKAGE_VENDOR}"
             MACOSX_BUNDLE_LONG_VERSION_STRING ${PROJECT_VERSION}
             MACOSX_BUNDLE_SHORT_VERSION_STRING
             ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR})

if(WIN32)
  # Install the executable along with the DLLs it depends on. This works for
  # both the GCC (UCRT64) and Clang (CLANGARM64) based MSYS2 environments,
  # which ship different C/C++ runtime libraries.
  if(CMAKE_VERSION VERSION_LESS 3.21)
    message(FATAL_ERROR "CMake 3.21 or later is required on Windows")
  endif()
  if(POLICY CMP0207)
    # Normalize paths before matching the exclude regexes below
    cmake_policy(SET CMP0207 NEW)
  endif()
  if(CMAKE_CROSSCOMPILING)
    # install(TARGETS RUNTIME_DEPENDENCIES) does not support cross-compiling,
    # so collect the DLLs with a script of our own (see InstallRuntimeDlls.cmake)
    set(DLL_SEARCH_DIRS "${CMAKE_FIND_ROOT_PATH}/bin")
    if(TARGET enet)
      list(APPEND DLL_SEARCH_DIRS "$<TARGET_FILE_DIR:enet>")
    endif()

    # sdl2-compat loads SDL3 at runtime, so it is not listed as an import
    if(EXISTS "${CMAKE_FIND_ROOT_PATH}/bin/SDL3.dll")
      set(EXTRA_DLLS "SDL3.dll")
    endif()

    install(TARGETS mana RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
    install(
      CODE "
        set(MANA_OBJDUMP \"${CMAKE_OBJDUMP}\")
        set(MANA_EXECUTABLE \"$<TARGET_FILE:mana>\")
        set(MANA_SEARCH_DIRS \"${DLL_SEARCH_DIRS}\")
        set(MANA_EXTRA_DLLS \"${EXTRA_DLLS}\")
        set(MANA_DESTINATION \"${CMAKE_INSTALL_BINDIR}\")")
    install(SCRIPT "${CMAKE_SOURCE_DIR}/CMake/Modules/InstallRuntimeDlls.cmake")
  else()
    install(
      TARGETS mana
      RUNTIME_DEPENDENCIES
        PRE_EXCLUDE_REGEXES "api-ms-" "ext-ms-"
        POST_EXCLUDE_REGEXES "[Ss]ystem32" "[Ss]ys[Ww][Oo][Ww]64"
        DIRECTORIES "$ENV{MINGW_PREFIX}/bin"
      RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
  endif()
else()
  install(
    TARGETS mana
    BUNDLE DESTINATION .
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
endif()

if(APPLE)
  target_link_libraries(mana PRIVATE "-framework Foundation")
  set_target_properties(mana PROPERTIES OUTPUT_NAME Mana)

  set(CPACK_GENERATOR "DRAGNDROP")

  install(
    CODE "include(BundleUtilities)
      fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/Mana.app\" \"\" \"/usr/local/lib;/opt/homebrew/lib\")"
  )
endif()
