Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • f2b05cacccfe585599df67fc33c1de85ed5dbc9b
  • master par défaut
  • script
  • new-devel
  • devel
  • timingView-edit
  • fix-mpv
7 résultats

CMakeLists.txt

Blame
  • CMakeLists.txt 11,92 Kio
    cmake_minimum_required(VERSION 3.17)
    
    set(LKT_VERSION 2.4)
    
    if(CMAKE_BUILD_TYPE STREQUAL "Release")
        set(CMAKE_BUILD_TYPE RelWithDebInfo)
    endif()
    
    project(lektor VERSION ${LKT_VERSION} LANGUAGES C CXX)
    
    cmake_policy(SET CMP0100 NEW)
    cmake_policy(SET CMP0009 NEW)
    
    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/utils/cmake/")
    set(CMAKE_POSITION_INDEPENDENT_CODE ON)
    set(THREADS_PREFER_PTHREAD_FLAG     ON)
    set(CMAKE_COLOR_MAKEFILE            ON)
    
    include(TestBigEndian)   # Needed for endianness tests
    include(FindOpenMP)      # Test OpenMP support
    include(GNUInstallDirs)  # Needed for installation things
    include(ExternalProject) # Enable ExternalProject CMake module
    
    ###         ###
    # TEST OPENMP #
    ###         ###
    
    if(OpenMP_FOUND)
        message(STATUS "OpenMP found by CMake for C (version ${OpenMP_C_VERSION}) and C++ (version ${OpenMP_CXX_VERSION})")
    else()
        message(FATAL_ERROR "OpenMP not found by CMake for C and C++")
    endif()
    
    ###                  ###
    # SET COMMON VARIABLES #
    ###                  ###
    
    set(${CMAKE_C_COMPILER_ID}_C_FLAGS)
    set(COMMON_C_FLAGS
        -Wall -Wextra -Werror
        -Wshadow
        -Wcast-align
        -Wconversion
        -Wsign-conversion
        -Wunused-variable
        -Wmisleading-indentation
        -Wnull-dereference
        -Wdouble-promotion
        -Wformat=2
        -Wignored-qualifiers
        ${OpenMP_C_FLAGS}
    )
    set(Clang_C_FLAGS
        -Weverything
        -Wpedantic
        -Wno-extra-semi-stmt
        -Wno-reserved-id-macro
        -Wno-reserved-identifier
        -Wno-used-but-marked-unused
        -Wno-unused-macros
        -Wno-cast-qual
        -Wno-macro-redefined
        -Wno-padded
        -Wno-vla
        -Wno-disabled-macro-expansion
        -Wno-extra-semi
        -Wno-format-nonliteral
        -Wno-missing-variable-declarations
        -Wno-unknown-warning-option
        -Wno-declaration-after-statement
        -Wno-double-promotion # Because of SDL2...
        -fcolor-diagnostics
    )
    set(Clang_CXX_FLAGS
        $<$<COMPILE_LANGUAGE:CXX>:-Wno-c++98-compat-pedantic>
        $<$<COMPILE_LANGUAGE:CXX>:-Wno-redundant-parens>
        $<$<COMPILE_LANGUAGE:CXX>:-Wno-inconsistent-missing-override>
        $<$<COMPILE_LANGUAGE:CXX>:-Wno-suggest-override>
        $<$<COMPILE_LANGUAGE:CXX>:-Wno-deprecated-declaration>
    )
    set(GNU_C_FLAGS
        -fdiagnostics-color=always
    )
    
    ###               ###
    # FIND DEPENDENCIES #
    ###               ###
    
    find_library(MPV_LIBRARY        mpv                   REQUIRED)                   # tested with 0.32.0
    find_library(SQLITE3_LIBRARY    sqlite3               REQUIRED version>=3.31.0)   # tested with 3.34.1
    
    find_package(SDL2                                     REQUIRED version>=2.0)      # tested with 2.0.14
    find_package(SDL2_image                               REQUIRED version>=2.0)      # same as above ^
    find_package(CURL                                     REQUIRED HTTP HTTPS)        # tested with 7.74.0
    find_package(QT NAMES Qt6 Qt5      COMPONENTS Widgets REQUIRED)
    find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED)
    
    set(CMAKE_AUTOUIC ON)
    set(CMAKE_AUTOMOC ON)
    set(CMAKE_AUTORCC ON)
    
    find_program(MKVPROPEDIT mkvpropedit REQUIRED)   # To DL karas and apply metadata
    find_program(XXD         xxd         REQUIRED)   # To embed the sqlite db schemas into the binary
    find_program(CARGO       cargo       REQUIRED)   # For rust things
    
    message(STATUS "The installation prefix is ${CMAKE_INSTALL_PREFIX}")
    
    TEST_BIG_ENDIAN(IS_BIG_ENDIAN)
    if(IS_BIG_ENDIAN)
        set(LKT_ENDIANES_BIG 1)
        message(STATUS "Building lektor on ${CMAKE_SYSTEM_PROCESSOR} - big endian")
    else()
        set(LKT_ENDIANES_LITTLE 1)
        message(STATUS "Building lektor on ${CMAKE_SYSTEM_PROCESSOR} - little endian")
    endif()
    
    # Don't forget for specific things
    if(WIN32)
        message(STATUS "You are building on windows, pay attenion to the dependencies")
        set(GENERATE_MANPAGES 0)
        set(LKT_OS_WIN        1)
        add_compile_definitions(LKT_OS_WIN=1)
    endif()
    if(MSVC OR MSYS OR MINGW)
        message(STATUS "You are building with a windows compiler")
        set(GENERATE_MANPAGES 0)
        set(LKT_OS_MINGW      1)
        add_compile_definitions(LKT_OS_MINGW=1)
    endif()
    if(APPLE)
        message(STATUS "You are building on MacOS X")
        find_program(MAN man REQUIRED)
        set(GENERATE_MANPAGES 1)
        set(LKT_OS_APPLE      1)
        add_compile_definitions(LKT_OS_APPLE=1)
    endif()
    if(UNIX AND NOT APPLE)
        message(STATUS "You are building on Linux, FreeBSD or any other toaster OS")
        find_program(MAN man REQUIRED)
        set(GENERATE_MANPAGES 1)
        set(LKT_OS_TOASTER    1)
        add_compile_definitions(LKT_OS_TOASTER=1)
    endif()
    
    # Check for the OS
    if((NOT DEFINED LKT_OS_WIN)   AND (NOT DEFINED LKT_OS_MINGW) AND
       (NOT DEFINED LKT_OS_APPLE) AND (NOT DEFINED LKT_OS_TOASTER))
        message(FATAL_ERROR "The OS is not recognized")
    endif()
    
    ###            ###
    # GRAB ALL FILES #
    ###            ###
    
    set(lektor_db_SOURCES
        src/database/queue.c
        src/database/config.c
        src/database/playlist.c
        src/database/find.c
        src/database/user.c
        src/database/stickers.c
        src/database/cache.c
        src/database/open.c
        src/database/update.c
        src/database/upgrade.c
        src/lib/strv.c
    )
    
    set(lektor_module_SOURCES
        src/base/reg.c
        src/module/module_repo.c
        src/module/mpv.c
        src/module/module_sdl2.c
        src/module/thread.c
    
        src/module/module_qt_window.cc
        src/module/qt_window/mpvwidget.cc
        src/module/qt_window/mainwindow.cc
    )
    
    set(lektor_mkv_SOURCES
        src/mkv/utils.c
        src/mkv/write.c
        src/mkv/mkv.c
        src/base/bufferfd.c
    )
    
    set(lektor_base_SOURCES
        src/base/config.c
        src/base/logfile.c
        src/base/launch.c
        src/base/stack.c
        src/base/json.c
        src/base/common.c
        src/base/segv.c
        src/base/cmd.c
        src/base/uri.c
        src/base/commands.c
        src/base/os.c
        src/base/stb.c
    )
    
    set(lektor_net_SOURCES
        src/net/command.c
        src/net/listen.c
        src/net/message.c
    )
    
    set(lektord_SOURCES
        src/main/server.c
        ${lektor_net_SOURCES}
        ${lektor_base_SOURCES}
        ${lektor_mkv_SOURCES}
        ${lektor_module_SOURCES}
        ${lektor_db_SOURCES}
    )
    
    set(lkt_SOURCES
        src/main/lkt.c
        src/base/common.c
        src/base/segv.c
        src/base/cmd.c
    )
    
    set(luka_SOURCES
        src/main/luka.c
        ${lektor_net_SOURCES}
        ${lektor_base_SOURCES}
        ${lektor_module_SOURCES}
        ${lektor_db_SOURCES}
        ${lektor_mkv_SOURCES}
    )
    
    set(common_DEFINITIONS
        LKT_ARCH="${CMAKE_SYSTEM_PROCESSOR}"
        LKT_MAN_BINARY="${MAN}"
        LKT_ENDIANES_BIG=${LKT_ENDIANES_BIG}
        LKT_ENDIANES_LITTLE=${LKT_ENDIANES_LITTLE}
        LKT_STATIC_MODULE=1 # Only build static modules with cmake
        _POSIX_C_SOURCE=200809L # POSIX 2008/09
        LKT_VERSION="${LKT_VERSION}"
    )
    
    set(SQL_GENERATED_FILE ${CMAKE_CURRENT_BINARY_DIR}/disk_sql.c)
    set(SQL_SOURCE_FILES
        ${CMAKE_CURRENT_SOURCE_DIR}/src/database/disk.sql
        ${CMAKE_CURRENT_SOURCE_DIR}/src/database/memory.sql
    )
    
    ###                        ###
    # THE COMPILATION DIRECTIVES #
    ###                        ###
    
    add_custom_command(OUTPUT ${SQL_GENERATED_FILE}
        COMMAND ${CMAKE_COMMAND} -E touch ${SQL_GENERATED_FILE}
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    
        COMMAND ${CMAKE_COMMAND} -E echo 'unsigned char ___src_database_disk_sql[] = { '              >  ${SQL_GENERATED_FILE}
        COMMAND ${XXD} -i < ${CMAKE_CURRENT_SOURCE_DIR}/src/database/disk.sql                         >> ${SQL_GENERATED_FILE}
        COMMAND ${CMAKE_COMMAND} -E echo ', 0x00 }\; unsigned char ___src_database_memory_sql[] = { ' >> ${SQL_GENERATED_FILE}
        COMMAND ${XXD} -i < ${CMAKE_CURRENT_SOURCE_DIR}/src/database/memory.sql                       >> ${SQL_GENERATED_FILE}
        COMMAND ${CMAKE_COMMAND} -E echo ', 0x00 }\;'                                                 >> ${SQL_GENERATED_FILE}
    
        DEPENDS ${SQL_SOURCE_FILES}
        COMMENT "Generating SQL included files to embed them"
    )
    
    if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
        qt_add_executable(lektord
            MANUAL_FINALIZATION
            ${lektord_SOURCES}
            ${SQL_GENERATED_FILE}
        )
    else()
        add_executable(lektord
            ${lektord_SOURCES}
            ${SQL_GENERATED_FILE}
        )
    endif()
    add_executable(lkt  ${lkt_SOURCES})
    add_executable(luka ${luka_SOURCES} ${SQL_GENERATED_FILE})
    
    set(MANPAGES_COMMANDS)
    if(GENERATE_MANPAGES)
        message(STATUS "Generating manpages")
        set(MANPAGE_COMMANDS lkt lektord lektor luka)
        foreach(CMD IN LISTS MANPAGE_COMMANDS)
            add_custom_target(manpage_cmd_${CMD} ALL
                COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/utils/scripts/manpage.bash
                        ${CMAKE_CURRENT_SOURCE_DIR}/man/${CMD}.template
                        ${CMAKE_CURRENT_BINARY_DIR}/${CMD}.1
                        ${CMAKE_CURRENT_SOURCE_DIR}/man/footer
                DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/man/${CMD}.template
                        ${CMAKE_CURRENT_SOURCE_DIR}/man/footer
                COMMENT "Generating manpage for command ${CMD}"
            )
        endforeach()
    endif()
    
    target_link_libraries(lektord PRIVATE
        ${OpenMP_C_LIBRARIES}
        ${MPV_LIBRARY}
        ${CMAKE_DL_LIBS}
        ${SQLITE3_LIBRARY}
        ${SDL2_LIBRARIES}
        ${CURL_LIBRARIES}
        ${SDL2_IMAGE_LIBRARIES}
        Qt${QT_VERSION_MAJOR}::Widgets
    )
    target_link_libraries(luka PRIVATE
        ${OpenMP_C_LIBRARIES}
        ${MPV_LIBRARY}
        ${CMAKE_DL_LIBS}
        ${SQLITE3_LIBRARY}
        ${SDL2_LIBRARIES}
        ${CURL_LIBRARIES}
        ${SDL2_IMAGE_LIBRARIES}
        Qt${QT_VERSION_MAJOR}::Widgets
    )
    target_link_libraries(lkt PRIVATE
        ${OpenMP_C_LIBRARIES}
    )
    
    target_include_directories(lkt  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/inc)
    target_include_directories(luka PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/inc
        ${SDL2_INCLUDE_DIRS}
        ${SDL2_IMAGE_INCLUDE_DIRS}
        ${CURL_INCLUDE_DIRS}
    )
    target_include_directories(lektord PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/inc
        ${SDL2_INCLUDE_DIRS}
        ${SDL2_IMAGE_INCLUDE_DIRS}
        ${CURL_INCLUDE_DIRS}
    )
    
    target_compile_definitions(lektord PRIVATE ${common_DEFINITIONS})
    target_compile_definitions(lkt     PRIVATE ${common_DEFINITIONS})
    target_compile_definitions(luka    PRIVATE ${common_DEFINITIONS})
    
    target_compile_options(lektord PRIVATE ${COMMON_C_FLAGS} ${${CMAKE_C_COMPILER_ID}_C_FLAGS} ${${CMAKE_CXX_COMPILER_ID}_CXX_FLAGS})
    target_compile_definitions(lektord PRIVATE
        QT_DISABLE_DEPRECATED_BEFORE=0x050F00
        QT_NO_CAST_TO_ASCII
        QT_RESTRICTED_CAST_FROM_ASCII
        QTCREATOR_UTILS_STATIC_LIB
    )
    
    target_compile_options(lkt  PRIVATE ${COMMON_C_FLAGS} ${${CMAKE_C_COMPILER_ID}_C_FLAGS} ${${CMAKE_CXX_COMPILER_ID}_CXX_FLAGS})
    target_compile_options(luka PRIVATE ${COMMON_C_FLAGS} ${${CMAKE_C_COMPILER_ID}_C_FLAGS} ${${CMAKE_CXX_COMPILER_ID}_CXX_FLAGS})
    
    set_property(TARGET lektord PROPERTY CXX_STANDARD 20)
    set_property(TARGET luka    PROPERTY CXX_STANDARD 20)
    
    set_directory_properties(PROPERTIES EP_PREFIX ${CMAKE_BINARY_DIR}/Rust)
    
    ExternalProject_Add(liblektor_rs
        DOWNLOAD_COMMAND  ""
        CONFIGURE_COMMAND ""
        SOURCE_DIR        "${CMAKE_SOURCE_DIR}/src/rust/liblektor-rs"
        BUILD_COMMAND     "${CARGO}" build
        COMMAND           "${CARGO}" build
        INSTALL_COMMAND   ""
        BUILD_BYPRODUCTS  "${CMAKE_SOURCE_DIR}/src/rust/liblektor-rs/target/debug/liblektor_rs.a"
        BUILD_ALWAYS      1
        BUILD_IN_SOURCE   1
        LOG_BUILD         1
    )
    
    add_dependencies(lektord liblektor_rs)
    
    target_link_libraries(lektord
        PRIVATE
        "${CMAKE_SOURCE_DIR}/src/rust/liblektor-rs/target/debug/liblektor_rs.a"
        Qt${QT_VERSION_MAJOR}::Widgets
    )
    
    ###                    ###
    # THE INSTALL DIRECTIVES #
    ###                    ###
    
    install(TARGETS lektord lkt luka
        RUNTIME # For lektord
        RUNTIME # For lkt
        RUNTIME # For luka
    )
    
    install(FILES
        ${CMAKE_SOURCE_DIR}/utils/scripts/kagari.py      # Install the kagary script
        RENAME kagari                                    # Get ride of the leading `.py`
        DESTINATION ${CMAKE_INSTALL_BINDIR}              # In the bin dir
        PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
                    GROUP_EXECUTE             GROUP_READ
                    WORLD_EXECUTE             WORLD_READ # 0755
    )
    
    foreach(CMD IN LISTS MANPAGE_COMMANDS)
        install(FILES
            ${CMAKE_CURRENT_BINARY_DIR}/${CMD}.1     # The manpage to install
            DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 # A cat 1 manpage
        )
    endforeach()
    
    if(QT_VERSION_MAJOR EQUAL 6)
        qt_finalize_executable(lektord)
    endif()