Sélectionner une révision Git
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)