# SPDX-License-Identifier: GPL-2.0+
#cmake -DCMAKE_PREFIX_PATH=path to Qt6 .
#cmake --build .
#cmake --install .
# MACOS
# qt-cmake -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" .
# make
# make install
# WINDOWS
# qt-cmake .
# cmake --build . --config Release
# cmake --install .

cmake_minimum_required(VERSION 3.16)
project(algobox VERSION 1.2.0 LANGUAGES CXX)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR})

################ OPTIONS ####################
set(COMPILEUSB "no")
set(AUTHORIZELINUXQSTYLES "yes")
################# INSTALL_DIR #####################
if (UNIX AND NOT APPLE)
    if (${COMPILEUSB} STREQUAL "yes")
        set(INSTALL_DIR ${CMAKE_SOURCE_DIR}/deploy/linux_portable)
    else()
        set(INSTALL_DIR "/usr")
    endif()
elseif (WIN32)
    if (${COMPILEUSB} STREQUAL "yes")
        set(INSTALL_DIR ${CMAKE_SOURCE_DIR}/deploy/win_portable)
    else()
        set(INSTALL_DIR ${CMAKE_SOURCE_DIR}/deploy/win_desktop)
    endif()
elseif (APPLE)
    set(INSTALL_DIR ${CMAKE_SOURCE_DIR}/deploy/macos)
endif()
################## RESOURCES ########################
if (UNIX AND NOT APPLE)
set(UTILITIES_FILES
  ${CMAKE_SOURCE_DIR}/datas/ressources/eleve_calcul_recurrent.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/eleve_distance_sur_un_axe.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/eleve_que_fait_lalgo.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/eleve_simplification_calculs_enchaines.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/eleve_simul_lancers_de.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_babylone.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_balayage_fonctions.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_courbe_fonction.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_decomp_facteurspremiers.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_dichotomie.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_ductoscane.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_euler.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_integrale_trapezes.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_montecarlo.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_pgcd_euclide.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_somme_entiers.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_suite_syracuse.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_tri_abulle.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_pgcd_recursif.alg
  ${CMAKE_SOURCE_DIR}/datas/doc/aidealgobox.html
  ${CMAKE_SOURCE_DIR}/AUTHORS
  ${CMAKE_SOURCE_DIR}/COPYING
  ${CMAKE_SOURCE_DIR}/datas/CHANGELOG.txt
  ${CMAKE_SOURCE_DIR}/datas/distrib/linux/algobox16.png
  ${CMAKE_SOURCE_DIR}/datas/distrib/linux/algobox22.png
  ${CMAKE_SOURCE_DIR}/datas/distrib/linux/algobox32.png
  ${CMAKE_SOURCE_DIR}/datas/distrib/linux/algobox48.png
  ${CMAKE_SOURCE_DIR}/datas/distrib/linux/algobox64.png
  ${CMAKE_SOURCE_DIR}/datas/distrib/linux/algobox128.png
  ${CMAKE_SOURCE_DIR}/datas/distrib/linux/algobox256.png
  ${CMAKE_SOURCE_DIR}/datas/distrib/linux/algobox.svg
  ${CMAKE_SOURCE_DIR}/translations/qt/qt_fr.qm

)
set(DESKTOP_FILES
  ${CMAKE_SOURCE_DIR}/datas/distrib/linux/algobox.desktop
)
set(MIME_FILES
  ${CMAKE_SOURCE_DIR}/datas/distrib/linux/x-algobox.xml
)
set(ICON_FILES
  ${CMAKE_SOURCE_DIR}/datas/distrib/linux/algobox.png
)
set(METAINFO_FILES
  ${CMAKE_SOURCE_DIR}/datas/distrib/linux/algobox.metainfo.xml
)
elseif (WIN32)
set(RESOURCE_FILES
  ${CMAKE_SOURCE_DIR}/datas/ressources/eleve_calcul_recurrent.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/eleve_distance_sur_un_axe.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/eleve_que_fait_lalgo.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/eleve_simplification_calculs_enchaines.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/eleve_simul_lancers_de.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_babylone.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_balayage_fonctions.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_courbe_fonction.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_decomp_facteurspremiers.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_dichotomie.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_ductoscane.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_euler.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_integrale_trapezes.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_montecarlo.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_pgcd_euclide.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_somme_entiers.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_suite_syracuse.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_tri_abulle.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_pgcd_recursif.alg
  ${CMAKE_SOURCE_DIR}/datas/distrib/win/algobox.ico
  ${CMAKE_SOURCE_DIR}/datas/doc/aidealgobox.html
  ${CMAKE_SOURCE_DIR}/AUTHORS
  ${CMAKE_SOURCE_DIR}/COPYING
  ${CMAKE_SOURCE_DIR}/datas/CHANGELOG.txt
  ${CMAKE_SOURCE_DIR}/translations/qt/qt_fr.qm
)
set(ICON_FILE "${CMAKE_SOURCE_DIR}/datas/distrib/win/win.rc")
elseif (APPLE)
set(RESOURCE_FILES
  ${CMAKE_SOURCE_DIR}/datas/ressources/eleve_calcul_recurrent.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/eleve_distance_sur_un_axe.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/eleve_que_fait_lalgo.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/eleve_simplification_calculs_enchaines.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/eleve_simul_lancers_de.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_babylone.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_balayage_fonctions.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_courbe_fonction.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_decomp_facteurspremiers.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_dichotomie.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_ductoscane.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_euler.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_integrale_trapezes.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_montecarlo.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_pgcd_euclide.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_somme_entiers.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_suite_syracuse.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_tri_abulle.alg
  ${CMAKE_SOURCE_DIR}/datas/ressources/prof_pgcd_recursif.alg
  ${CMAKE_SOURCE_DIR}/datas/doc/aidealgobox.html
  ${CMAKE_SOURCE_DIR}/AUTHORS
  ${CMAKE_SOURCE_DIR}/COPYING
  ${CMAKE_SOURCE_DIR}/datas/CHANGELOG.txt
  ${CMAKE_SOURCE_DIR}/translations/qt/qt_fr.qm
)
SET_SOURCE_FILES_PROPERTIES(${RESOURCE_FILES} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")

SET(ICON_FILE "${CMAKE_SOURCE_DIR}/datas/distrib/mac/algobox.icns")
set_source_files_properties(${ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")

endif()



##########################################

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTORCC ON)

find_package(Qt6 REQUIRED COMPONENTS Gui Concurrent Core Core5Compat Network PrintSupport Qml Widgets Xml LinguistTools WebEngineWidgets)

qt_standard_project_setup()


set(algobox_SRCS
${algobox_SRCS_PLATFORM}
src/pourlineedit.cpp src/pourlineedit.h
src/affectationdialog.cpp src/affectationdialog.h src/affectationdialog.ui
src/affichercalculdialog.cpp src/affichercalculdialog.h src/affichercalculdialog.ui
src/afficherdialog.cpp src/afficherdialog.h src/afficherdialog.ui
src/algobox.cpp src/algobox.h src/algobox.ui
src/algoconsole.cpp src/algoconsole.h
src/algoeditor.cpp src/algoeditor.h
src/algoeditorview.cpp src/algoeditorview.h
src/algohighlighter.cpp src/algohighlighter.h
src/algowebpage.cpp src/algowebpage.h
src/algowebview.cpp src/algowebview.h
src/animatedlabel.cpp src/animatedlabel.h
src/appeldialog.cpp src/appeldialog.h src/appeldialog.ui
src/aproposdialog.cpp src/aproposdialog.h src/aproposdialog.ui
src/blockdata.cpp src/blockdata.h
src/browser.cpp src/browser.h
src/browserdialog.cpp src/browserdialog.h src/browserdialog.ui
src/commentairedialog.cpp src/commentairedialog.h src/commentairedialog.ui
src/conditiondialog.cpp src/conditiondialog.h src/conditiondialog.ui
src/configdialog.cpp src/configdialog.h src/configdialog.ui
src/consoledialog.cpp src/consoledialog.h src/consoledialog.ui
src/consolehighlighter.cpp src/consolehighlighter.h
src/findwidget.cpp src/findwidget.h src/findwidget.ui
src/fonctiondialog.cpp src/fonctiondialog.h src/fonctiondialog.ui
src/geticon.cpp src/geticon.h
src/jseditor.cpp src/jseditor.h
src/jseditorview.cpp src/jseditorview.h
src/jsfindwidget.cpp src/jsfindwidget.h
src/jshighlighter.cpp src/jshighlighter.h
src/jslinenumberwidget.cpp src/jslinenumberwidget.h
src/jsmainwindow.cpp src/jsmainwindow.h
src/jsreplacedialog.cpp src/jsreplacedialog.h
src/latexhighlighter.cpp src/latexhighlighter.h
src/latexviewdialog.cpp src/latexviewdialog.h src/latexviewdialog.ui
src/linenumberwidget.cpp src/linenumberwidget.h
src/liredialog.cpp src/liredialog.h src/liredialog.ui
src/loghighlighter.cpp src/loghighlighter.h
src/messagedialog.cpp src/messagedialog.h src/messagedialog.ui
src/modifierlignedialog.cpp src/modifierlignedialog.h src/modifierlignedialog.ui
src/pointdialog.cpp src/pointdialog.h src/pointdialog.ui
src/pourdialog.cpp src/pourdialog.h src/pourdialog.ui
src/renvoyerdialog.cpp src/renvoyerdialog.h src/renvoyerdialog.ui
src/replacedialog.cpp src/replacedialog.h src/replacedialog.ui
src/segmentdialog.cpp src/segmentdialog.h src/segmentdialog.ui
src/tantquedialog.cpp src/tantquedialog.h src/tantquedialog.ui
src/toolbox.cpp src/toolbox.h src/treedelegate.cpp
src/treedelegate.h
src/variabledialog.cpp src/variabledialog.h src/variabledialog.ui
src/verifdialog.cpp src/verifdialog.h src/verifdialog.ui
src/x11fontdialog.cpp src/x11fontdialog.h src/x11fontdialog.ui
)


add_executable(${PROJECT_NAME} WIN32 MACOSX_BUNDLE ${algobox_SRCS} src/main.cpp algobox.qrc ${ICON_FILE} ${RESOURCE_FILES})

set(ALGOBOX_INCLUDE_DIRECTORIES
  ${CMAKE_SOURCE_DIR}
  ${CMAKE_SOURCE_DIR}/src
)


target_include_directories( ${PROJECT_NAME} PUBLIC ${ALGOBOX_INCLUDE_DIRECTORIES})

target_compile_definitions(${PROJECT_NAME} PRIVATE
    ALGOBOXVERSION=${PROJECT_VERSION}
    QT_NO_DEPRECATED_WARNINGS
    QT_NO_EXCEPTIONS
    QT_NO_DYNAMIC_CAST
    QT_NO_DEBUG
    FT2_BUILD_LIBRARY
    NOMINMAX
    OPJ_STATIC
    PNG_PREFIX
    PNG_USE_READ_MACROS
    V8_DEPRECATION_WARNINGS
)

if (NOT WIN32)
add_definitions(
    -fno-exceptions
    -fno-rtti
    -w
    -fvisibility=hidden
    -fvisibility-inlines-hidden
    -fPIC
)
endif()



if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    target_compile_options(${PROJECT_NAME} PRIVATE -Wno-unused-variable -Wdeprecated-declarations)
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
    target_compile_options(${PROJECT_NAME} PRIVATE -wd4267)
endif()


################ LINUX #######################
if(UNIX AND NOT APPLE)
target_compile_definitions(${PROJECT_NAME} PRIVATE
        _FX_CPU_=_FX_X64_
        HAVE_UNISTD_H
    )
if (${COMPILEUSB} STREQUAL "yes")
  target_compile_definitions(${PROJECT_NAME} PRIVATE
        USB_VERSION
    )
endif()
############### FEDORA/OBS ###############
set(PREFIX ${INSTALL_DIR})
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
  set(CMAKE_INSTALL_PREFIX ${PREFIX} CACHE PATH "..." FORCE)
endif()
target_compile_definitions(${PROJECT_NAME} PRIVATE
    PREFIX=\"${PREFIX}\"
    )
#########################################
if (${AUTHORIZELINUXQSTYLES} STREQUAL "yes")
target_compile_definitions(${PROJECT_NAME} PRIVATE
        AUTHORIZE_LINUX_QSTYLES
    )
endif()



if (${COMPILEUSB} STREQUAL "yes")
  install( TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX})
  install( FILES ${UTILITIES_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX})
  install( FILES ${DESKTOP_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX})
  install( FILES ${MIME_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX})
  install( FILES ${ICON_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX})
  install( FILES ${METAINFO_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX})
else()
  install( TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
  install( FILES ${UTILITIES_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/algobox)
  install( FILES ${DESKTOP_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
  install( FILES ${MIME_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/mime/application)
  install( FILES ${ICON_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps)
  install( FILES ${METAINFO_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/metainfo)
endif()
endif()

################ MACOS #######################
if(APPLE)
set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0")

SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES
  MACOSX_BUNDLE TRUE
  MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/datas/distrib/mac/Info.plist
  RESOURCE "${RESOURCE_FILES}"
)

target_link_libraries(${PROJECT_NAME} PRIVATE
        "-framework AppKit"
        "-framework CoreFoundation"
    )

target_compile_definitions(${PROJECT_NAME} PRIVATE
        HAVE_UNISTD_H
    )

  set(CMAKE_INSTALL_PREFIX ${INSTALL_DIR} CACHE PATH "..." FORCE)


get_target_property(_qmake_executable Qt6::qmake IMPORTED_LOCATION)
get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY)
find_program(MACDEPLOYQT_EXECUTABLE macdeployqt HINTS "${_qt_bin_dir}")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/datas/distrib/mac/qt_menu.nib"                                                       "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.app/Contents/Resources/qt_menu.nib"
        COMMAND "${MACDEPLOYQT_EXECUTABLE}" ARGS "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.app"
        )
INSTALL(TARGETS ${PROJECT_NAME} BUNDLE DESTINATION ${CMAKE_INSTALL_PREFIX})
endif()
################ WIN #######################
if(WIN32)
    target_link_libraries(${PROJECT_NAME} PRIVATE
        advapi32
        gdi32
        user32
        shlwapi
    )
if (${COMPILEUSB} STREQUAL "yes")
  target_compile_definitions(${PROJECT_NAME} PRIVATE
        USB_VERSION
    )
endif()
SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES WIN32_EXECUTABLE TRUE)

if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
  set(CMAKE_INSTALL_PREFIX ${INSTALL_DIR} CACHE PATH "..." FORCE)
endif()

get_target_property(_qmake_executable Qt6::qmake IMPORTED_LOCATION)
get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY)
find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${_qt_bin_dir}")
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.exe" "${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}.exe"
        COMMAND "${WINDEPLOYQT_EXECUTABLE}" ARGS "${CMAKE_INSTALL_PREFIX}/${PROJECT_NAME}.exe"
        )
install( FILES ${RESOURCE_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX})
endif()

#############################################
target_link_libraries(${PROJECT_NAME} PRIVATE
        Qt6::Concurrent
        Qt6::Core
        Qt6::Core5Compat
        Qt6::Gui
        Qt6::Network
        Qt6::PrintSupport
        Qt6::Qml
        Qt6::Widgets
        Qt6::Xml
        Qt6::WebEngineWidgets
)

