Skip to content

Instantly share code, notes, and snippets.

@ijinjay
Last active September 27, 2019 07:57
Show Gist options
  • Save ijinjay/696ef075e68c23357cb2844254e22985 to your computer and use it in GitHub Desktop.
Save ijinjay/696ef075e68c23357cb2844254e22985 to your computer and use it in GitHub Desktop.
Toou2D cmake
# project setup
# ******************************************************************************
cmake_minimum_required(VERSION 3.0)
set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_CURRENT_SOURCE_DIR}/cmake")
include(Functions)
set(PROJECT_NAME "Toou2DExample")
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
set(CMAKE_DEBUG_POSTFIX "d")
project(${PROJECT_NAME})
# project directories
# ******************************************************************************
#set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/install)
set(ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
set(PROJECT_INSTALL_DIR ${CMAKE_INSTALL_PREFIX})
set(BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/bin)
message(STATUS " Project directories:")
message(STATUS " - project source dir: " ${SOURCE_DIR})
message(STATUS " - project binary dir: " ${BINARY_DIR})
message(STATUS " - project build dir: " ${BUILD_DIR})
message(STATUS " - project install dir: " ${PROJECT_INSTALL_DIR})
# output directories
# ******************************************************************************
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${BUILD_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${BUILD_DIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BUILD_DIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${BUILD_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${BUILD_DIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${BUILD_DIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${BUILD_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${BUILD_DIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${BUILD_DIR})
# moc
# ******************************************************************************
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
# project meta information
# ******************************************************************************
set(Toou2D_VERSION_MAJOR 1)
set(Toou2D_VERSION_MINOR 0)
set(Toou2D_VERSION_PATCH 1)
set(Toou2D_ORG_NAME ijinjay)
set(Toou2D_ORG_DOMAIN org)
message(STATUS "> Configure project: ${PROJECT_NAME} (v${Toou2D_VERSION_MAJOR}.${Toou2D_VERSION_MINOR}.${Toou2D_VERSION_PATCH})")
# apple rpath
# ******************************************************************************
if(APPLE)
set(CMAKE_SKIP_BUILD_RPATH false)
set(CMAKE_BUILD_WITH_INSTALL_RPATH false)
set(CMAKE_INSTALL_RPATH "@executable_path/../Frameworks")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH true)
message(STATUS " rpath: " ${CMAKE_INSTALL_RPATH})
endif()
# 构建Toou2D库
set(Toou2D_QT_VERSION "5.11.1" CACHE STRING "Qt Version")
set(Toou2D_QT_MODULES Core Gui Widgets Quick Qml Concurrent Network DBus PrintSupport Svg)
if(UNIX AND NOT APPLE)
set(Toou2D_QT_MODULES ${Toou2D_QT_MODULES} X11Extras)
endif()
# 查找QT5,设置定义
find_package(Qt5 ${Toou2D_QT_VERSION} EXACT CONFIG REQUIRED ${Toou2D_QT_MODULES})
add_definitions(${QT_DEFINITIONS})
add_definitions(-DUSE_INSTALL_TARGET)
add_definitions(-DQT_DEPRECATED_WARNINGS)
add_definitions(-DQT_NO_WARNING_OUTPUT)
add_definitions(-DVERSION_IN="1.0.1")
add_definitions(-DURI_STR="Toou2D")
# 添加源文件
AddLibrarySources("${CMAKE_CURRENT_SOURCE_DIR}/src-toou2d" "Toou2D" list_lib_src list_lib_hdr)
AddLibrarySources("${CMAKE_CURRENT_SOURCE_DIR}/src-toou2d/controls/gadget" "controls\\gadget" list_lib_src list_lib_hdr)
AddLibrarySources("${CMAKE_CURRENT_SOURCE_DIR}/src-toou2d/controls/interface" "controls\\interface" list_lib_src list_lib_hdr)
AddLibrarySources("${CMAKE_CURRENT_SOURCE_DIR}/src-toou2d/theme" "theme" list_lib_src list_lib_hdr)
# 设置库
# ******************************************************************************
set (LIB_NAME Toou2D)
add_library (${LIB_NAME} SHARED ${list_lib_src} ${list_lib_hdr} ${CMAKE_CURRENT_SOURCE_DIR}/src-toou2d/t2d_res.qrc)
set_target_properties(${LIB_NAME} PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${BUILD_DIR}/${LIB_NAME})
set_target_properties(${LIB_NAME} PROPERTIES PUBLIC_HEADER "${list_lib_hdr}")
set(LINK_LIBRARIES PUBLIC Qt5::Core PUBLIC Qt5::Widgets PUBLIC Qt5::Gui PUBLIC Qt5::Quick PUBLIC Qt5::Qml PUBLIC Qt5::Concurrent PUBLIC Qt5::Svg)
if(UNIX AND NOT APPLE)
set(LINK_LIBRARIES ${LINK_LIBRARIES} PUBLIC Qt5::X11Extras)
endif()
# 链接库
target_link_libraries(${LIB_NAME} ${LINK_LIBRARIES})
set(LIB_HDR "${list_lib_hdr}")
# 构建可执行目标
# ******************************************************************************
AddApplicationSources("${SOURCE_DIR}/example" "Example" list_app_src)
# setup target
# ******************************************************************************
if(APPLE)
set(MACOSX_BUNDLE_BUNDLE_VERSION 1)
set(MACOSX_BUNDLE_LONG_VERSION_STRING ${Toou2D_VERSION_MAJOR}.${Toou2D_VERSION_MINOR}.${Toou2D_VERSION_PATCH})
set(MACOSX_BUNDLE_SHORT_VERSION_STRING ${Toou2D_VERSION_MAJOR}.${Toou2D_VERSION_MINOR}.${Toou2D_VERSION_PATCH})
set(MACOSX_BUNDLE_ICON_FILE ${PROJECT_NAME}.icns)
set(MACOSX_BUNDLE_BUNDLE_NAME ${PROJECT_NAME})
set(MACOSX_BUNDLE_RESOURCES ${BUILD_DIR}/${PROJECT_NAME}.app/Contents/Resources)
set(MACOSX_BUNDLE_ICON ${ROOT_DIR}/icons/develop/${MACOSX_BUNDLE_ICON_FILE})
add_executable(${PROJECT_NAME} MACOSX_BUNDLE ${list_app_src} ${MACOSX_BUNDLE_ICON} ${SOURCE_DIR}/example/qml.qrc)
else()
add_executable(${PROJECT_NAME} ${list_app_src} ${SOURCE_DIR}/example/qml.qrc)
endif()
# c++11
# ******************************************************************************
if(${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} GREATER 3.0)
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 11)
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
else()
if(APPLE)
list(APPEND CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y -stdlib=libc++")
endif()
if(UNIX AND NOT APPLE)
list(APPEND CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
endif()
endif()
# configure files
# ******************************************************************************
configure_file(${ROOT_DIR}/cmake/meta_Toou2D.hpp.in ${BINARY_DIR}/meta_Toou2D.hpp)
if(APPLE)
configure_file(${ROOT_DIR}/cmake/info.plist.in ${BINARY_DIR}/info.plist)
endif()
# target properties
# ******************************************************************************
if(APPLE)
set_target_properties(${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${BINARY_DIR}/info.plist)
endif()
# includes
# ******************************************************************************
target_include_directories(${PROJECT_NAME} PUBLIC ${BINARY_DIR})
# copy resources
# ******************************************************************************
get_target_property(_qmake_executable Qt5::qmake IMPORTED_LOCATION)
get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY)
find_program(DEPLOYQT_EXECUTABLE NAMES windeployqt macdeployqt HINTS "${_qt_bin_dir}")
set(qmake ${_qmake_executable})
execute_process(
COMMAND ${qmake} -query QT_INSTALL_HEADERS
OUTPUT_VARIABLE QT_INSTALL_HEADERS
OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(
COMMAND ${qmake} -query QT_INSTALL_LIBS
OUTPUT_VARIABLE QT_INSTALL_LIBS
OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(
COMMAND ${qmake} -query QT_INSTALL_BINS
OUTPUT_VARIABLE QT_INSTALL_BINS
OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(
COMMAND ${qmake} -query QT_INSTALL_QML
OUTPUT_VARIABLE QT_INSTALL_QML
OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(
COMMAND ${qmake} -query QT_INSTALL_PREFIX
OUTPUT_VARIABLE QT_INSTALL_PREFIX
OUTPUT_STRIP_TRAILING_WHITESPACE
)
message("${QT_INSTALL_HEADERS}")
message("${QT_INSTALL_LIBS}")
message("${QT_INSTALL_BINS}")
message("${QT_INSTALL_QML}")
message("${QT_INSTALL_PREFIX}")
if(APPLE)
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${MACOSX_BUNDLE_RESOURCES})
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${MACOSX_BUNDLE_ICON} ${MACOSX_BUNDLE_RESOURCES})
# add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${ROOT_DIR}/example" ${BUILD_DIR}/${PROJECT_NAME}.app/Contents/Resources)
add_custom_command(TARGET ${PROJECT_NAME}
POST_BUILD
COMMAND ${DEPLOYQT_EXECUTABLE} "$<TARGET_BUNDLE_DIR:${PROJECT_NAME}>" -qmldir="${SOURCE_DIR}/example"
)
add_custom_command( TARGET ${LIB_NAME}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${SOURCE_DIR}/src-toou2d/build-preset/plugin.qmltypes $<TARGET_FILE_DIR:${LIB_NAME}>/plugin.qmltypes
)
add_custom_command( TARGET ${LIB_NAME}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy ${SOURCE_DIR}/src-toou2d/build-preset/qmldir $<TARGET_FILE_DIR:${LIB_NAME}>/qmldir
)
else()
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${ROOT_DIR}/example" ${BUILD_DIR}/Resources)
# add_custom_target(CopyResources ALL COMMAND ${CMAKE_COMMAND} -E copy_directory "${ROOT_DIR}/res" ${BUILD_DIR}/Resources)
endif()
# link
# ******************************************************************************
#set(LINK_LIBRARIES PUBLIC ${VTK_LIBRARIES} PUBLIC Qt5::Core PUBLIC Qt5::Widgets PUBLIC Qt5::Gui PUBLIC Qt5::Quick PUBLIC Qt5::Qml PUBLIC Qt5::Concurrent)
#if(UNIX AND NOT APPLE)
# set(LINK_LIBRARIES ${LINK_LIBRARIES} PUBLIC Qt5::X11Extras)
#endif()
target_link_libraries(${PROJECT_NAME} ${LINK_LIBRARIES} ${LIB_NAME})
target_include_directories(${PROJECT_NAME} PRIVATE ${LIB_HDR})
function(AddApplicationSources rel_path group_name list_src)
message(STATUS " Add Application Src > ${rel_path} >> ${group_name}")
#target_include_directories(${target} PUBLIC ${rel_path})
include_directories(${rel_path})
file(GLOB list_globbed "${rel_path}/*.h" "${rel_path}/*.cpp" "${rel_path}/*.cxx" "${rel_path}/*.hpp")
foreach(file ${list_globbed})
message(STATUS " - ${file}")
endforeach()
set(list_return ${list_globbed} ${${list_src}})
set(${list_src} ${list_return} PARENT_SCOPE)
source_group(${group_name} FILES ${list_globbed})
endfunction()
function(AddLibrarySources rel_path group_name list_src list_hdr)
message(STATUS " Add Library Src > ${rel_path} >> ${group_name}")
#target_include_directories(${target} PUBLIC ${rel_path})
include_directories(${rel_path})
file(GLOB list_globbed_src "${rel_path}/*.cpp" "${rel_path}/*.cxx")
file(GLOB list_globbed_hdr "${rel_path}/*.h" "${rel_path}/*.hpp")
foreach(file ${list_globbed_hdr})
message(STATUS " - ${file}")
endforeach()
set(list_return_hdr ${list_globbed_hdr} ${${list_hdr}})
set(list_return_src ${list_globbed_src} ${${list_src}})
set(${list_hdr} ${list_return_hdr} PARENT_SCOPE)
set(${list_src} ${list_return_src} PARENT_SCOPE)
source_group(${group_name} FILES ${list_globbed_hdr} ${list_globbed_src})
endfunction()
function(AddResources rel_path group_name list_res)
message(STATUS " > ${rel_path} >> ${group_name}")
# include_directories(${PROJECT_ROOT_DIR}/res/${rel_path})
file(GLOB list_globbed "${rel_path}/*.qml" "${rel_path}/*.png" "${rel_path}/*.ttf" "${rel_path}/*.js" "${rel_path}/*.json" "${rel_path}/*.cfg")
foreach(file ${list_globbed})
message(STATUS " - ${file}")
endforeach()
source_group(${group_name} FILES ${list_globbed})
set(list_return ${list_globbed} ${${list_res}})
set(${list_res} ${list_return} PARENT_SCOPE)
endfunction()
新建文件夹为icon
内部放置三个文件夹
icons/develop/Toou2DExample.icns
icons/release/Toou2DExample.icns
icons/testing/Toou2DExample.icns
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>@MACOSX_BUNDLE_BUNDLE_NAME@</string>
<key>CFBundleIconFile</key>
<string>@MACOSX_BUNDLE_ICON_FILE@</string>
<key>CFBundleIdentifier</key>
<string>Q</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>@MACOSX_BUNDLE_BUNDLE_VERSION@</string>
<key>CFBundleName</key>
<string>@MACOSX_BUNDLE_BUNDLE_NAME@</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>@MACOSX_BUNDLE_BUNDLE_VERSION@</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>@MACOSX_BUNDLE_BUNDLE_VERSION@</string>
<key>CSResourcesFileMapped</key>
<true/>
<key>LSApplicationCategoryType</key>
<string>public.app-category.developer-tools</string>
<key>NSHumanReadableCopyright</key>
<string>@MACOSX_BUNDLE_COPYRIGHT@</string>
<key>NSHighResolutionCapable</key>
<true/>
</dict>
</plist>
#pragma once
namespace Toou2D
{
struct Meta
{
static constexpr auto appName = "@PROJECT_NAME@";
static constexpr auto orgName = "@Toou2D_ORG_NAME@";
static constexpr auto orgDomain = "@Toou2D_ORG_DOMAIN@";
static constexpr auto versionString =
"@Toou2D_VERSION_MAJOR@.@Toou2D_VERSION_MINOR@.@Toou2D_VERSION_"
"PATCH@";
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment