# Copyright (C) 2019 ~ 2020 Uniontech Software Technology Co.,Ltd.
#
# Author:     V4fr3e <V4fr3e@deepin.io>
#
# Maintainer: V4fr3e <liujinli@uniontech.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

cmake_minimum_required(VERSION 3.7)
set(PROJECT_VERSION "5.9.0.53")

if (NOT DEFINED VERSION)
    set(VERSION 1.2.2)
endif ()

ADD_COMPILE_OPTIONS(-fno-access-control)

#set different ISO types
#1:professional 2:community 3:server
#set(ISO_TYPE "professional")
# set(ISO_TYPE "community")
#set(ISO_TYPE "server")

#common resource names
set(APP_RES_DIR "${CMAKE_SOURCE_DIR}/resources")
set(APP_BIN_NAME "dde-introduction")
set(APP_DESKTOP "${CMAKE_SOURCE_DIR}/dde-introduction.desktop")
set(APP_QRC "${CMAKE_SOURCE_DIR}/dde-introduction.qrc")
set(APP_LOGO "${APP_RES_DIR}/dde-introduction.svg")

#Check if APP_TS_UPDATE var isn't set, don't need update ts file
if (NOT DEFINED APP_TS_UPDATE)
   set(APP_TS_UPDATE false)
endif()

#Only update ts file when APP_TS_UPDATE=true
if (${APP_TS_UPDATE} STREQUAL "true")
    set(APP_TS_UPDATE true)
endif()

project(${APP_BIN_NAME})

set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wl,--as-need -fPIE")
set(CMAKE_EXE_LINKER_FLAGS "-pie")

#安全测试加固编译参数
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -z relro -z now -z noexecstack -pie")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -z relro -z now -z noexecstack -pie")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -fstack-protector-all")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -fstack-protector-all")

if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "sw_64")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mieee")
elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "loongarch64")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DISLOONGARCH64")
endif ()

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake)
# 引入翻译生成
include(translation-generate)

# Find Qt version
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core)
message("   >>> Found Qt version: ${QT_VERSION_MAJOR}")
set(QT_DESIRED_VERSION ${QT_VERSION_MAJOR})

if (QT_VERSION_MAJOR MATCHES 6)
    set(DTK_VERSION_MAJOR 6)
else()
    set(DTK_VERSION_MAJOR "")
endif()
message("   >>> Build with DTK: ${DTK_VERSION_MAJOR}")

#compile flags
if (CMAKE_BUILD_TYPE MATCHES Debug)
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -Wextra")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -Wextra")

  # Enable Qt builtin debug mode
  add_definitions("-DQT_MESSAGELOGCONTEXT")
else()
  # -Wl, -O2 Enable linker optimizations
  # -Wl, --gc-sections Remove unused code resulting from -fdsta-sections and
  # -ffunction-sections
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O2 -Wl,-O1 -Wl,--gc-sections")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O2 -Wl,-O1 -Wl,--gc-sections")
endif()


configure_file(${CMAKE_CURRENT_LIST_DIR}/src/environments.h.in ${CMAKE_CURRENT_LIST_DIR}/src/environments.h @ONLY)

macro(SUBDIRLIST result curdir)
    file(GLOB children RELATIVE ${curdir} ${curdir}/*)
    set(dirlist "")
    foreach(child ${children})
        if(IS_DIRECTORY ${curdir}/${child})
            LIST(APPEND dirlist ${child})
        endif()
    endforeach()
    set(${result} ${dirlist})
endmacro()

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)
SUBDIRLIST(all_src ${CMAKE_CURRENT_SOURCE_DIR}/src)

#Include all app own subdirectorys
foreach(subdir ${all_src})
    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src/${subdir})
endforeach()

file(GLOB_RECURSE CPP_SRC ${CMAKE_SOURCE_DIR}/src/*.cpp)


# Find the library
find_package(PkgConfig REQUIRED)
set(qt_required_components Core DBus Gui Widgets Sql Multimedia)

if (QT_DESIRED_VERSION MATCHES 6)
    list(APPEND qt_required_components Core5Compat)
else()
    # list(APPEND qt_required_components X11Extras )
endif()

find_package(Qt${QT_DESIRED_VERSION} REQUIRED COMPONENTS ${qt_required_components})
find_package(Dtk${DTK_VERSION_MAJOR} REQUIRED COMPONENTS Widget Gui Core)

set(LINK_LIBS
    Qt${QT_DESIRED_VERSION}::Core
    Qt${QT_DESIRED_VERSION}::DBus
    Qt${QT_DESIRED_VERSION}::Gui
    Qt${QT_DESIRED_VERSION}::Widgets
    Qt${QT_DESIRED_VERSION}::Sql
    Qt${QT_DESIRED_VERSION}::Multimedia
    Dtk${DTK_VERSION_MAJOR}::Widget
    Dtk${DTK_VERSION_MAJOR}::Gui
    Dtk${DTK_VERSION_MAJOR}::Core
)

if (QT_DESIRED_VERSION MATCHES 6)
    list(APPEND LINK_LIBS Qt${QT_DESIRED_VERSION}::Core5Compat)
    # list(APPEND LINK_LIBS Qt${QT_VERSION_MAJOR}::GuiPrivate)
else()
    # list(APPEND LINK_LIBS Qt${QT_VERSION_MAJOR}::WidgetsPrivate)
    # list(APPEND LINK_LIBS Qt${QT_DESIRED_VERSION}::X11Extras)
endif()

include_directories(${GSTREAMER_INCLUDE_DIRS})

pkg_check_modules(LIBDMR REQUIRED libdmr)
include_directories(${LIBDMR_INCLUDE_DIRS})

# 获取 pkg-config 的搜索路径
execute_process(
    COMMAND pkg-config --variable pc_path pkg-config
    OUTPUT_VARIABLE PKG_CONFIG_PATHS
    OUTPUT_STRIP_TRAILING_WHITESPACE
)

# 将 PKG_CONFIG_PATHS 转换为列表
string(REPLACE ":" ";" PKG_CONFIG_PATHS "${PKG_CONFIG_PATHS}")

# 查找 libdmr.pc 文件
set(LIBDMR_PKGCONF "")
foreach(PATH ${PKG_CONFIG_PATHS})
    if(EXISTS "${PATH}/libdmr.pc")
        set(LIBDMR_PKGCONF "${PATH}/libdmr.pc")
        break()
    endif()
endforeach()
message("LIBDMR_PKGCONF: ${LIBDMR_PKGCONF}")

# 读取 libdmr.pc 文件的内容
file(READ ${LIBDMR_PKGCONF} LIBDMR_PC_CONTENT)

# 查找 Requires 部分
string(REGEX MATCH "Requires: ([^\\n]+)" LIBDMR_REQUIRES "${LIBDMR_PC_CONTENT}")

# 提取依赖库列表
if(LIBDMR_REQUIRES)
    string(REGEX REPLACE "Requires: ([^\\n]+)" "\\1" LIBDMR_REQUIRES_LIST "${LIBDMR_REQUIRES}")
    
    # 根据 QT_DESIRED_VERSION 检查依赖的 Qt 版本
    if(QT_DESIRED_VERSION MATCHES 6)
        if(LIBDMR_REQUIRES_LIST MATCHES "Qt6Widgets")
            message(STATUS "libdmr 依赖于 Qt6")
        else()
            message(FATAL_ERROR "Qt6 编译， 但 libdmr 不是依赖 Qt6")
        endif()
    else()
        if(LIBDMR_REQUIRES_LIST MATCHES "Qt5Widgets")
            message(STATUS "libdmr 依赖于 Qt5")
        else()
            message(FATAL_ERROR "Qt5 编译， 但 libdmr 不是依赖 Qt5")
        endif()
    endif()
else()
    message(STATUS "无法从 libdmr.pc 文件中获取 Requires 部分")
endif()

pkg_check_modules(FFMPEGTHUMBNAIL REQUIRED libffmpegthumbnailer)
include_directories(${FFMPEGTHUMBNAIL_INCLUDE_DIRS})

# Tell CMake to create the executable
add_executable(${PROJECT_NAME} ${CPP_SRC} ${APP_QRC})

target_include_directories(${APP_BIN_NAME}
    PUBLIC ${DtkWidget_INCLUDE_DIRS} ${OBJECT_BINARY_DIR})

target_link_libraries(${APP_BIN_NAME}
    ${LINK_LIBS}
    ${GSTREAMER_LIBRARIES}
    ${LIBDMR_LIBRARIES}
    ${FFMPEGTHUMBNAIL_LIBRARIES}
)

if(NOT CMAKE_INSTALL_PREFIX)
    set(CMAKE_INSTALL_PREFIX "/usr")
endif()

# Install files
install(TARGETS dde-introduction DESTINATION ${CMAKE_INSTALL_BINDIR})

file(GLOB_RECURSE ASS_SRC ${CMAKE_SOURCE_DIR}/resources/video/*.ass)

#Choose different videos for different ISO types
#if(ISO_TYPE MATCHES "server")
#set(VIDEO_PATH ${CMAKE_SOURCE_DIR}/resources/video/server/demo.mp4)
#elseif(ISO_TYPE MATCHES "community")
#set(VIDEO_PATH ${CMAKE_SOURCE_DIR}/resources/video/community/demo.mp4)
#else()
#临时代码，提供动图后需要修改！！！
set(VIDEO_PATH ${CMAKE_SOURCE_DIR}/resources/video/2500/)
#endif()

#代码覆盖率开关
if(CMAKE_COVERAGE_ARG STREQUAL "CMAKE_COVERAGE_ARG_ON")
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -fprofile-arcs -ftest-coverage")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -fprofile-arcs -ftest-coverage")
endif()

# translation files
TRANSLATION_GENERATE(QM_FILES ${CMAKE_SOURCE_DIR}/translations)
add_custom_target(${PROJECT_NAME}_qm_files DEPENDS ${QM_FILES})
add_dependencies(${PROJECT_NAME} ${PROJECT_NAME}_qm_files)

# Install translations
install(FILES ${QM_FILES} DESTINATION share/${PROJECT_NAME}/translations)

install(FILES ${APP_DESKTOP} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
install(FILES ${APP_LOGO} DESTINATION  ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps/)
install(FILES ${ASS_SRC} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/dde-introduction/)
install(DIRECTORY ${VIDEO_PATH} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/dde-introduction/)
#add ut test
#add_subdirectory(tests)


