aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
authorBlack Hat <bhat@encom.eu.org>2019-09-26 22:22:36 -0700
committerBlack Hat <bhat@encom.eu.org>2019-09-26 22:22:36 -0700
commit363cf452bcdbaf6ff1cf94a83ca66cbb31122346 (patch)
treec64c8fda885e4e1785130e8ee3e7c47fd18cbf67 /CMakeLists.txt
parent412e2cf19449e73aa7da729e9c5de6502687aade (diff)
parent944653463fe4134c82d85e2d01e2bc0fa43fd727 (diff)
downloadlibquotient-363cf452bcdbaf6ff1cf94a83ca66cbb31122346.tar.gz
libquotient-363cf452bcdbaf6ff1cf94a83ca66cbb31122346.zip
Merge branch 'master' of https://github.com/quotient-im/libQuotient into
bhat-libqtolm-update
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt159
1 files changed, 99 insertions, 60 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e0003062..951ef8c9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,9 +1,12 @@
-cmake_minimum_required(VERSION 3.1)
+cmake_minimum_required(VERSION 3.10)
+if (POLICY CMP0092)
+cmake_policy(SET CMP0092 NEW)
+endif()
set(API_VERSION "0.6")
-project(qmatrixclient VERSION "${API_VERSION}.0" LANGUAGES CXX)
+project(Quotient VERSION "${API_VERSION}.0" LANGUAGES CXX)
-option(QMATRIXCLIENT_INSTALL_EXAMPLE "install qmc-example application" ON)
+option(QUOTIENT_INSTALL_EXAMPLE "install qmc-example application" ON)
include(CheckCXXCompilerFlag)
if (NOT WIN32)
@@ -34,18 +37,22 @@ if (NOT CMAKE_INSTALL_INCLUDEDIR)
set(CMAKE_INSTALL_INCLUDEDIR "include")
endif()
-set(CMAKE_CXX_STANDARD 14)
-
-foreach (FLAG all "" pedantic extra error=return-type no-unused-parameter no-gnu-zero-variadic-macro-arguments)
- CHECK_CXX_COMPILER_FLAG("-W${FLAG}" WARN_${FLAG}_SUPPORTED)
- if ( WARN_${FLAG}_SUPPORTED AND NOT CMAKE_CXX_FLAGS MATCHES "(^| )-W?${FLAG}($| )")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W${FLAG}")
- endif ()
-endforeach ()
+if (MSVC)
+ add_compile_options(/EHsc /W4
+ /wd4100 /wd4127 /wd4242 /wd4244 /wd4245 /wd4267 /wd4365 /wd4456 /wd4459
+ /wd4464 /wd4505 /wd4514 /wd4571 /wd4619 /wd4623 /wd4625 /wd4626 /wd4706
+ /wd4710 /wd4774 /wd4820 /wd4946 /wd5026 /wd5027)
+else()
+ foreach (FLAG all "" pedantic extra error=return-type no-unused-parameter
+ no-gnu-zero-variadic-macro-arguments)
+ CHECK_CXX_COMPILER_FLAG("-W${FLAG}" WARN_${FLAG}_SUPPORTED)
+ if ( WARN_${FLAG}_SUPPORTED AND NOT CMAKE_CXX_FLAGS MATCHES "(^| )-W?${FLAG}($| )")
+ add_compile_options(-W${FLAG})
+ endif ()
+ endforeach ()
+endif()
-# Qt 5.6+ is the formal requirement but for the sake of supporting UBPorts
-# upstream Qt 5.4 is required.
-find_package(Qt5 5.4.1 REQUIRED Network Gui Multimedia)
+find_package(Qt5 5.9 REQUIRED Network Gui Multimedia)
get_filename_component(Qt5_Prefix "${Qt5_DIR}/../../../.." ABSOLUTE)
if ((NOT DEFINED USE_INTREE_LIBQOLM OR USE_INTREE_LIBQOLM)
@@ -67,15 +74,21 @@ if (NOT USE_INTREE_LIBQOLM)
endif ()
if (GTAD_PATH)
- get_filename_component(ABS_GTAD_PATH "${GTAD_PATH}" ABSOLUTE)
+ get_filename_component(ABS_GTAD_PATH "${GTAD_PATH}" REALPATH)
endif ()
if (MATRIX_DOC_PATH)
- get_filename_component(ABS_API_DEF_PATH "${MATRIX_DOC_PATH}/api" ABSOLUTE)
+ get_filename_component(ABS_API_DEF_PATH "${MATRIX_DOC_PATH}/api" REALPATH)
endif ()
+if (ABS_GTAD_PATH AND ABS_API_DEF_PATH)
+ if (NOT CLANG_FORMAT)
+ set(CLANG_FORMAT clang-format)
+ endif()
+ get_filename_component(ABS_CLANG_FORMAT "${CLANG_FORMAT}" PROGRAM)
+endif()
message( STATUS )
message( STATUS "=============================================================================" )
-message( STATUS " libqmatrixclient Build Information" )
+message( STATUS " ${PROJECT_NAME} Build Information" )
message( STATUS "=============================================================================" )
message( STATUS "Version: ${PROJECT_VERSION}, API version: ${API_VERSION}")
if (CMAKE_BUILD_TYPE)
@@ -84,10 +97,15 @@ endif(CMAKE_BUILD_TYPE)
message( STATUS "Using compiler: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}" )
message( STATUS "Install Prefix: ${CMAKE_INSTALL_PREFIX}" )
message( STATUS "Using Qt ${Qt5_VERSION} at ${Qt5_Prefix}" )
-if (MATRIX_DOC_PATH AND GTAD_PATH)
- message( STATUS "Generating API stubs enabled" )
+if (ABS_API_DEF_PATH AND ABS_GTAD_PATH)
+ message( STATUS "Generating API stubs enabled (use --target update-api)" )
message( STATUS " Using GTAD at ${ABS_GTAD_PATH}" )
message( STATUS " Using API files at ${ABS_API_DEF_PATH}" )
+ if (ABS_CLANG_FORMAT)
+ message( STATUS "clang-format is at ${ABS_CLANG_FORMAT}")
+ else ()
+ message( STATUS "${CLANG_FORMAT} is NOT FOUND; API files won't be reformatted")
+ endif ()
endif ()
find_package(Git)
if (USE_INTREE_LIBQOLM)
@@ -107,7 +125,7 @@ message( STATUS "===============================================================
message( STATUS )
# Set up source files
-set(libqmatrixclient_SRCS
+set(lib_SRCS
lib/networkaccessmanager.cpp
lib/connectiondata.cpp
lib/connection.cpp
@@ -148,11 +166,24 @@ set(libqmatrixclient_SRCS
)
set(CSAPI_DIR csapi)
-set(FULL_CSAPI_DIR lib/${CSAPI_DIR})
-set(FULL_CSAPI_SRC_DIR ${ABS_API_DEF_PATH}/client-server)
set(ASAPI_DEF_DIR application-service/definitions)
set(ISAPI_DEF_DIR identity/definitions)
+
+foreach (D ${CSAPI_DIR} ${CSAPI_DIR}/definitions
+ ${CSAPI_DIR}/definitions/wellknown ${ASAPI_DEF_DIR} ${ISAPI_DEF_DIR})
+ aux_source_directory(lib/${D} api_SRCS)
+endforeach()
+
+# Make no mistake: CMake cannot run gtad first and then populate the list of
+# resulting api_SRCS files. In other words, placing the above foreach after
+# the custom targets definition won't bring the desired result:
+# CMake will execute it at cmake invocation and gtad will only run later
+# when building the update-api target. If you see that gtad has created
+# new files you have to re-run cmake.
+# TODO: check `file(GLOB_RECURSE ... CONFIGURE_DEPENDS)` (from CMake 3.14)
if (MATRIX_DOC_PATH AND GTAD_PATH)
+ set(FULL_CSAPI_DIR lib/${CSAPI_DIR})
+ set(FULL_CSAPI_SRC_DIR ${ABS_API_DEF_PATH}/client-server)
file(GLOB_RECURSE API_DEFS RELATIVE ${PROJECT_SOURCE_DIR}
${FULL_CSAPI_SRC_DIR}/*.yaml
${ABS_API_DEF_PATH}/${ASAPI_DEF_DIR}/*.yaml
@@ -170,40 +201,48 @@ if (MATRIX_DOC_PATH AND GTAD_PATH)
${API_DEFS}
VERBATIM
)
+ if (ABS_CLANG_FORMAT)
+ # TODO: list(TRANSFORM) is available from CMake 3.12
+ foreach (S ${api_SRCS})
+ string (REGEX REPLACE ".cpp$" ".h" H ${S})
+ list(APPEND api_HDRS ${H})
+ endforeach()
+ set(CLANG_FORMAT_ARGS -i -sort-includes ${CLANG_FORMAT_ARGS})
+ add_custom_command(TARGET update-api POST_BUILD
+ COMMAND ${ABS_CLANG_FORMAT} ${CLANG_FORMAT_ARGS} ${api_SRCS}
+ COMMAND ${ABS_CLANG_FORMAT} ${CLANG_FORMAT_ARGS} ${api_HDRS}
+ WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+ VERBATIM
+ COMMENT Formatting files
+ )
+ endif()
endif()
-aux_source_directory(${FULL_CSAPI_DIR} libqmatrixclient_job_SRCS)
-aux_source_directory(${FULL_CSAPI_DIR}/definitions libqmatrixclient_csdef_SRCS)
-aux_source_directory(${FULL_CSAPI_DIR}/definitions/wellknown libqmatrixclient_cswellknown_SRCS)
-aux_source_directory(lib/${ASAPI_DEF_DIR} libqmatrixclient_asdef_SRCS)
-aux_source_directory(lib/${ISAPI_DEF_DIR} libqmatrixclient_isdef_SRCS)
-
set(example_SRCS examples/qmc-example.cpp)
-add_library(QMatrixClient ${libqmatrixclient_SRCS}
- ${libqmatrixclient_job_SRCS} ${libqmatrixclient_csdef_SRCS}
- ${libqmatrixclient_cswellknown_SRCS}
- ${libqmatrixclient_asdef_SRCS} ${libqmatrixclient_isdef_SRCS})
-set_property(TARGET QMatrixClient PROPERTY VERSION "${PROJECT_VERSION}")
-set_property(TARGET QMatrixClient PROPERTY SOVERSION ${API_VERSION} )
-set_property(TARGET QMatrixClient PROPERTY
- INTERFACE_QMatrixClient_MAJOR_VERSION ${API_VERSION})
-set_property(TARGET QMatrixClient APPEND PROPERTY
- COMPATIBLE_INTERFACE_STRING QMatrixClient_MAJOR_VERSION)
-
-target_include_directories(QMatrixClient PUBLIC
+add_library(${PROJECT_NAME} ${lib_SRCS} ${api_SRCS})
+set_target_properties(${PROJECT_NAME} PROPERTIES
+ VERSION "${PROJECT_VERSION}"
+ SOVERSION ${API_VERSION}
+ INTERFACE_${PROJECT_NAME}_MAJOR_VERSION ${API_VERSION}
+ CXX_STANDARD 17
+)
+set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY
+ COMPATIBLE_INTERFACE_STRING ${PROJECT_NAME}_MAJOR_VERSION)
+
+target_include_directories(${PROJECT_NAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/lib>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)
-target_link_libraries(QMatrixClient QtOlm Qt5::Core Qt5::Network Qt5::Gui Qt5::Multimedia)
+target_link_libraries(${PROJECT_NAME} QtOlm Qt5::Core Qt5::Network Qt5::Gui Qt5::Multimedia)
add_executable(qmc-example ${example_SRCS})
-target_link_libraries(qmc-example Qt5::Core QMatrixClient)
-configure_file(QMatrixClient.pc.in ${CMAKE_CURRENT_BINARY_DIR}/QMatrixClient.pc @ONLY NEWLINE_STYLE UNIX)
+target_link_libraries(qmc-example Qt5::Core Quotient)
+configure_file(Quotient.pc.in ${CMAKE_CURRENT_BINARY_DIR}/Quotient.pc @ONLY NEWLINE_STYLE UNIX)
# Installation
-install(TARGETS QMatrixClient EXPORT QMatrixClientTargets
+install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
@@ -215,37 +254,37 @@ include(CMakePackageConfigHelpers)
# NB: SameMajorVersion doesn't really work yet, as we're within 0.x trail.
# Maybe consider jumping the gun and releasing 1.0, as semver advises?
write_basic_package_version_file(
- "${CMAKE_CURRENT_BINARY_DIR}/QMatrixClient/QMatrixClientConfigVersion.cmake"
+ "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/QuotientConfigVersion.cmake"
COMPATIBILITY SameMajorVersion
)
-export(PACKAGE QMatrixClient)
-export(EXPORT QMatrixClientTargets
- FILE "${CMAKE_CURRENT_BINARY_DIR}/QMatrixClient/QMatrixClientTargets.cmake")
-configure_file(cmake/QMatrixClientConfig.cmake
- "${CMAKE_CURRENT_BINARY_DIR}/QMatrixClient/QMatrixClientConfig.cmake"
+export(PACKAGE ${PROJECT_NAME})
+export(EXPORT ${PROJECT_NAME}Targets
+ FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/${PROJECT_NAME}Targets.cmake")
+configure_file(cmake/QuotientConfig.cmake
+ "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/QuotientConfig.cmake"
COPYONLY
)
-set(ConfigFilesLocation "${CMAKE_INSTALL_LIBDIR}/cmake/QMatrixClient")
-install(EXPORT QMatrixClientTargets
- FILE QMatrixClientTargets.cmake DESTINATION ${ConfigFilesLocation})
+set(ConfigFilesLocation "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
+install(EXPORT ${PROJECT_NAME}Targets
+ FILE ${PROJECT_NAME}Targets.cmake DESTINATION ${ConfigFilesLocation})
-install(FILES cmake/QMatrixClientConfig.cmake
- "${CMAKE_CURRENT_BINARY_DIR}/QMatrixClient/QMatrixClientConfigVersion.cmake"
+install(FILES cmake/QuotientConfig.cmake
+ "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}/QuotientConfigVersion.cmake"
DESTINATION ${ConfigFilesLocation}
)
-# Only available from CMake 3.7; reserved for future use
-#install(EXPORT_ANDROID_MK QMatrixClientTargets DESTINATION share/ndk-modules)
+install(EXPORT_ANDROID_MK QuotientTargets DESTINATION share/ndk-modules)
if (WIN32)
install(FILES mime/packages/freedesktop.org.xml DESTINATION mime/packages)
endif (WIN32)
-if (QMATRIXCLIENT_INSTALL_EXAMPLE)
+if (QUOTIENT_INSTALL_EXAMPLE)
install(TARGETS qmc-example RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
-endif (QMATRIXCLIENT_INSTALL_EXAMPLE)
+endif (QUOTIENT_INSTALL_EXAMPLE)
if (UNIX AND NOT APPLE)
- install(FILES ${CMAKE_CURRENT_BINARY_DIR}/QMatrixClient.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
+ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/Quotient.pc
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
endif()