From a2277a972d4c1306393edd0aa89cd6fd22659a10 Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 15 Mar 2019 16:56:28 +0100 Subject: [PATCH] Add CMake buildsystem --- CMakeLists.txt | 171 ++++++++++++++++++++++++++++++++++++++ MinetestMapperGui.in.rc | 37 +++++++++ cmake/getGitVersion.cmake | 39 +++++++++ 3 files changed, 247 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 MinetestMapperGui.in.rc create mode 100644 cmake/getGitVersion.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..f98be86 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,171 @@ +cmake_minimum_required(VERSION 3.12) + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +set(USE_FOLDERS ON) +include(getGitVersion) + +project(MinetestMapperGUI + VERSION ${git_version_major}.${git_version_minor}.${git_version_patch}.${git_commits_since_last_tag} + DESCRIPTION "Graphical userinterface for Minetestmapper" + LANGUAGES CXX) + +message(STATUS "Version: ${PROJECT_VERSION}.") + +if(MSVC_VERSION GREATER_EQUAL 1900) + # MSVC does not support c++ 11 but c++ 14 + set(CMAKE_CXX_STANDARD 14) +else() + set(CMAKE_CXX_STANDARD 11) +endif() +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(SOURCES + main.cpp + mainwindow.cpp + colorlineedit.cpp + geometry.cpp + geometrywidget.cpp + configdialog.cpp + makecolors.cpp + drawmapfigure.cpp + drawmapfiguretablemodel.cpp + figuredelegate.cpp + minetestmapperexe.cpp + colorstxtwizard.cpp +) + +set(HEADERS + mainwindow.h + colorlineedit.h + geometry.h + geometrywidget.h + configdialog.h + makecolors.h + drawmapfigure.h + drawmapfiguretablemodel.h + figuredelegate.h + minetestmapperexe.h + colorstxtwizard.h +) + +set(FORMS + mainwindow.ui + geometrywidget.ui + configdialog.ui +) + +set(RESOURCES + minetestmappergui.qrc +) + +set(TRANSLATIONS + translations/gui_de.ts + translations/gui_en.ts +) + +include(getGitVersion) + +if(${git_commits_since_last_tag} EQUAL 0) + set (PRERELEASE 0) +else() + set (PRERELEASE 1) +endif() + +set(BUILD_BRANCH ${git_current_branch}) +if(BUILD_BRANCH STREQUAL "master") + set (SPECIALBUILD 0) +else() + set (SPECIALBUILD 1) +endif() + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +configure_file(MinetestMapperGui.in.rc MinetestMapperGui.rc) + +source_group("UI Files" FILES ${FORMS}) +find_package(Qt5LinguistTools REQUIRED) +set_source_files_properties(${TRANSLATIONS} PROPERTIES OUTPUT_LOCATION "translations/") +qt5_create_translation(QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${TRANSLATIONS}) +add_executable(MinetestMapperGUI ${SOURCES} ${HEADERS} ${FORMS} ${RESOURCES} ${QM_FILES} ${CMAKE_CURRENT_BINARY_DIR}/MinetestMapperGui.rc) + +find_package(Qt5 COMPONENTS Core Gui Widgets) + +target_link_libraries(MinetestMapperGUI Qt5::Core Qt5::Gui Qt5::Widgets) +if(WIN32) + find_package(Qt5WinExtras CONFIG REQUIRED) + target_link_libraries(MinetestMapperGUI Qt5::WinExtras) + # Get rid of the console window + set_target_properties(MinetestMapperGUI PROPERTIES WIN32_EXECUTABLE TRUE) +endif() + +target_compile_definitions(MinetestMapperGUI PRIVATE GIT_VERSION="${PROJECT_VERSION}") + +if(WIN32) + # Get the location of the qmake exe + get_target_property(qmake_executable Qt5::qmake IMPORTED_LOCATION) + # Get the dir of it + get_filename_component(qt_bin_dir "${qmake_executable}" DIRECTORY) + message(STATUS "qt_bin_dir: ${qt_bin_dir}") + find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${qt_bin_dir}") + message(STATUS "WINDEPLOYQT_EXECUTABLE: ${WINDEPLOYQT_EXECUTABLE}") + add_custom_command(TARGET MinetestMapperGUI POST_BUILD + COMMAND ${WINDEPLOYQT_EXECUTABLE} $ + --dir "${CMAKE_CURRENT_BINARY_DIR}" + --libdir $ + --plugindir $ + --no-compiler-runtime + --no-opengl-sw + --no-angle + WORKING_DIRECTORY ${qt_bin_dir} + COMMENT "Running windeployqt..." + ) + + configure_file(mtmapperenv.bat mtmapperenv.bat COPYONLY) +endif() + +# Installation +############################################################################### + +set (CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION ".") +include (InstallRequiredSystemLibraries) + + +INSTALL(TARGETS MinetestMapperGUI + RUNTIME DESTINATION . + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib +) + +install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/translations/ + DESTINATION "translations" + FILES_MATCHING PATTERN "*.qm" +) +install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/translations/ + DESTINATION "translations" + FILES_MATCHING PATTERN "*.png" +) + +if(WIN32) + #copy required dlls to install dir + install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Release/ + DESTINATION . + CONFIGURATIONS Release + FILES_MATCHING PATTERN "*.dll") + install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/Debug/ + DESTINATION . + CONFIGURATIONS Debug + FILES_MATCHING PATTERN "*.dll") + install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/ + DESTINATION . + CONFIGURATIONS RelWithDebInfo + FILES_MATCHING PATTERN "*.dll") + install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/MinSizeRel/ + DESTINATION . + CONFIGURATIONS RelWithDebInfo + FILES_MATCHING PATTERN "*.dll") +endif(WIN32) + diff --git a/MinetestMapperGui.in.rc b/MinetestMapperGui.in.rc new file mode 100644 index 0000000..6692cc6 --- /dev/null +++ b/MinetestMapperGui.in.rc @@ -0,0 +1,37 @@ +#include + +IDI_ICON1 ICON DISCARDABLE "${CMAKE_CURRENT_SOURCE_DIR}/images/icon.ico" + +VS_VERSION_INFO VERSIONINFO + FILEVERSION ${PROJECT_VERSION_MAJOR},${PROJECT_VERSION_MINOR},${PROJECT_VERSION_PATCH},${PROJECT_VERSION_TWEAK} + PRODUCTVERSION ${CMAKE_PROJECT_VERSION_MAJOR},${CMAKE_PROJECT_VERSION_MINOR},${CMAKE_PROJECT_VERSION_PATCH},${CMAKE_PROJECT_VERSION_TWEAK} + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE VFT2_UNKNOWN + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "04b004b0" + BEGIN + VALUE "CompanyName", "\0" + VALUE "FileDescription", "${PROJECT_DESCRIPTION}\0" + VALUE "FileVersion", "${PROJECT_VERSION}\0" + VALUE "LegalCopyright", "2015-2019 addi; CC BY\0" + VALUE "OriginalFilename", "{PROJECT_NAME}.exe\0" + VALUE "ProductName", "${PROJECT_NAME}\0" + VALUE "ProductVersion", "${CMAKE_PROJECT_VERSION}\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x04b0, 1200 + END + END +/* End of Version info */ + diff --git a/cmake/getGitVersion.cmake b/cmake/getGitVersion.cmake new file mode 100644 index 0000000..1ab81ed --- /dev/null +++ b/cmake/getGitVersion.cmake @@ -0,0 +1,39 @@ +find_package(Git REQUIRED) + +execute_process( + COMMAND "${GIT_EXECUTABLE}" describe --long --dirty --tags --match v[0-9]* + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE git_result + OUTPUT_VARIABLE git_tag + ERROR_VARIABLE git_error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) + +if( NOT git_result EQUAL 0 ) + message( FATAL_ERROR "Failed to execute Git: ${git_error}" ) +endif() + +if( git_tag MATCHES "v([0-9]+).([0-9]+).([0-9]+)-([0-9]+)-g([0-9,a-f]+)(-dirty)?" ) + set( git_version_major "${CMAKE_MATCH_1}" ) + set( git_version_minor "${CMAKE_MATCH_2}" ) + set( git_version_patch "${CMAKE_MATCH_3}" ) + set( git_commits_since_last_tag "${CMAKE_MATCH_4}" ) + set( git_hash "${CMAKE_MATCH_5}" ) + set( git_wip "${CMAKE_MATCH_6}" ) +else() + message( FATAL_ERROR "Git tag isn't valid semantic version: [${git_tag}]" ) +endif() + +execute_process( + COMMAND "${GIT_EXECUTABLE}" rev-parse --abbrev-ref HEAD + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" + RESULT_VARIABLE git_result + OUTPUT_VARIABLE git_current_branch + ERROR_VARIABLE git_error + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE + ) +if( NOT git_result EQUAL 0 ) + message( FATAL_ERROR "Failed to execute Git: ${git_error}" ) +endif()