Skip to content

CMake: integrate additional build system #49

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
183 changes: 183 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,183 @@
cmake_minimum_required(VERSION 3.10.2)
cmake_policy(VERSION 3.10.2)
project(SortFilterProxyModel)

if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
# MinGW: 1) cd; mkdir ./build; cd ./build;
# 2) cmake -G "MinGW Makefiles" <src_path>
# 2) mingw32-make
set(QT_STYLE_OVERRIDE Windows)
# MinGW bases Qt Tree
set(Qt5_DIR "C:/Qt/Qt5.10.0/5.10.0/mingw53_32/lib/cmake/Qt5")
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
# Install adwaita-qt5 (GTK+ style)
set(QT_STYLE_OVERRIDE adwaita)
endif()

# Use our modified modules
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${SORTFILTERPROXYMODEL_SOURCE_DIR}/cmake")
set(SORTFILTERPROXYMODEL_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release CACHE STRING
"Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
endif()

# run moc when necessary:
set(CMAKE_AUTOMOC ON)

# As moc files are generated in the binary dir, tell CMake
# to includes this location
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# run rcc code generator automatically
set(CMAKE_AUTORCC ON)

# enable tests (seated in subdir tests)
enable_testing()

# Bump up warning levels appropriately for clang, gcc & msvc and build in debug mode
if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU"
OR ${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -std=c++11 -fPIC")
#set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG} -g")
#set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE} -O3")
elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL "MSVC")
if (CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
endif()
endif()

message(STATUS "Using C++ Compiler specific attributes for ${CMAKE_CXX_COMPILER_ID}: ${CMAKE_CXX_FLAGS}")
#message(STATUS "Using C++ Compiler specific warnings for ${CMAKE_C_COMPILER_ID}: ${CMAKE_CXX_FLAGS_WARNINGS}")

####
# Makefile Rules
###
if(EXISTS "rules.ninja")
add_custom_target(release COMMAND ${CMAKE_COMMAND} -GNinja -DCMAKE_BUILD_TYPE=Release . WORKING_DIRECTORY .)
add_custom_target(debug COMMAND ${CMAKE_COMMAND} -GNinja -DCMAKE_BUILD_TYPE=Debug . WORKING_DIRECTORY .)
else()
add_custom_target(release COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Release . WORKING_DIRECTORY .)
add_custom_target(debug COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=Debug . WORKING_DIRECTORY .)
endif()

###
# Project Settings: Global
###
set(SORTFILTERPROXYMODEL_VERSION_MAJOR 0)
set(SORTFILTERPROXYMODEL_VERSION_MINOR 2)
set(SORTFILTERPROXYMODEL_VERSION_PATCHLEVEL 0)
set(SORTFILTERPROXYMODEL_VERSION_STRING ${SORTFILTERPROXYMODEL_VERSION_MAJOR}.${SORTFILTERPROXYMODEL_VERSION_MINOR}.${SORTFILTERPROXYMODEL_VERSION_PATCHLEVEL})

message(STATUS "${project}: global definitions:")
message(STATUS " SORTFILTERPROXYMODEL_VERSION_MAJOR='${SORTFILTERPROXYMODEL_VERSION_MAJOR}'")
message(STATUS " SORTFILTERPROXYMODEL_VERSION_MINOR='${SORTFILTERPROXYMODEL_VERSION_MINOR}'")
message(STATUS " SORTFILTERPROXYMODEL_VERSION_PATCHLEVEL='${SORTFILTERPROXYMODEL_VERSION_PATCHLEVEL}'")
message(STATUS " SORTFILTERPROXYMODEL_VERSION_STRING='${SORTFILTERPROXYMODEL_VERSION_STRING}'")
message(STATUS " Qt5_DIR: ${Qt5_DIR}")
message(STATUS " QT_STYLE_OVERRIDE: ${QT_STYLE_OVERRIDE}")

set(SORTFILTERPROXYMODEL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin")
set(SORTFILTERPROXYMODEL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib")
set(SORTFILTERPROXYMODEL_HEADER_DIR "${CMAKE_INSTALL_PREFIX}/inclde/${project}")
set(SORTFILTERPROXYMODEL_PLUGINS_DIR "${CMAKE_INSTALL_PREFIX}/etc/${project}/plugins")
set(SORTFILTERPROXYMODEL_DOC_DIR "${CMAKE_INSTALL_PREFIX}/share/doc")
set(SORTFILTERPROXYMODEL_LOCAL_DIR "${CMAKE_INSTALL_PREFIX}/share/locale")

if(AQBANKING_ENABLE_DEV_OPTIONS)
set(CPACK_PACKAGE_INSTALL_DIRECTORY "SortFilterProxyModel")
set(CPACK_PACKAGE_VENDOR "")
set(CPACK_PACKAGE_CONTACT "http://")
set(CPACK_PACKAGE_VERSION_MAJOR ${SORTFILTERPROXYMODEL_VERSION_MAJOR})
set(CPACK_PACKAGE_VERSION_MINOR ${SORTFILTERPROXYMODEL_VERSION_MINOR})
set(CPACK_PACKAGE_VERSION_DATABASE ${SORTFILTERPROXYMODEL_VERSION_DATABASE})
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
set(CPACK_PACKAGE_VERSION "${AQBANKING_VERSION}")
include(CPack)
endif()

###
# Project Settings: pre-processor
###
if(NOT CMAKE_BUILD_TYPE MATCHES "Debug")
string(APPEND CMAKE_C_FLAGS " -D_FORTIFY_SOURCE=2")
endif()

add_definitions(
"-DQT_SYLE_OVERRIDE")

get_directory_property(DirDefs COMPILE_DEFINITIONS)
message(STATUS "SortFilterProxyModel: active pre-processor definitions:")
foreach(d ${DirDefs})
message( STATUS " " ${d})
endforeach()

#feature_summary(INCLUDE_QUIET_PACKAGES WHAT ALL)
if (NOT DEFINED SortFilterProxyModule_SOURCE_DIR)
# sources in {CMAKE_CURRENT_SOURCE_DIR} include headers seated in given subdirs
set(SortFilterProxyModule_SOURCE_DIR
${CMAKE_CURRENT_SOURCE_DIR})
include_directories(AFTER ${SortFilterProxyModule_SOURCE_DIR})
message(STATUS "Project Source-Dir: ${SortFilterProxyModule_SOURCE_DIR}")
endif()

###
# HEADERS / SOURCES
###
set(sortfilterproxymodel_HEADERS
qqmlsortfilterproxymodel.h
filter.h
sorter.h
proxyrole.h)

set(sortfilterproxymodel_SOURCES
qqmlsortfilterproxymodel.cpp
filter.cpp
sorter.cpp
proxyrole.cpp)

###
# LIBRARY
###
# Find QT5 libraries
find_package(Qt5 COMPONENTS Qml Core REQUIRED)

# Qt libraries
set(sortfilterproxymodel_LIBRARIES
Qt5::Core
Qt5::Qml)

# Object library
add_library(sortfilterproxymodel OBJECT
${sortfilterproxymodel_SOURCES})

# include needed QT-Headers (they are referenced by MOC)
target_include_directories(sortfilterproxymodel
PUBLIC
#${sortfilterproxymodel_LIBRARIES}
$<TARGET_PROPERTY:Qt5::Core,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:Qt5::Qml,INTERFACE_INCLUDE_DIRECTORIES>
)

###
# Project Structure: subdirectories
###
add_subdirectory(docs)
add_subdirectory(tests)

set("SORTFILTERPROXYMODEL_DOC"
LICENSE
SortFilterProxyModel.pri
README.md)

###
# Installing
###
install(FILES ${SORTFILTERPROXYMODEL_DOC}
COMPONENT ${project}
DESTINATION ${SORTFILTERPROXYMODEL_DOC_DIR}/${project}
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
58 changes: 58 additions & 0 deletions docs/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# Qt >=5.7 requires C++11, which will be implicitly checked with CMake >3.1.0
cmake_minimum_required(VERSION 3.10.2 FATAL_ERROR)
cmake_policy(VERSION 3.10.2)

set(docs_SOURCES
index.html
qml-allof.html
qml-allof-members.html
qml-anyof.html
qml-anyof-members.html
qml-expressionfilter.html
qml-expressionfilter-members.html
qml-expressionrole.html
qml-expressionrole-members.html
qml-expressionsorter.html
qml-expressionsorter-members.html
qml-filter.html
qml-filter-members.html
qml-indexfilter.html
qml-indexfilter-members.html
qml-joinrole.html
qml-joinrole-members.html
qml-proxyrole.html
qml-proxyrole-members.html
qml-rangefilter.html
qml-rangefilter-members.html
qml-regexpfilter.html
qml-regexpfilter-members.html
qml-rolefilter.html
qml-rolefilter-members.html
qml-rolesorter.html
qml-rolesorter-members.html
qml-sorter.html
qml-sorter-members.html
qml-sortfilterproxymodel.html
qml-sortfilterproxymodel-members.html
qml-stringsorter.html
qml-stringsorter-members.html
qml-switchrole.html
qml-switchrole-members.html
qml-valuefilter.html
qml-valuefilter-members.html
sortfilterproxymodel.index)

###
# Project Structure: subdirectories
###
add_subdirectory(style)


###
# Installing
###
install(FILES ${docs_SOURCES}
COMPONENT ${project}
DESTINATION ${SORTFILTERPROXYMODEL_DOC_DIR}/${project}/
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)

16 changes: 16 additions & 0 deletions docs/style/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Qt >=5.7 requires C++11, which will be implicitly checked with CMake >3.1.0
cmake_minimum_required(VERSION 3.10.2 FATAL_ERROR)
cmake_policy(VERSION 3.10.2)

set(doc_SOURCES
offline.css)

###
# Installing
###
install(CODE "message(\"Installing Documentation: ...\")")
install(FILES ${doc_SOURCES}
COMPONENT ${project}
DESTINATION ${SORTFILTERPROXYMODEL_DOC_DIR}/${project}/style
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)

116 changes: 116 additions & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
# Qt >=5.7 requires C++11, which will be implicitly checked with CMake >3.1.0
cmake_minimum_required(VERSION 3.10.2 FATAL_ERROR)
cmake_policy(VERSION 3.10.2)

set(SORTFILTERPROXYMODEL_BIN_DIR bin)
set(SORTFILTERPROXYMODEL_QML_DIR qmldir)

# Set target complile flags
#get_target_property(QtTestFLAGS ${tst_sortfilterproxymodel} COMPILE_FLAGS)
if(QtTestFLAGS STREQUAL "QtTest_FLAGS-NOTFOUND")
SET(QtTestFLAGS "") # set to empty string
else()
# a space to cleanly separate from existing content
SET(QtTestFlags "${QtTestFLAGS} ")
endif()
# append our values
SET(QtTestFLAGS "${QtTestFLAGS}warn_on qmltestcase qml_debug no_keywords" )
set_target_properties(${tst_sortfilterproxymodel} PROPERTIES COMPILE_FLAGS ${QtTestFLAGS} )
message(STATUS "QtTest Compiler flags for target 'tst_sortfilterproxymodel': '${QtTestFLAGS}'")

add_definitions(
#"-DQT_QML_DEBUG"
"-DQUICK_TEST_SOURCE_DIR=\"${CMAKE_CURRENT_BINARY_DIR}\"")

# Find QT5 libraries
#find_package(Qt5 COMPONENTS Test Widgets Gui QuickTest Quick Qml REQUIRED)
find_package(Qt5 COMPONENTS QuickTest Quick Qml REQUIRED)

INCLUDE_DIRECTORIES(${SortFilterProxyModule_SOURCE_DIR} ${Qt5_INCLUDE_DIR} )

set(test_quickpages_SOURCES
tst_rangefilter.qml
tst_indexfilter.qml
tst_sourceroles.qml
tst_sorters.qml
tst_helpers.qml
tst_builtins.qml
tst_rolesorter.qml
tst_stringsorter.qml
tst_proxyroles.qml
tst_joinrole.qml
tst_switchrole.qml
tst_expressionrole.qml)

###
# binary creation
###
set(test_sortfilterproxymodel_HEADERS
indexsorter.cpp
testroles.cpp)

set(test_sortfilterproxymodel_SOURCES
indexsorter.cpp
testroles.cpp
tst_sortfilterproxymodel.cpp)

add_executable(test_sortfilterproxymodel
${test_sortfilterproxymodel_SOURCES})

# Qt test libraries
set(test_LIBRARIES
Qt5::QuickTest
Qt5::Qml
Qt5::Core)

# include needed QT-Headers (and referenced for MOC)
target_include_directories(test_sortfilterproxymodel
PUBLIC
${test_LIBRARIES})

target_link_libraries(test_sortfilterproxymodel
$<TARGET_OBJECTS:sortfilterproxymodel>
${test_LIBRARIES})

foreach(page ${test_quickpages_SOURCES})
add_custom_command(TARGET test_sortfilterproxymodel POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
${CMAKE_CURRENT_SOURCE_DIR}/${page}
${CMAKE_CURRENT_BINARY_DIR}/
COMMENT "Copying QtQuick 'Source-Pages (qml)' to '${CMAKE_CURRENT_BINARY_DIR}'")
endforeach(page)

SET_TARGET_PROPERTIES(
test_sortfilterproxymodel
PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

###
# Tests
###
#set(TestTarget SortFilterProxyModel)
set(TestTarget test_sortfilterproxymodel)

add_test(NAME ${TestTarget}
#CONFIGURATIONS [Debug|Release]
COMMAND ./${TestTarget})

add_custom_command(
TARGET ${TestTarget}
COMMENT "Run tests"
POST_BUILD
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
#COMMAND ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION> -R "^${TestTarget}$" --output-on-failures
COMMAND ${TestTarget})

###
# Installing
###
#install(CODE "message(\"Installing TARGETS: ...\")")
#install(TARGETS test_sortfilterproxymodel
# COMPONENT Test_SortFilterProxyModel
# RUNTIME DESTINATION ${SORTFILTERPROXYMODEL_BIN_DIR} )

#install(TARGETS test_quickpages_SOURCES
# COMPONENT Test_SortFilterProxyModel
# RUNTIME DESTINATION ${SORTFILTERPROXYMODEL_QML_DIR} )
6 changes: 5 additions & 1 deletion tests/tst_stringsorter.qml
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,11 @@ Item {
},
StringSorter {
property string tag: "doNotIgnorePunctuation"
property var expectedValues: ["aa", "a-a", "b.c", "b-b", "bc", "b-c"]
// depends on ICU usage (TODO: howto check on compiletime?)
// with ICU support: (Qt with ICU configured)
//property var expectedValues: ["a-a", "aa", "b.c", "b-b", "bc", "b-c"]
// without ICU support (default: Linux, Apple platforms):
property var expectedValues: ["a-a", "aa", "b-b", "b-c", "b.c", "bc"]
roleName: "punctuationRole"
ignorePunctation: false
}
Expand Down