Skip to content
Extraits de code Groupes Projets
Sélectionner une révision Git
  • 3c42d06a2a34288e31964ee2ccda6989a9e29934
  • master par défaut protégée
  • rust-playlist-sync
  • rust
  • fix-qt-deprecated-qvariant-type
  • fix-mpris-qtwindow-race-condition
  • rust-appimage-wayland
  • windows-build-rebased
  • v2.5 protégée
  • v2.4 protégée
  • v2.3-1 protégée
  • v2.3 protégée
  • v2.2 protégée
  • v2.1 protégée
  • v2.0 protégée
  • v1.8-3 protégée
  • v1.8-2 protégée
  • v1.8-1 protégée
  • v1.8 protégée
  • v1.7 protégée
  • v1.6 protégée
  • v1.5 protégée
  • v1.4 protégée
  • v1.3 protégée
  • v1.2 protégée
  • v1.1 protégée
  • v1.0 protégée
27 résultats

CMakeLists.txt

Blame
  • CMakeLists.txt 11,97 Kio
    cmake_minimum_required(VERSION 3.17)
    
    set(LKT_VERSION 2.4)
    
    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(GNUInstallDirs)  # Needed for installation things
    include(ExternalProject) # Enable ExternalProject CMake module
    
    ###           ###
    # FIND PROGRAMS #
    ###           ###
    
    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
    
    if(CMAKE_RUST_COMPILER)
        message(STATUS "Override cargo path: ${CMAKE_RUST_COMPILER}")
        set(CARGO "${CMAKE_RUST_COMPILER}")
    else()
        message(STATUS "Using cargo: ${CARGO}")
    endif()
    
    if(CMAKE_BUILD_TYPE STREQUAL "Release")
        set(RUST_BUILD_TYPE  "release")
        set(RUST_BUILD_CMD   "${CARGO}" build --release)
        set(CMAKE_BUILD_TYPE RelWithDebInfo)
    else()
        set(RUST_BUILD_TYPE  "debug")
        set(RUST_BUILD_CMD   "${CARGO}" build)
    endif()
    
    ###                  ###
    # SET COMMON VARIABLES #
    ###                  ###
    
    set(${CMAKE_C_COMPILER_ID}_C_FLAGS)
    set(${CMAKE_BUILD_TYPE}_${CMAKE_C_COMPILER_ID}_C_FLAGS)
    
    # For the CI...
    set(RelWithDebInfo_GNU_C_FLAGS     -Wno-switch)
    set(Release_GNU_C_FLAGS            -Wno-switch)
    set(RelWithDebInfo_Clang_C_FLAGS   -Wno-switch-enum)
    set(Release_Clang_C_FLAGS          -Wno-switch-enum)
    set(RelWithDebInfo_GNU_CXX_FLAGS   $<$<COMPILE_LANGUAGE:CXX>:-Wno-switch)
    set(Release_GNU_CXX_FLAGS          $<$<COMPILE_LANGUAGE:CXX>:-Wno-switch)
    set(RelWithDebInfo_Clang_CXX_FLAGS $<$<COMPILE_LANGUAGE:CXX>:-Wno-switch-enum)
    set(Release_Clang_CXX_FLAGS        $<$<COMPILE_LANGUAGE:CXX>:-Wno-switch-enum)
    set(Debug_GNU_C_FLAGS              -Werror)
    set(Debug_Clang_C_FLAGS            -Werror)
    
    # Common flags, also per compiler
    set(COMMON_C_FLAGS
        -Wall -Wextra
        -Wshadow
        -Wcast-align
        -Wconversion
        -Wsign-conversion
        -Wunused-variable
        -Wmisleading-indentation
        -Wnull-dereference
        -Wdouble-promotion
        -Wformat=2
        -Wignored-qualifiers
    )
    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-covered-switch-default # We migh want to have a default even if everything is covered
        -fcolor-diagnostics         # Colors!
    )
    set(Clang_CXX_FLAGS
        $<$<COMPILE_LANGUAGE:CXX>:-Wno-c++98-compat-pedantic>
        $<$<COMPILE_LANGUAGE:CXX>:-Wno-c++20-compat>
        $<$<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>
        $<$<COMPILE_LANGUAGE:CXX>:-Wno-missing-prototypes>
    )
    set(GNU_C_FLAGS
        -fdiagnostics-color=always
        -Wno-stringop-truncation # WTF gcc with strncat
    )
    
    ###               ###
    # 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(CURL COMPONENTS HTTP HTTPS                   REQUIRED) # tested with 7.74.0
    find_package(Qt6  COMPONENTS Widgets OpenGL OpenGLWidgets REQUIRED) # tested with 6.4.0-1
    
    set(CMAKE_AUTOUIC ON)
    set(CMAKE_AUTOMOC ON)
    set(CMAKE_AUTORCC ON)
    
    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/module_repo_rs.c
        src/module/mpv.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(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}"
        MPV_ENABLE_DEPRECATED=0
    )
    
    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"
    )
    
    qt_add_executable(lektord
        MANUAL_FINALIZATION
        ${lektord_SOURCES}
        ${SQL_GENERATED_FILE}
    )
    add_executable(lkt  ${lkt_SOURCES})
    
    set_property(TARGET lektord PROPERTY CXX_STANDARD 20)
    
    set(MANPAGES_COMMANDS)
    if(GENERATE_MANPAGES)
        message(STATUS "Generating manpages")
        set(MANPAGE_COMMANDS lkt lektord lektor)
        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_include_directories(lkt     PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/inc)
    target_include_directories(lektord PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/inc
        ${CURL_INCLUDE_DIRS}
    )
    
    target_compile_definitions(lkt     PRIVATE ${common_DEFINITIONS})
    target_compile_definitions(lektord PRIVATE ${common_DEFINITIONS}
        QT_DISABLE_DEPRECATED_BEFORE=0x050F00
        QT_NO_CAST_TO_ASCII
        QT_RESTRICTED_CAST_FROM_ASCII
        QTCREATOR_UTILS_STATIC_LIB
    )
    
    target_compile_options(lektord PRIVATE
        ${COMMON_C_FLAGS}
        ${${CMAKE_C_COMPILER_ID}_C_FLAGS}
        ${${CMAKE_CXX_COMPILER_ID}_CXX_FLAGS}
        ${${CMAKE_BUILD_TYPE}_${CMAKE_C_COMPILER_ID}_C_FLAGS}
        ${${CMAKE_BUILD_TYPE}_${CMAKE_CXX_COMPILER_ID}_C_FLAGS}
    )
    target_compile_options(lkt PRIVATE
        ${COMMON_C_FLAGS}
        ${${CMAKE_C_COMPILER_ID}_C_FLAGS}
        ${${CMAKE_CXX_COMPILER_ID}_CXX_FLAGS}
        ${${CMAKE_BUILD_TYPE}_${CMAKE_C_COMPILER_ID}_C_FLAGS}
        ${${CMAKE_BUILD_TYPE}_${CMAKE_CXX_COMPILER_ID}_C_FLAGS}
    )
    
    set_directory_properties(PROPERTIES EP_PREFIX ${CMAKE_BINARY_DIR}/Rust)
    
    ExternalProject_Add(amadeus_rs
        DOWNLOAD_COMMAND  ""
        CONFIGURE_COMMAND ""
        INSTALL_COMMAND   ""
        SOURCE_DIR        "${CMAKE_SOURCE_DIR}/src/rust/amadeus-rs"
        BUILD_COMMAND     ${RUST_BUILD_CMD}
        COMMAND           ${RUST_BUILD_CMD}
        BUILD_BYPRODUCTS  "${CMAKE_SOURCE_DIR}/src/rust/target/${RUST_BUILD_TYPE}/amadeus"
        BUILD_ALWAYS      1
        BUILD_IN_SOURCE   1
    )
    
    ExternalProject_Add(liblektor_rs
        DOWNLOAD_COMMAND  ""
        CONFIGURE_COMMAND ""
        INSTALL_COMMAND   ""
        SOURCE_DIR        "${CMAKE_SOURCE_DIR}/src/rust/liblektor-rs"
        BUILD_COMMAND     ${RUST_BUILD_CMD}
        COMMAND           ${RUST_BUILD_CMD}
        BUILD_BYPRODUCTS  "${CMAKE_SOURCE_DIR}/src/rust/target/${RUST_BUILD_TYPE}/liblektor_rs.a"
        BUILD_ALWAYS      1
        BUILD_IN_SOURCE   1
    )
    
    add_dependencies(lektord liblektor_rs)
    
    target_link_libraries(lektord
        PRIVATE
        "${CMAKE_SOURCE_DIR}/src/rust/target/${RUST_BUILD_TYPE}/liblektor_rs.a"
        ${MPV_LIBRARY}
        ${CMAKE_DL_LIBS}
        ${SQLITE3_LIBRARY}
        ${CURL_LIBRARIES}
        Qt::Widgets
        Qt::OpenGL
        Qt::OpenGLWidgets
    )
    
    ###                    ###
    # THE INSTALL DIRECTIVES #
    ###                    ###
    
    install(PROGRAMS "${CMAKE_SOURCE_DIR}/src/rust/target/${RUST_BUILD_TYPE}/amadeus" TYPE BIN)
    
    install(TARGETS lektord lkt
        RUNTIME # For lektord
        RUNTIME # For lkt
    )
    
    install(FILES
        ${CMAKE_SOURCE_DIR}/src/main/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()
    
    qt_finalize_executable(lektord)