#
# CMakeLists.txt to build fluid for the FLTK project using CMake (www.cmake.org)
#
# Copyright 1998-2024 by Bill Spitzak and others.
#
# This library is free software. Distribution and use rights are outlined in
# the file "COPYING" which should have been included with this file.  If this
# file is missing or damaged, see the license at:
#
#     https://www.fltk.org/COPYING.php
#
# Please see the following page on how to report bugs and issues:
#
#     https://www.fltk.org/bugs.php
#

# Targets that will be built: fluid and fluid-cmd (Windows)
set(TARGETS fluid)

# Source files for 'fluid-lib' = all source files except the main file (fluid.cxx)
# Note: macOS (Xcode) needs at least one source file (fluid.cxx) to link the main
# program fluid properly

set(CPPFILES
  CodeEditor.cxx
  StyleParse.cxx
  Fd_Snap_Action.cxx
  Fl_Function_Type.cxx
  Fl_Grid_Type.cxx
  Fl_Group_Type.cxx
  Fl_Menu_Type.cxx
  Fl_Type.cxx
  Fl_Widget_Type.cxx
  Fl_Window_Type.cxx
  Fl_Button_Type.cxx
  Fluid_Image.cxx
  about_panel.cxx
  align_widget.cxx
  alignment_panel.cxx
  code.cxx
  custom_widgets.cxx
  factory.cxx
  file.cxx
  fluid_filename.cxx
  function_panel.cxx
  mergeback.cxx
  pixmaps.cxx
  shell_command.cxx
  sourceview_panel.cxx
  template_panel.cxx
  undo.cxx
  widget_browser.cxx
  widget_panel.cxx
)

# List header files in Apple's Xcode IDE

set(HEADERFILES
  CodeEditor.h
  Fd_Snap_Action.h
  Fl_Function_Type.h
  Fl_Grid_Type.h
  Fl_Group_Type.h
  Fl_Menu_Type.h
  Fl_Type.h
  Fl_Widget_Type.h
  Fl_Window_Type.h
  Fl_Button_Type.h
  Fluid_Image.h
  StyleParse.h
  about_panel.h
  align_widget.h
  alignment_panel.h
  code.h
  comments.h
  custom_widgets.h
  factory.h
  file.h
  fluid.h
  function_panel.h
  mergeback.h
  print_panel.h
  pixmaps.h
  shell_command.h
  sourceview_panel.h
  template_panel.h
  undo.h
  widget_browser.h
  widget_panel.h
)

# Add ExternalCodeEditor: platform specific files

if(WIN32)
  list(APPEND CPPFILES ExternalCodeEditor_WIN32.cxx)
  list(APPEND HEADERFILES ExternalCodeEditor_WIN32.h)
else()
  list(APPEND CPPFILES ExternalCodeEditor_UNIX.cxx)
  list(APPEND HEADERFILES ExternalCodeEditor_UNIX.h)
endif(WIN32)

source_group("Header Files" FILES ${HEADERFILES})

# make a group in the IDE for easy access to documentation files

set(USER_DOC_FILES
  Doxyfile
  documentation/src/index.dox
  documentation/src/page_introduction.dox
  documentation/src/page_getting_started.dox
  documentation/src/page_ui_overview.dox
  documentation/src/page_basics.dox
  documentation/src/page_widget_types.dox
  documentation/src/page_layout.dox
  documentation/src/page_code_integration.dox
  documentation/src/page_build_integration.dox
  documentation/src/page_advanced.dox
  documentation/src/page_shortcuts.dox
  documentation/src/page_faqs.dox
  documentation/src/page_glossary.dox
  documentation/src/page_appendices.dox
  documentation/src/page_index.dox
  documentation/src/page_legal.dox
  documentation/src/page_conclusion.dox
)
source_group("Documentation: User" FILES ${USER_DOC_FILES})

set(DEV_DOC_FILES
  Doxyfile-dev
  documentation/src-dev/index.dox
  documentation/src-dev/page_introduction.dox
)
source_group("Documentation: Developer" FILES ${DEV_DOC_FILES})

# Build a local object library to avoid compiling all source files
# multiple times for all fluid targets on Windows (fluid + fluid-cmd).

add_library(fluid-lib OBJECT EXCLUDE_FROM_ALL)
target_sources(fluid-lib PRIVATE ${CPPFILES} ${HEADERFILES})
target_link_libraries(fluid-lib PUBLIC fltk::images)

# Build targets

if(APPLE AND NOT FLTK_BACKEND_X11)

  # macOS

  set(ICON_NAME fluid.icns)
  set(ICON_PATH "${CMAKE_CURRENT_SOURCE_DIR}/icons/${ICON_NAME}")
  add_executable(fluid MACOSX_BUNDLE fluid.cxx ${ICON_PATH})

  # create macOS bundle wrapper script

  set(WRAPPER "${EXECUTABLE_OUTPUT_PATH}/${CMAKE_CFG_INTDIR}/fluid")
  add_custom_command(
    TARGET fluid POST_BUILD
    COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/../CMake/macOS-bundle-wrapper.in ${WRAPPER}
    COMMAND chmod u+x,g+x,o+x ${WRAPPER}
    BYPRODUCTS ${WRAPPER}
    VERBATIM
  )
  unset(WRAPPER)

else()

  # Option 'WIN32' builds a Windows GUI program, ignored on other platforms
  add_executable(fluid WIN32 fluid.cxx)

endif()

target_link_libraries(fluid PRIVATE fluid-lib)

# Build the console app on Windows
# This is done for all Windows targets, even if cross-compiling.

if(WIN32)
  list(APPEND TARGETS fluid-cmd)
  add_executable(fluid-cmd fluid.cxx)
  target_link_libraries(fluid-cmd PRIVATE fluid-lib)
endif()

# Create aliases for all targets

foreach(tgt ${TARGETS})
  add_executable(fltk::${tgt} ALIAS ${tgt})
endforeach()

# Install fluid GUI and commandline tool

if(APPLE AND NOT FLTK_BACKEND_X11)

  # On macOS, Fluid must be installed twice. The bundled version of Fluid needs
  # to go into the /Applications folder to make it visible as a user App with
  # full GUI. The binary without bundle should go into ${FLTK_BINDIR}, usually
  # /usr/local/bin, so it will be picked up as a command line tool by
  # the build process of other apps.
  # On macOS the command line tool is the same target ('fluid') as the one
  # included in the bundle.

  # create bundle
  set_target_properties(fluid PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/fluid.plist")
  set_target_properties(fluid PROPERTIES MACOSX_BUNDLE_ICON_FILE ${ICON_NAME})
  set_target_properties(fluid PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "org.fltk.fluid")

  # The line below would wrongly install /Applications/fluid.icns
  # ## set_target_properties(fluid PROPERTIES RESOURCE ${ICON_PATH})

  # install fluid GUI and commandline tools
  # install(TARGETS fluid DESTINATION "/Applications")

  # install command line tool
  install(PROGRAMS $<TARGET_FILE:fluid> DESTINATION ${FLTK_BINDIR})

else()

  # install Fluid GUI and optional commandline tool 'fluid-cmd' (only on Windows)

  install(TARGETS ${TARGETS}
    EXPORT FLTK-Targets
    RUNTIME DESTINATION ${FLTK_BINDIR}
    LIBRARY DESTINATION ${FLTK_LIBDIR}
    ARCHIVE DESTINATION ${FLTK_LIBDIR}
  )

endif(APPLE AND NOT FLTK_BACKEND_X11)

# Install desktop files

if(UNIX)
  install(FILES fluid.desktop
    DESTINATION ${FLTK_DATADIR}/applications
  )
  # Install mime-type file(x-fluid.desktop method is deprecated)
  install(FILES fluid.xml
    DESTINATION ${FLTK_DATADIR}/mime/packages
  )

  # Install desktop icons
  foreach(icon 32 48 64 128)
    install(FILES icons/fluid-${icon}.png
      DESTINATION ${FLTK_DATADIR}/icons/hicolor/${icon}x${icon}/apps
      RENAME fluid.png
    )
  endforeach()
endif(UNIX)
