git-svn-id: svn://db.shs.com.ru/libs@887 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
75
qad/cmake/FindQAD.cmake
Normal file
75
qad/cmake/FindQAD.cmake
Normal file
@@ -0,0 +1,75 @@
|
||||
cmake_policy(SET CMP0020 NEW) # Automatically link Qt executables to qtmain target on Windows
|
||||
if(NOT LIBPROJECT)
|
||||
include(QtWraps)
|
||||
endif()
|
||||
get_directory_property(hasParent PARENT_DIRECTORY)
|
||||
set(_SEARCH_DIR)
|
||||
if(WIN32)
|
||||
find_package(MinGW REQUIRED)
|
||||
endif()
|
||||
set(_QAD_INCDIR)
|
||||
set(_QAD_LIBDIR)
|
||||
if(MINGW_INCLUDE)
|
||||
list(APPEND _QAD_INCDIR "${MINGW_INCLUDE}/qad")
|
||||
list(APPEND _QAD_LIBDIR "${MINGW_LIB}")
|
||||
endif()
|
||||
if(CMAKE_CROSSCOMPILING)
|
||||
list(APPEND _QAD_INCDIR "${CMAKE_PREFIX_PATH}/include/qad")
|
||||
list(APPEND _QAD_LIBDIR "${CMAKE_PREFIX_PATH}/lib")
|
||||
include_directories(${CMAKE_PREFIX_PATH}/include)
|
||||
link_directories(${CMAKE_PREFIX_PATH}/lib)
|
||||
else()
|
||||
if(NOT WIN32)
|
||||
list(APPEND _QAD_INCDIR "/usr/include/qad" "/usr/local/include/qad")
|
||||
list(APPEND _QAD_LIBDIR "/usr/lib" "/usr/local/lib")
|
||||
endif()
|
||||
if(APPLE)
|
||||
include_directories(/usr/local/include)
|
||||
link_directories(/usr/local/lib)
|
||||
endif()
|
||||
endif()
|
||||
find_file(QAD_H_INCLUDE "qad_types.h" HINTS ${PIP_DIR}/include/qad ${_QAD_INCDIR} $ENV{SMSDK_DIR}/include/qad)
|
||||
if (DEFINED ANDROID_PLATFORM)
|
||||
set(QAD_INCLUDES ${ANDROID_SYSTEM_LIBRARY_PATH}/usr/include/qad)
|
||||
else()
|
||||
get_filename_component(QAD_INCLUDES ${QAD_H_INCLUDE} PATH)
|
||||
endif()
|
||||
set(_SEARCH_DIR ${_QAD_LIBDIR} $ENV{SMSDK_DIR}/lib)
|
||||
set(_QAD_LIBS utils widgets application blockview graphic sql_table touch_widgets doc)
|
||||
if(LIBPROJECT)
|
||||
set(QAD_INCLUDES ${QAD_DIR})
|
||||
endif()
|
||||
foreach(_Q ${_QAD_LIBS})
|
||||
string(TOUPPER ${_Q} _QU)
|
||||
if(LIBPROJECT)
|
||||
set(QAD_${_QU}_LIBRARY qad_${_Q})
|
||||
list(APPEND QAD_INCLUDES ${QAD_DIR}/${_Q})
|
||||
else()
|
||||
foreach(_v ${_QT_VERSIONS_})
|
||||
find_library(QAD${_v}_${_QU}_LIBRARY qad_${_Q}${_v} HINTS ${_SEARCH_DIR})
|
||||
set(MULTILIB_${_Q}_SUFFIX_Qt${_v} ${_v})
|
||||
if(hasParent)
|
||||
set(MULTILIB_${_Q}_SUFFIX_Qt${_v} ${_v} PARENT_SCOPE)
|
||||
endif()
|
||||
endforeach()
|
||||
endif()
|
||||
#message(STATUS "Library qad_${_Q}5 (${_QU}) -> ${QAD5_${_QU}_LIBRARY} found in ${_SEARCH_DIR}")
|
||||
list(APPEND QT_MULTILIB_LIST qad_${_Q})
|
||||
endforeach()
|
||||
list(APPEND QT_MULTILIB_LIST qglview qglengine_core qglengine_widgets)
|
||||
foreach(_v ${_QT_VERSIONS_})
|
||||
find_library(QGLVIEW${_v}_LIBRARY qglview${_v} ${_SEARCH_DIR})
|
||||
set(MULTILIB_qglview_SUFFIX_Qt${_v} ${_v})
|
||||
if(hasParent)
|
||||
set(MULTILIB_qglview_SUFFIX_Qt${_v} ${_v} PARENT_SCOPE)
|
||||
endif()
|
||||
endforeach()
|
||||
if(hasParent)
|
||||
set(QT_MULTILIB_LIST ${QT_MULTILIB_LIST} PARENT_SCOPE)
|
||||
endif()
|
||||
if(NOT LIBPROJECT)
|
||||
if (NOT _QAD_MSG)
|
||||
set(_QAD_MSG 1 CACHE BOOL "msg_qad" FORCE)
|
||||
message(STATUS "Found QAD")
|
||||
endif()
|
||||
endif()
|
||||
352
qad/cmake/QADDeploy.cmake
Normal file
352
qad/cmake/QADDeploy.cmake
Normal file
@@ -0,0 +1,352 @@
|
||||
if (POLICY CMP0057)
|
||||
cmake_policy(SET CMP0057 NEW) # Support if() IN_LIST
|
||||
endif()
|
||||
set(__prop_names "LABEL;VERSION;FULLNAME;COMPANY;ICON;INFO")
|
||||
include(TargetArch)
|
||||
if (NOT MY_ARCH)
|
||||
target_architecture(MY_ARCH)
|
||||
endif()
|
||||
|
||||
|
||||
# usage: set_deploy_property(<target> NAME <value> [NAME <value> [...]])
|
||||
#
|
||||
# Set target deploy property, where NAME one of:
|
||||
# * LABEL - application icon name
|
||||
# * VERSION - version
|
||||
# * FULLNAME - package name in format "*.*.*"
|
||||
# * COMPANY - company name
|
||||
# * ICON - icon file
|
||||
# * INFO - additional info
|
||||
#
|
||||
# You can setup several properties in one command
|
||||
#
|
||||
macro(set_deploy_property _T)
|
||||
set(_name)
|
||||
set(_is_name 1)
|
||||
foreach(_i ${ARGN})
|
||||
if (_is_name)
|
||||
set(_is_name 0)
|
||||
if (_i IN_LIST __prop_names)
|
||||
else()
|
||||
message(FATAL_ERROR "Invalid property name \"${_i}\"!")
|
||||
endif()
|
||||
set(_name ${_i})
|
||||
else()
|
||||
set(_is_name 1)
|
||||
set(${_T}_${_name} ${_i})
|
||||
endif()
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
|
||||
# usage: make_rc(<target> <rc_out_file>)
|
||||
#
|
||||
# Generate Windows *.rc file from deploy properties
|
||||
# and return file path to <rc_out_file>
|
||||
#
|
||||
# You should set deploy properties before
|
||||
# call this macro, see "set_deploy_property()"
|
||||
#
|
||||
macro(make_rc _T _out)
|
||||
if (WIN32)
|
||||
set(WINDOWS_RC_FULLNAME "${${_T}_FULLNAME}")
|
||||
set(WINDOWS_RC_VERSION "${${_T}_VERSION}")
|
||||
set(WINDOWS_RC_LABEL "${${_T}_LABEL}")
|
||||
set(WINDOWS_RC_COMPANY "${${_T}_COMPANY}")
|
||||
set(WINDOWS_RC_INFO "${${_T}_INFO}")
|
||||
get_filename_component(WINDOWS_RC_ICON "${${_T}_ICON}" REALPATH BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
set(_rc_file "${CMAKE_CURRENT_BINARY_DIR}/winres.rc")
|
||||
file(WRITE ${_rc_file}
|
||||
"# if defined(UNDER_CE)
|
||||
# include <winbase.h>
|
||||
# else
|
||||
# include <winver.h>
|
||||
# endif
|
||||
1 ICON \"${WINDOWS_RC_ICON}\"
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,0,0,0
|
||||
PRODUCTVERSION 1,0,0,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x9L
|
||||
#else
|
||||
FILEFLAGS 0x8L
|
||||
#endif
|
||||
FILEOS 0x40004L
|
||||
FILETYPE 0x2L
|
||||
FILESUBTYPE 0x0L
|
||||
BEGIN
|
||||
BLOCK \"StringFileInfo\"
|
||||
BEGIN
|
||||
BLOCK \"040904b0\"
|
||||
BEGIN
|
||||
VALUE \"Comments\", \"\\0\"
|
||||
VALUE \"CompanyName\", \"${WINDOWS_RC_COMPANY}\\0\"
|
||||
VALUE \"FileDescription\", \"${WINDOWS_RC_INFO}\\0\"
|
||||
VALUE \"FileVersion\", \"${WINDOWS_RC_VERSION}\\0\"
|
||||
VALUE \"InternalName\", \"${WINDOWS_RC_FULLNAME}\\0\"
|
||||
VALUE \"LegalTrademarks\", \"\\0\"
|
||||
VALUE \"OriginalFilename\", \"${_T}.exe\\0\"
|
||||
VALUE \"PrivateBuild\", \"1\\0\"
|
||||
VALUE \"ProductName\", \"${WINDOWS_RC_LABEL}\\0\"
|
||||
VALUE \"ProductVersion\", \"${WINDOWS_RC_VERSION}\\0\"
|
||||
VALUE \"SpecialBuild\", \"\\0\"
|
||||
END
|
||||
END
|
||||
BLOCK \"VarFileInfo\"
|
||||
BEGIN
|
||||
VALUE \"Translation\", 0x409, 1200
|
||||
END
|
||||
END
|
||||
")
|
||||
set(${_out} ${_rc_file})
|
||||
else()
|
||||
set(${_out})
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
|
||||
# usage: deploy_target(<target> [DEPLOY_DIR <dir>] [DESTINATION <dir>] [RESOURCE_DIRS <dir> [<dir> ...]])
|
||||
#
|
||||
# DEPLOY_DIR - dir where you install
|
||||
# * executable on Windows, Linux
|
||||
# * <T>.app directory with executable on MacOS
|
||||
#
|
||||
# DESTINATION - dir where macro place package
|
||||
#
|
||||
# Example:
|
||||
# deploy_target(my_app DESTINATION packages)
|
||||
#
|
||||
# Create make target "deploy"
|
||||
#
|
||||
# This macro use "deploy_tool" from sdk,
|
||||
# make sure it can be executed from shell
|
||||
# You should set deploy properties before
|
||||
# call this macro, see "set_deploy_property()"
|
||||
#
|
||||
# use "CMAKE_OTOOL" or "CMAKE_OBJDUMP" variable,
|
||||
# depends on target platform
|
||||
# can use "DEPLOY_ADD_LIBPATH" variable as additional
|
||||
# library search path
|
||||
#
|
||||
macro(deploy_target _T)
|
||||
set(_DESTINATION "${CMAKE_INSTALL_PREFIX}")
|
||||
set(_DEPLOY_DIR "${CMAKE_INSTALL_PREFIX}")
|
||||
set(_RES_DIRS)
|
||||
set(_is_dest 0)
|
||||
set(_is_deploy_dir 0)
|
||||
set(_is_res_dirs 0)
|
||||
foreach(_i ${ARGN})
|
||||
if (_is_dest)
|
||||
set(_is_dest 0)
|
||||
set(_DESTINATION "${_i}/")
|
||||
elseif (_is_deploy_dir)
|
||||
set(_is_deploy_dir 0)
|
||||
set(_DEPLOY_DIR "${_i}/")
|
||||
elseif (_is_res_dirs)
|
||||
if (IS_ABSOLUTE "${_i}")
|
||||
list(APPEND _RES_DIRS "${_i}")
|
||||
else()
|
||||
list(APPEND _RES_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/${_i}")
|
||||
endif()
|
||||
else()
|
||||
if ("x${_i}" STREQUAL "xDESTINATION")
|
||||
set(_is_dest 1)
|
||||
elseif ("x${_i}" STREQUAL "xDEPLOY_DIR")
|
||||
set(_is_deploy_dir 1)
|
||||
elseif ("x${_i}" STREQUAL "xRESOURCE_DIRS")
|
||||
set(_is_res_dirs 1)
|
||||
endif()
|
||||
endif()
|
||||
#message("-i = ${_i}")
|
||||
endforeach()
|
||||
get_filename_component(_ICON_NAME "${${_T}_ICON}" NAME)
|
||||
get_filename_component(_ICON_FN "${${_T}_ICON}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||
set(_TV "${_T}_${${_T}_VERSION}")
|
||||
set(_DEP_LIBPATH)
|
||||
set(_DEP_LIBS_CS)
|
||||
set(_DEP_LIBS)
|
||||
get_target_property(_LL ${_T} LINK_LIBRARIES)
|
||||
foreach (_L ${_LL})
|
||||
if (TARGET ${_L})
|
||||
get_target_property(_II ${_L} IMPORTED)
|
||||
if (NOT _II)
|
||||
#message("depend on ${_L}")
|
||||
get_target_property(_LT ${_L} TYPE)
|
||||
if ("x${_LT}" STREQUAL "xSHARED_LIBRARY")
|
||||
set(_DEP_LIBPATH "${_DEP_LIBPATH};$<TARGET_FILE_DIR:${_L}>")
|
||||
set(_DEP_LIBS_CS "${_DEP_LIBS_CS};$<TARGET_FILE_DIR:${_L}>/$<TARGET_FILE_NAME:${_L}>")
|
||||
set(_DEP_LIBS "${_DEP_LIBS}" "$<TARGET_FILE_DIR:${_L}>/$<TARGET_FILE_NAME:${_L}>")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
#message("app depend libpath ${_DEP_LIBPATH}")
|
||||
set(_CMD_RES)
|
||||
if ("x${CMAKE_SYSTEM_NAME}" STREQUAL "xLinux")
|
||||
if (NOT CMAKE_LDD)
|
||||
find_program(CMAKE_LDD ldd)
|
||||
endif()
|
||||
string(REPLACE "_" "-" _DEBNAME "${_T}")
|
||||
set(_DEB_ARCH)
|
||||
if("_${MY_ARCH}" STREQUAL "_arm64")
|
||||
set(_DEB_ARCH "arm64")
|
||||
elseif("_${MY_ARCH}" STREQUAL "_armv7")
|
||||
set(_DEB_ARCH "armhf")
|
||||
elseif("_${MY_ARCH}" STREQUAL "_i386")
|
||||
set(_DEB_ARCH "i386")
|
||||
elseif("_${MY_ARCH}" STREQUAL "_x86_64")
|
||||
set(_DEB_ARCH "amd64")
|
||||
elseif("_${MY_ARCH}" STREQUAL "_ppc")
|
||||
set(_DEB_ARCH "PowerPC")
|
||||
elseif("_${MY_ARCH}" STREQUAL "_ppc64")
|
||||
set(_DEB_ARCH "PPC64")
|
||||
elseif("_${MY_ARCH}" STREQUAL "_ia64")
|
||||
set(_DEB_ARCH "ia64")
|
||||
endif()
|
||||
set(_DEB "${_TV}_deb_${_DEB_ARCH}")
|
||||
set(_AGD "${_DEPLOY_DIR}/${_DEB}")
|
||||
set(_C_echof ">" "${_AGD}/DEBIAN/control")
|
||||
set(_C_echo ">>" "${_AGD}/DEBIAN/control")
|
||||
set(_D_echof ">" "${_AGD}/usr/share/applications/${_DEBNAME}.desktop")
|
||||
set(_D_echo ">>" "${_AGD}/usr/share/applications/${_DEBNAME}.desktop")
|
||||
foreach(_r ${_RES_DIRS})
|
||||
set(_CMD_RES ${_CMD_RES} COMMAND cp -r "${_r}" "${_AGD}/usr/share/${${_T}_COMPANY}")
|
||||
endforeach()
|
||||
set(_CMD_COPY)
|
||||
if (_DEP_LIBS)
|
||||
set(_CMD_COPY ${_CMD_COPY} COMMAND cp -f ${_DEP_LIBS} ${_AGD}/usr/lib)
|
||||
endif()
|
||||
if (_ICON_NAME)
|
||||
set(_CMD_COPY ${_CMD_COPY} COMMAND cp -f ${_ICON_FN} ${_AGD}/usr/share/pixmaps)
|
||||
endif()
|
||||
add_custom_target(deploy
|
||||
# gather deb dir
|
||||
COMMAND mkdir -p ${_AGD}/DEBIAN
|
||||
COMMAND mkdir -p ${_AGD}/usr/bin
|
||||
COMMAND mkdir -p ${_AGD}/usr/lib
|
||||
COMMAND mkdir -p ${_AGD}/usr/share/${${_T}_COMPANY}
|
||||
COMMAND mkdir -p ${_AGD}/usr/share/pixmaps
|
||||
COMMAND mkdir -p ${_AGD}/usr/share/applications
|
||||
COMMAND cp -f ${_DEPLOY_DIR}/${_T} ${_AGD}/usr/bin
|
||||
${_CMD_COPY}
|
||||
${_CMD_RES}
|
||||
|
||||
COMMAND echo "Package: ${_DEBNAME}" ${_C_echof}
|
||||
COMMAND echo "Version: ${${_T}_VERSION}" ${_C_echo}
|
||||
COMMAND echo "Architecture: ${_DEB_ARCH}" ${_C_echo}
|
||||
COMMAND echo "Maintainer: ${${_T}_COMPANY} <>" ${_C_echo}
|
||||
COMMAND deploy_tool --prefix "Depends: " --dependencies -l ${CMAKE_LDD} ${_DEPLOY_DIR}/${_T} -a "${_DEP_LIBS_CS}" -o "${_AGD}/usr/lib" ${_C_echo}
|
||||
COMMAND echo "Conflicts:" ${_C_echo}
|
||||
COMMAND echo "Replaces:" ${_C_echo}
|
||||
COMMAND echo "Section: misc" ${_C_echo}
|
||||
COMMAND echo "Priority: optional" ${_C_echo}
|
||||
COMMAND echo "Description: ${${_T}_INFO}" ${_C_echo}
|
||||
|
||||
COMMAND echo "[Desktop Entry]" ${_D_echof}
|
||||
COMMAND echo "Encoding=UTF-8" ${_D_echo}
|
||||
COMMAND echo "Type=Application" ${_D_echo}
|
||||
COMMAND echo "Name=${${_T}_LABEL}" ${_D_echo}
|
||||
COMMAND echo "GenericName=${${_T}_LABEL}" ${_D_echo}
|
||||
COMMAND echo "Comment=${${_T}_INFO}" ${_D_echo}
|
||||
COMMAND echo "Exec=/usr/bin/${_T}" ${_D_echo}
|
||||
COMMAND echo "Icon=/usr/share/pixmaps/${_ICON_NAME}" ${_D_echo}
|
||||
COMMAND echo "Terminal=false" ${_D_echo}
|
||||
COMMAND echo "StartupNotify=true" ${_D_echo}
|
||||
#COMMAND echo "X-KDE-StartupNotify=true" ${_D_echo}
|
||||
COMMAND echo "Categories=Utility;" ${_D_echo}
|
||||
|
||||
#COMMAND -l "${CMAKE_LDD}" -P xcb -q ${Qt5_ROOT} -s "\"${CMAKE_PREFIX_PATH}/lib;${DEPLOY_ADD_LIBPATH}${_DEP_LIBPATH}\"" -o ${_AGD}/usr/lib -p ${_AGD}/usr/ ${_AGD}/Contents/MacOS/${_T}
|
||||
# generate deb
|
||||
COMMAND cd ${_AGD} "&&" md5deep -rl usr ">" DEBIAN/md5sums
|
||||
COMMAND mkdir -p ${_DESTINATION}
|
||||
COMMAND dpkg-deb -b ${_AGD} ${_DESTINATION}/${_TV}_${_DEB_ARCH}.deb
|
||||
VERBATIM
|
||||
COMMENT "Generating ${_TV}_${_DEB_ARCH}.deb"
|
||||
)
|
||||
elseif(WIN32)
|
||||
if (NOT CMAKE_OBJDUMP)
|
||||
find_program(CMAKE_OBJDUMP objdump)
|
||||
endif()
|
||||
set(_AGD "${_DEPLOY_DIR}/${_TV}_win_${MY_ARCH}/")
|
||||
set(_SEP "/")
|
||||
set(_COPY "cp" "-rf")
|
||||
set(_COPY_SUFFIX)
|
||||
set(_MKDIR mkdir -p "${_AGD}")
|
||||
set(_MKDIR_P mkdir -p "${_DESTINATION}")
|
||||
if ("x${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "xWindows")
|
||||
set(_SEP "\\")
|
||||
set(_COPY xcopy "/y" "/r")
|
||||
set(_COPY_SUFFIX "1>" "NUL")
|
||||
file(TO_NATIVE_PATH "${_AGD}" _AGD)
|
||||
file(TO_NATIVE_PATH "${_DEPLOY_DIR}/" _DEPLOY_DIR)
|
||||
string(REPLACE "/" "\\" _AGD "${_AGD}")
|
||||
string(REPLACE "/" "\\" _DEPLOY_DIR "${_DEPLOY_DIR}")
|
||||
string(REPLACE "/" "\\" CMAKE_OBJDUMP "${CMAKE_OBJDUMP}")
|
||||
set(_MKDIR if not exist "\"${_AGD}\"" mkdir "\"${_AGD}\"")
|
||||
set(_MKDIR_P if not exist "\"${_DESTINATION}\"" mkdir "\"${_DESTINATION}\"")
|
||||
endif()
|
||||
foreach(_r ${_RES_DIRS})
|
||||
get_filename_component(_dirname "${_r}" NAME)
|
||||
file(TO_NATIVE_PATH "${_r}/" _wr)
|
||||
if ("x${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "xWindows")
|
||||
set(_CMD_RES ${_CMD_RES} COMMAND if not exist "\"${_AGD}${_dirname}\"" mkdir "\"${_AGD}${_dirname}\"")
|
||||
string(REPLACE "/" "\\" _wr "${_wr}")
|
||||
else()
|
||||
set(_CMD_RES ${_CMD_RES} COMMAND mkdir -p "${_AGD}${_dirname}")
|
||||
endif()
|
||||
set(_CMD_RES ${_CMD_RES} COMMAND ${_COPY} "${_wr}*" "\"${_AGD}${_dirname}${_SEP}\"" ${_COPY_SUFFIX})
|
||||
endforeach()
|
||||
add_custom_target(deploy
|
||||
# gather dir
|
||||
COMMAND ${_MKDIR}
|
||||
COMMAND ${_MKDIR_P}
|
||||
COMMAND ${_COPY} "\"${_DEPLOY_DIR}${_T}.exe\"" "\"${_AGD}\"" ${_COPY_SUFFIX}
|
||||
#COMMAND ${_COPY} "${_DEPLOY_DIR}lang${_SEP}*" "\"${_AGD}lang${_SEP}\"" ${_COPY_SUFFIX}
|
||||
${_CMD_RES}
|
||||
|
||||
COMMAND deploy_tool -W "\"${CMAKE_OBJDUMP}\"" -P windows -S windows -q "\"${Qt5_ROOT}\"" -s "\"${CMAKE_PREFIX_PATH}/bin;${MINGW_BIN};${DEPLOY_ADD_LIBPATH}${_DEP_LIBPATH}\"" -o ${_AGD} -p ${_AGD} "\"${_AGD}${_T}.exe\""
|
||||
# zip
|
||||
COMMAND cd "\"${_DEPLOY_DIR}\"" "&&" zip -r "\"${_DESTINATION}/${_TV}.zip\"" "\"${_TV}_win_${MY_ARCH}\""
|
||||
COMMENT "Generating ${_TV}.zip"
|
||||
)
|
||||
elseif (APPLE)
|
||||
set(MACOSX_BUNDLE_GUI_IDENTIFIER "${${_T}_FULLNAME}")
|
||||
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${${_T}_VERSION}")
|
||||
set(MACOSX_BUNDLE_LONG_VERSION_STRING "${${_T}_VERSION}")
|
||||
set(MACOSX_BUNDLE_ICON_FILE "${_ICON_NAME}")
|
||||
set(MACOSX_BUNDLE_BUNDLE_NAME "${${_T}_LABEL}")
|
||||
set(MACOSX_BUNDLE_COPYRIGHT "${${_T}_COMPANY}")
|
||||
set(MACOSX_BUNDLE_INFO_STRING "${${_T}_INFO}")
|
||||
set(MACOSX_BUNDLE_BUNDLE_VERSION "6.0")
|
||||
set_target_properties(${_T} PROPERTIES MACOSX_BUNDLE TRUE)
|
||||
set(_AGD "${_DEPLOY_DIR}/${_T}.app")
|
||||
set(_DMG "${CMAKE_CURRENT_BINARY_DIR}/dmg")
|
||||
set(_CMD_COPY)
|
||||
if (_ICON_NAME)
|
||||
set(_CMD_COPY ${_CMD_COPY} COMMAND cp -f ${_ICON_FN} ${_AGD}/Contents/Resources)
|
||||
endif()
|
||||
foreach(_r ${_RES_DIRS})
|
||||
set(_CMD_RES ${_CMD_RES} COMMAND cp -r "${_r}" "${_AGD}/Contents/Resources")
|
||||
endforeach()
|
||||
add_custom_target(deploy
|
||||
# gather .app dir
|
||||
COMMAND mkdir -p ${_AGD}/Contents/Resources
|
||||
COMMAND mkdir -p ${_AGD}/Contents/Frameworks
|
||||
COMMAND mkdir -p ${_DESTINATION}
|
||||
${_CMD_COPY}
|
||||
${_CMD_RES}
|
||||
#COMMAND cp ${_ICON_FN} ${_AGD}/Contents/Resources
|
||||
#COMMAND cp -r ${_DEPLOY_DIR}/lang ${_AGD}/Contents/Resources
|
||||
COMMAND deploy_tool -M "${CMAKE_OTOOL}" -P cocoa -S mac -q ${Qt5_ROOT} -s "\"${CMAKE_PREFIX_PATH}/lib;${DEPLOY_ADD_LIBPATH}${_DEP_LIBPATH}\"" -o ${_AGD}/Contents/Frameworks -p ${_AGD}/Contents/PlugIns ${_AGD}/Contents/MacOS/${_T}
|
||||
# prepare dmg dir
|
||||
COMMAND rm -rf ${_DMG}
|
||||
COMMAND mkdir -p ${_DMG}
|
||||
COMMAND cp -r ${_AGD} ${_DMG}
|
||||
COMMAND ln --symbolic /Applications ${_DMG}
|
||||
# generate dmg
|
||||
COMMAND genisoimage -quiet -V ${_T} -D -R -apple -no-pad -o ${_DESTINATION}/${_TV}.dmg ${_DMG}
|
||||
COMMENT "Generating ${_TV}.dmg"
|
||||
)
|
||||
endif()
|
||||
endmacro()
|
||||
599
qad/cmake/QtWraps.cmake
Normal file
599
qad/cmake/QtWraps.cmake
Normal file
@@ -0,0 +1,599 @@
|
||||
cmake_policy(SET CMP0020 NEW) # Automatically link Qt executables to qtmain target on Windows
|
||||
|
||||
|
||||
set(_QT_VERSIONS_ 4 5)
|
||||
foreach(_v ${_QT_VERSIONS_})
|
||||
if (NOT DEFINED TARGET_SUFFIX_Qt${_v})
|
||||
set(TARGET_SUFFIX_Qt${_v} "${_v}")
|
||||
set(MULTILIB_SUFFIX_Qt${_v} "${_v}")
|
||||
endif()
|
||||
set(MOC_INC_Qt${_v})
|
||||
endforeach()
|
||||
if (NOT DEFINED QT_MULTILIB_LIST)
|
||||
set(QT_MULTILIB_LIST)
|
||||
endif()
|
||||
#set(TARGET_SUFFIX_Qt4 "")
|
||||
|
||||
|
||||
# usage: find_qt([<Module1> <Module2> ...] [Qt4] [Qt5])
|
||||
# find Qt4 or/and Qt5 packages
|
||||
# if Qt4/5 found, set
|
||||
# * Qt<4/5>_ROOT var to Qt root dir
|
||||
# * Qt<4/5>_BIN var to Qt binary dir
|
||||
# * Qt<4/5>_PLUGINS_DIR var to Qt plugins dir
|
||||
macro(find_qt)
|
||||
set(_QCOMP)
|
||||
foreach(_v ${_QT_VERSIONS_})
|
||||
set(_NEED${_v} 0)
|
||||
set(LOCAL_FOUND${_v} 0)
|
||||
set(MOC_INC_Qt${_v})
|
||||
set(Qt${_v}_INCLUDES)
|
||||
set(Qt${_v}_LIBRARIES)
|
||||
set(Qt${_v}_ROOT)
|
||||
set(Qt${_v}_BIN)
|
||||
set(Qt${_v}_PLUGINS_DIR)
|
||||
set(Qt${_v}_LANG_DIR)
|
||||
endforeach()
|
||||
set(_NEED_SOME 0)
|
||||
set(_QUIET)
|
||||
foreach(_i ${ARGN})
|
||||
set(_FOUND_NEED 0)
|
||||
foreach(_v ${_QT_VERSIONS_})
|
||||
if ("x${_i}" STREQUAL "xQt${_v}")
|
||||
set(_NEED${_v} 1)
|
||||
set(_NEED_SOME 1)
|
||||
set(_FOUND_NEED 1)
|
||||
endif()
|
||||
if ("x${_i}" STREQUAL "xQUIET")
|
||||
set(_QUIET QUIET)
|
||||
endif()
|
||||
endforeach()
|
||||
if (NOT _FOUND_NEED)
|
||||
list(APPEND _QCOMP "${_i}")
|
||||
endif()
|
||||
endforeach()
|
||||
if (NOT _NEED_SOME)
|
||||
foreach(_v ${_QT_VERSIONS_})
|
||||
set(_NEED${_v} 1)
|
||||
endforeach()
|
||||
endif()
|
||||
list(REMOVE_DUPLICATES _QCOMP)
|
||||
if (_NEED4)
|
||||
find_package(Qt4 ${_QUIET})
|
||||
if (Qt4_FOUND)
|
||||
set(LOCAL_FOUND4 1)
|
||||
get_filename_component(Qt4_BIN ${QT_QMAKE_EXECUTABLE} PATH)
|
||||
set(Qt4_INCLUDES ${QT_INCLUDES})
|
||||
foreach(m ${_QCOMP})
|
||||
string(TOUPPER "${m}" _um)
|
||||
#message("${QT_QT${_um}_FOUND}")
|
||||
if (${QT_QT${_um}_FOUND})
|
||||
list(APPEND Qt4_LIBRARIES ${QT_QT${_um}_LIBRARY})
|
||||
endif()
|
||||
endforeach()
|
||||
set(Qt4_PLUGINS_DIR ${QT_PLUGINS_DIR})
|
||||
set(Qt4_LANG_DIR ${Qt4_BIN}/../translations)
|
||||
set(Qt4_ROOT "${Qt4_BIN}/../")
|
||||
endif()
|
||||
endif()
|
||||
if (_NEED5)
|
||||
#set(_MSG 1)
|
||||
#if (Qt5_FOUND)
|
||||
# set(_MSG 0)
|
||||
#endif()
|
||||
find_package(Qt5 COMPONENTS LinguistTools UiPlugin Widgets ${_QCOMP} ${_QUIET})
|
||||
if (Qt5_FOUND)
|
||||
set(LOCAL_FOUND5 1)
|
||||
set(_Qt5Modules)
|
||||
foreach(m ${_QCOMP})
|
||||
if (${Qt5${m}_FOUND})
|
||||
list(APPEND _Qt5Modules ${m})
|
||||
list(APPEND Qt5_INCLUDES ${Qt5${m}_INCLUDE_DIRS})
|
||||
list(APPEND Qt5_LIBRARIES ${Qt5${m}_LIBRARIES})
|
||||
endif()
|
||||
endforeach()
|
||||
#get_property(_up_dir TARGET Qt5::UiPlugin PROPERTY INTERFACE_INCLUDE_DIRECTORIES)
|
||||
#message("${_up_dir}")
|
||||
#if (NOT "x${_up_dir}" STREQUAL "x")
|
||||
# list(APPEND Qt5_INCLUDES ${_up_dir})
|
||||
#endif()
|
||||
get_target_property(_Qt5_qmake Qt5::qmake LOCATION)
|
||||
get_filename_component(Qt5_BIN ${_Qt5_qmake} PATH)
|
||||
foreach(_p ${Qt5Gui_PLUGINS})
|
||||
get_target_property(_l ${_p} LOCATION)
|
||||
get_filename_component(_l ${_l} DIRECTORY)
|
||||
string(FIND "${_l}" "/" _ind REVERSE)
|
||||
string(SUBSTRING "${_l}" 0 ${_ind} _l)
|
||||
set(Qt5_PLUGINS_DIR ${_l})
|
||||
#message("Qt5: plugins dir: ${Qt5_PLUGINS_DIR}")
|
||||
break()
|
||||
endforeach()
|
||||
string(FIND "${Qt5_BIN}" "/" _ind REVERSE)
|
||||
string(SUBSTRING "${Qt5_BIN}" 0 ${_ind} Qt5_ROOT)
|
||||
if ("x${Qt5_PLUGINS_DIR}" STREQUAL "x")
|
||||
set(Qt5_PLUGINS_DIR "${Qt5_ROOT}/plugins")
|
||||
endif()
|
||||
if (APPLE)
|
||||
list(APPEND MOC_INC_Qt5 "-F${Qt5_ROOT}/lib")
|
||||
endif()
|
||||
set(Qt5_LANG_DIR ${Qt5_BIN}/../translations)
|
||||
if (NOT _QT5_MSG)
|
||||
message(STATUS "Found Qt5: ${_Qt5_qmake} (found version \"${Qt5_VERSION}\")")
|
||||
set(_QT5_MSG 1 CACHE BOOL "msg_qt5" FORCE)
|
||||
#message(STATUS "Found Qt5 modules: ${_Qt5Modules}")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
# set()
|
||||
foreach(_v ${_QT_VERSIONS_})
|
||||
if (LOCAL_FOUND${_v})
|
||||
foreach(_p ${Qt${_v}_INCLUDES})
|
||||
list(APPEND MOC_INC_Qt${_v} "-I${_p}")
|
||||
#message("${_p}")
|
||||
endforeach()
|
||||
endif()
|
||||
#message("${MOC_INC_Qt${_v}}")
|
||||
endforeach()
|
||||
|
||||
endmacro()
|
||||
|
||||
|
||||
# usage: qt_sources(<src_out_var> [NO_DEFAULT] [DIR <dir>] [<regexp> ...])
|
||||
# collect all sources, optionally in directory <dir> and
|
||||
# additional filters <regexp>. By default filter files with regexps
|
||||
# "*.h", "*.hpp", "*.c", "*.cpp", "*.ui", "*.qrc", "*.rc", "*.ts" and "lang/*.ts".
|
||||
# Default filters disabled with option NO_DEFAULT
|
||||
macro(qt_sources OUT)
|
||||
set(${OUT})
|
||||
set(_DIR "")
|
||||
set(_IS_DIR 0)
|
||||
set(_NO_DEFAULT 0)
|
||||
set(_DEFAULT)
|
||||
set(_REGEXP)
|
||||
set(_REGEXP_WD)
|
||||
foreach(_i ${ARGN})
|
||||
if (_IS_DIR)
|
||||
set(_DIR "${_i}")
|
||||
set(_IS_DIR 0)
|
||||
else()
|
||||
if ("x${_i}" STREQUAL "xDIR")
|
||||
set(_IS_DIR 1)
|
||||
else()
|
||||
if ("x${_i}" STREQUAL "xNO_DEFAULT")
|
||||
set(_NO_DEFAULT 1)
|
||||
else()
|
||||
list(APPEND _REGEXP ${_i})
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
if (NOT "x${_DIR}" STREQUAL "x")
|
||||
#file(TO_CMAKE_PATH "${_DIR}//" _DIR)
|
||||
string(REPLACE "\\" "/" _DIR "${_DIR}/")
|
||||
string(REPLACE "//" "/" _DIR "${_DIR}")
|
||||
endif()
|
||||
foreach(_i ${_REGEXP})
|
||||
list(APPEND _REGEXP_WD "${_DIR}${_i}")
|
||||
endforeach()
|
||||
if (NOT _NO_DEFAULT)
|
||||
set(_DEFAULT "${_DIR}*.h" "${_DIR}*.hpp" "${_DIR}*.c" "${_DIR}*.cpp" "${_DIR}*.ui" "${_DIR}*.qrc" "${_DIR}*.rc" "${_DIR}*.ts" "${_DIR}lang/*.ts")
|
||||
endif()
|
||||
#message("${_DEFAULT}, ${_REGEXP_WD}")
|
||||
file(GLOB ${OUT} ${_DEFAULT} ${_REGEXP_WD})
|
||||
endmacro()
|
||||
|
||||
|
||||
# usage: qt_wrap(<file0> <file1> ... [HDRS <hrd_var>] [CPPS <cpp_var>] [QMS <qm_var>])
|
||||
# prepare sources for compile
|
||||
# store headers to <hrd_var>, all wrapped Qt4 files to <cpp_var>_Qt4 and Qt5 files to <cpp_var>_Qt5
|
||||
# version are automatic detected after find_qt() call
|
||||
macro(qt_wrap)
|
||||
set(HDR_VAR)
|
||||
set(CPP_VAR)
|
||||
set(QM_VAR)
|
||||
set(_HDR_ARG 0)
|
||||
set(_CPP_ARG 0)
|
||||
set(_QM_ARG 0)
|
||||
set(WAS_HDR_ARG 0)
|
||||
set(WAS_CPP_ARG 0)
|
||||
set(WAS_QM_ARG 0)
|
||||
set(FILE_LIST)
|
||||
foreach(_i ${ARGN})
|
||||
if (_HDR_ARG)
|
||||
set(HDR_VAR ${_i})
|
||||
set(WAS_HDR_ARG 1)
|
||||
set(_HDR_ARG 0)
|
||||
else()
|
||||
if (_CPP_ARG)
|
||||
set(CPP_VAR ${_i})
|
||||
set(WAS_CPP_ARG 1)
|
||||
set(_CPP_ARG 0)
|
||||
else()
|
||||
if (_QM_ARG)
|
||||
set(QM_VAR ${_i})
|
||||
set(WAS_QM_ARG 1)
|
||||
set(_QM_ARG 0)
|
||||
else()
|
||||
if ("x${_i}" STREQUAL "xHDRS")
|
||||
set(_HDR_ARG 1)
|
||||
else()
|
||||
if ("x${_i}" STREQUAL "xCPPS")
|
||||
set(_CPP_ARG 1)
|
||||
else()
|
||||
if ("x${_i}" STREQUAL "xQMS")
|
||||
set(_QM_ARG 1)
|
||||
else()
|
||||
list(APPEND FILE_LIST "${_i}")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
foreach(_v ${_QT_VERSIONS_})
|
||||
set(CPP${_v}_VAR)
|
||||
set(QM${_v}_VAR)
|
||||
if (LOCAL_FOUND${_v})
|
||||
if (WAS_CPP_ARG)
|
||||
set(CPP${_v}_VAR ${CPP_VAR}_Qt${_v})
|
||||
endif()
|
||||
if (WAS_QM_ARG)
|
||||
set(QM${_v}_VAR ${QM_VAR}_Qt${_v})
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
#message("found 4: ${LOCAL_FOUND4}, 5: ${LOCAL_FOUND5}")
|
||||
#message("has HRDS: ${WAS_HDR_ARG}: ${HDR_VAR}")
|
||||
#message("has CPPS4: ${WAS_CPP_ARG}: ${CPP4_VAR}")
|
||||
#message("has CPPS5: ${WAS_CPP_ARG}: ${CPP5_VAR}")
|
||||
#message("files: ${FILE_LIST}")
|
||||
set(H_LIST)
|
||||
set(CPP_LIST)
|
||||
set(UI_LIST)
|
||||
set(RES_LIST)
|
||||
set(RC_LIST)
|
||||
set(TS_LIST)
|
||||
foreach(_i ${FILE_LIST})
|
||||
get_filename_component(_EXT "${_i}" EXT)
|
||||
#message("${_EXT}")
|
||||
if (NOT ("x${_EXT}" STREQUAL "x"))
|
||||
if (("x${_EXT}" STREQUAL "x.h") OR ("x${_EXT}" STREQUAL "x.hpp"))
|
||||
list(APPEND H_LIST "${_i}")
|
||||
#message("header")
|
||||
endif()
|
||||
if (("x${_EXT}" STREQUAL "x.c") OR ("x${_EXT}" STREQUAL "x.cpp") OR ("x${_EXT}" STREQUAL "x.cxx"))
|
||||
list(APPEND CPP_LIST "${_i}")
|
||||
#message("source")
|
||||
endif()
|
||||
if ("x${_EXT}" STREQUAL "x.ui")
|
||||
list(APPEND UI_LIST "${_i}")
|
||||
endif()
|
||||
if ("x${_EXT}" STREQUAL "x.qrc")
|
||||
list(APPEND RES_LIST "${_i}")
|
||||
endif()
|
||||
if ("x${_EXT}" STREQUAL "x.rc")
|
||||
list(APPEND RC_LIST "${_i}")
|
||||
endif()
|
||||
if ("x${_EXT}" STREQUAL "x.ts")
|
||||
list(APPEND TS_LIST "${_i}")
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
if (WAS_HDR_ARG)
|
||||
set(${HDR_VAR})
|
||||
list(APPEND ${HDR_VAR} ${H_LIST})
|
||||
endif()
|
||||
set(SRC_CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
|
||||
foreach(_v ${_QT_VERSIONS_})
|
||||
if (LOCAL_FOUND${_v} AND WAS_CPP_ARG)
|
||||
set(CMAKE_CURRENT_BINARY_DIR ${SRC_CMAKE_CURRENT_BINARY_DIR}/qt${_v})
|
||||
set(${CPP${_v}_VAR})
|
||||
if (WAS_QM_ARG)
|
||||
set(${QM${_v}_VAR})
|
||||
endif()
|
||||
set(MOCS${_v})
|
||||
set(CUIS${_v})
|
||||
set(CRES${_v})
|
||||
if (${_v} EQUAL 4)
|
||||
qt4_wrap_cpp(MOCS${_v} ${H_LIST} OPTIONS -nw ${MOC_INC_Qt4})
|
||||
qt4_wrap_ui(CUIS${_v} ${UI_LIST})
|
||||
qt4_add_resources(CRES${_v} ${RES_LIST})
|
||||
if (WAS_QM_ARG)
|
||||
set(${QM${_v}_VAR} "")
|
||||
qt4_add_translation(${QM${_v}_VAR} ${TS_LIST})
|
||||
endif()
|
||||
else()
|
||||
if (${_v} EQUAL 5)
|
||||
qt5_wrap_cpp(MOCS${_v} ${H_LIST} OPTIONS -nw ${MOC_INC_Qt5})
|
||||
qt5_wrap_ui(CUIS${_v} ${UI_LIST})
|
||||
qt5_add_resources(CRES${_v} ${RES_LIST})
|
||||
if (WAS_QM_ARG)
|
||||
set(${QM${_v}_VAR} "")
|
||||
qt5_add_translation(${QM${_v}_VAR} ${TS_LIST})
|
||||
endif()
|
||||
else()
|
||||
endif()
|
||||
endif()
|
||||
#message("${${QM${_v}_VAR}}")
|
||||
list(APPEND ${CPP${_v}_VAR} ${CPP_LIST})
|
||||
list(APPEND ${CPP${_v}_VAR} ${RC_LIST})
|
||||
list(APPEND ${CPP${_v}_VAR} ${MOCS${_v}})
|
||||
list(APPEND ${CPP${_v}_VAR} ${CUIS${_v}})
|
||||
list(APPEND ${CPP${_v}_VAR} ${CRES${_v}})
|
||||
if (WAS_QM_ARG)
|
||||
list(APPEND ${CPP${_v}_VAR} ${${QM${_v}_VAR}})
|
||||
endif()
|
||||
#message("${${QM${_v}_VAR}}")
|
||||
endif()
|
||||
endforeach()
|
||||
set(CMAKE_CURRENT_BINARY_DIR ${SRC_CMAKE_CURRENT_BINARY_DIR})
|
||||
endmacro()
|
||||
|
||||
|
||||
macro(_qt_split_add_args _P _A)
|
||||
set(${_P})
|
||||
set(${_A})
|
||||
foreach(_i ${ARGN})
|
||||
if (NOT ("x${${_i}_Qt${_v}}" STREQUAL "x"))
|
||||
list(APPEND ${_A} ${${_i}_Qt${_v}})
|
||||
else()
|
||||
if (("x${_i}" STREQUAL "xWIN32") OR ("x${_i}" STREQUAL "xMACOSX_BUNDLE") OR ("x${_i}" STREQUAL "xSTATIC") OR ("x${_i}" STREQUAL "xSHARED") OR ("x${_i}" STREQUAL "xMODULE") OR ("x${_i}" STREQUAL "xEXCLUDE_FROM_ALL"))
|
||||
list(APPEND ${_P} ${_i})
|
||||
else()
|
||||
if ("x${${_i}}" STREQUAL "x")
|
||||
list(APPEND ${_A} ${_i})
|
||||
else()
|
||||
list(APPEND ${_A} ${${_i}})
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
|
||||
# usage: qt_add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
|
||||
# add executables for founded Qt versions, target names is <name><TARGET_SUFFIX_Qt?>
|
||||
# all needed Qt includes automatic added to corresponding targets
|
||||
# <source> cant be CPPS variable passed to qt_wrap() or some list or filename
|
||||
macro(qt_add_executable _NAME)
|
||||
foreach(_v ${_QT_VERSIONS_})
|
||||
if (LOCAL_FOUND${_v})
|
||||
_qt_split_add_args(_PREF _ARGS ${ARGN})
|
||||
if(APPLE)
|
||||
set(_PREV_CIND "${CMAKE_INSTALL_NAME_DIR}")
|
||||
set(CMAKE_INSTALL_NAME_DIR "@rpath")
|
||||
else()
|
||||
if(NOT WIN32)
|
||||
set(CMAKE_INSTALL_RPATH "\$ORIGIN/lib")
|
||||
endif()
|
||||
endif()
|
||||
set(_TARGET ${_NAME}${TARGET_SUFFIX_Qt${_v}})
|
||||
add_executable(${_TARGET} ${_PREF} ${_ARGS})
|
||||
set(_${_NAME}_is_qt 1)
|
||||
target_include_directories(${_TARGET} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/qt${_v} ${Qt${_v}_INCLUDES})
|
||||
|
||||
if(APPLE)
|
||||
set(CMAKE_INSTALL_NAME_DIR "${_PREV_CIND}")
|
||||
endif()
|
||||
# # Apple crosscompiling rpath patch
|
||||
# if (APPLE AND CMAKE_CROSSCOMPILING AND CMAKE_MACOSX_RPATH)
|
||||
# foreach(_RP ${CMAKE_INSTALL_RPATH})
|
||||
# add_custom_command(TARGET ${_TARGET} POST_BUILD
|
||||
# COMMAND "${CMAKE_INSTALL_NAME_TOOL}"
|
||||
# "-add_rpath" "${_RP}"
|
||||
# "$<TARGET_FILE_DIR:${_TARGET}>/$<TARGET_FILE_NAME:${_TARGET}>"
|
||||
# COMMENT "Add to ${_TARGET} rpath \"${_RP}\"")
|
||||
# endforeach()
|
||||
# endif()
|
||||
|
||||
#list(APPEND _ALL_TARGETS "${_TARGET}")
|
||||
#set(_ALL_TARGETS ${_ALL_TARGETS} PARENT_SCOPE)
|
||||
endif()
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
|
||||
# usage: qt_add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
|
||||
# add library for founded Qt versions, target names is <name><TARGET_SUFFIX_Qt?>
|
||||
# all needed Qt includes automatic added to corresponding targets
|
||||
# <source> cant be CPPS variable passed to qt_wrap() or some list or filename
|
||||
macro(qt_add_library _NAME)
|
||||
foreach(_v ${_QT_VERSIONS_})
|
||||
if (LOCAL_FOUND${_v})
|
||||
_qt_split_add_args(_PREF _ARGS ${ARGN})
|
||||
if(APPLE)
|
||||
set(_PREV_CIND "${CMAKE_INSTALL_NAME_DIR}")
|
||||
set(CMAKE_INSTALL_NAME_DIR "@rpath")
|
||||
else()
|
||||
if(NOT WIN32)
|
||||
set(CMAKE_INSTALL_RPATH "\$ORIGIN/lib")
|
||||
endif()
|
||||
endif()
|
||||
set(_TARGET ${_NAME}${TARGET_SUFFIX_Qt${_v}})
|
||||
add_library(${_TARGET} ${_PREF} ${_ARGS})
|
||||
set(_${_NAME}_is_qt 1)
|
||||
target_include_directories(${_TARGET} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}/qt${_v} ${Qt${_v}_INCLUDES})
|
||||
#message("add lib: \"${_TARGET}\"")
|
||||
|
||||
if(APPLE)
|
||||
set(CMAKE_INSTALL_NAME_DIR "${_PREV_CIND}")
|
||||
endif()
|
||||
# # Apple crosscompiling rpath patch
|
||||
# if (APPLE AND CMAKE_CROSSCOMPILING AND CMAKE_MACOSX_RPATH)
|
||||
# foreach(_RP ${CMAKE_INSTALL_RPATH})
|
||||
# add_custom_command(TARGET ${_TARGET} POST_BUILD
|
||||
# COMMAND "${CMAKE_INSTALL_NAME_TOOL}"
|
||||
# "-add_rpath" "${_RP}"
|
||||
# "$<TARGET_FILE_DIR:${_TARGET}>/$<TARGET_FILE_NAME:${_TARGET}>"
|
||||
# COMMENT "Add to ${_TARGET} rpath \"${_RP}\"")
|
||||
# endforeach()
|
||||
# endif()
|
||||
|
||||
list(APPEND _ALL_TARGETS "${_TARGET}")
|
||||
set(_ALL_TARGETS ${_ALL_TARGETS} PARENT_SCOPE)
|
||||
endif()
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
|
||||
macro(_qt_multitarget_suffix_ _OUT _IN _v)
|
||||
if (NOT "x${MULTILIB_${_IN}_SUFFIX_Qt${_v}}" STREQUAL "x")
|
||||
set(${_OUT} "${MULTILIB_${_IN}_SUFFIX_Qt${_v}}")
|
||||
else()
|
||||
set(${_OUT} "${MULTILIB_SUFFIX_Qt${_v}}")
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
|
||||
# usage: qt_target_link_libraries(<target> ... <item> ...)
|
||||
# link targets for founded Qt versions, target names is <name><TARGET_SUFFIX_Qt?>
|
||||
# all needed Qt libraries automatic added to corresponding targets
|
||||
# if QT_MULTILIB_LIST contains some linking library, to it name automatic
|
||||
# add <MULTILIB_SUFFIX_Qt?> or individual <MULTILIB_>libname<_SUFFIX_Qt?>
|
||||
macro(qt_target_link_libraries _NAME)
|
||||
foreach(_v ${_QT_VERSIONS_})
|
||||
if (LOCAL_FOUND${_v})
|
||||
set(_TARGET ${_NAME}${TARGET_SUFFIX_Qt${_v}})
|
||||
set(_ARGS)
|
||||
foreach(_i ${ARGN})
|
||||
set(_ind -1)
|
||||
list(FIND QT_MULTILIB_LIST "${_i}" _ind)
|
||||
if (_ind GREATER -1)
|
||||
_qt_multitarget_suffix_(_TS ${_i} ${_v})
|
||||
list(APPEND _ARGS ${_i}${_TS})
|
||||
else()
|
||||
list(APPEND _ARGS ${_i})
|
||||
endif()
|
||||
endforeach()
|
||||
target_link_libraries(${_TARGET} ${Qt${_v}_LIBRARIES} ${_ARGS})
|
||||
#message("link ${_TARGET}: ${Qt${_v}_LIBRARIES} ${_ARGS}")
|
||||
endif()
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
|
||||
# usage: qt_target_compile_definitions(...), syntax similar to original "target_compile_definitions()"
|
||||
# Specify compile definitions to use when compiling a given <target>
|
||||
macro(qt_target_compile_definitions _NAME)
|
||||
foreach(_v ${_QT_VERSIONS_})
|
||||
if (LOCAL_FOUND${_v})
|
||||
set(_TARGET ${_NAME}${TARGET_SUFFIX_Qt${_v}})
|
||||
target_compile_definitions(${_TARGET} ${ARGN})
|
||||
endif()
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
|
||||
# usage: qt_target_include_directories(...), syntax similar to original "target_include_directories()"
|
||||
# Add include directories to a target
|
||||
macro(qt_target_include_directories _NAME)
|
||||
foreach(_v ${_QT_VERSIONS_})
|
||||
if (LOCAL_FOUND${_v})
|
||||
set(_TARGET ${_NAME}${TARGET_SUFFIX_Qt${_v}})
|
||||
target_include_directories(${_TARGET} ${ARGN})
|
||||
endif()
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
|
||||
# usage: qt_install(...), syntax similar to original "install()"
|
||||
# install targets for founded Qt versions
|
||||
# if DESTINATION set to "QtBin" files will be installed
|
||||
# to corresponding Qt binary directory
|
||||
# if DESTINATION set to "QtLang" files will be installed
|
||||
# to corresponding Qt translation directory
|
||||
# if DESTINATION starts with "QtPlugins" files will be installed
|
||||
# to corresponding Qt plugins directory
|
||||
# add LANG type for first argument
|
||||
macro(qt_install)
|
||||
set(_prev_inst)
|
||||
#message("command: ${ARGN}")
|
||||
foreach(_v ${_QT_VERSIONS_})
|
||||
if (LOCAL_FOUND${_v})
|
||||
set(_INST_LIST)
|
||||
set(_IS_TARGET 0)
|
||||
set(_IS_FILES 0)
|
||||
set(_IS_DEST 0)
|
||||
set(_IS_LANG 0)
|
||||
set(_INVALID 0)
|
||||
foreach(_i ${ARGN})
|
||||
if ("x${_i}" STREQUAL "xQtLang")
|
||||
set(_IS_LANG 1)
|
||||
endif()
|
||||
endforeach()
|
||||
foreach(_i ${ARGN})
|
||||
if (_IS_TARGET)
|
||||
set(_IS_TARGET 0)
|
||||
if (_${_i}_is_qt)
|
||||
set(_INST_LIST ${_INST_LIST} ${_i}${TARGET_SUFFIX_Qt${_v}})
|
||||
else()
|
||||
set(_INST_LIST ${_INST_LIST} ${_i})
|
||||
endif()
|
||||
else()
|
||||
if (_IS_FILES)
|
||||
set(_IS_FILES 0)
|
||||
if (_IS_LANG)
|
||||
if (("x${${_i}_Qt${_v}}" STREQUAL "x") OR ("x${_i}" STREQUAL "xDESTINATION"))
|
||||
#return()
|
||||
set(_INVALID 1)
|
||||
else()
|
||||
set(_INST_LIST ${_INST_LIST} ${${_i}_Qt${_v}})
|
||||
endif()
|
||||
else()
|
||||
set(_INST_LIST ${_INST_LIST} ${_i})
|
||||
endif()
|
||||
else()
|
||||
if (_IS_DEST)
|
||||
set(_IS_DEST 0)
|
||||
if ("x${_i}" STREQUAL "xQtBin")
|
||||
set(_INST_LIST ${_INST_LIST} "${Qt${_v}_BIN}")
|
||||
else()
|
||||
if ("x${_i}" STREQUAL "xQtLang")
|
||||
set(_INST_LIST ${_INST_LIST} "${Qt${_v}_LANG_DIR}")
|
||||
else()
|
||||
set(_ind -1)
|
||||
string(FIND "${_i}" "QtPlugins" _ind)
|
||||
if (_ind GREATER -1)
|
||||
string(REPLACE "QtPlugins" "${Qt${_v}_PLUGINS_DIR}" _o "${_i}")
|
||||
set(_INST_LIST ${_INST_LIST} "${_o}")
|
||||
else()
|
||||
string(REPLACE "\\" "/" _o "${_i}")
|
||||
set(_INST_LIST ${_INST_LIST} ${_o})
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
else()
|
||||
set(_ii ${_i})
|
||||
if ("x${_i}" STREQUAL "xTARGETS")
|
||||
set(_IS_TARGET 1)
|
||||
else()
|
||||
if ("x${_i}" STREQUAL "xFILES")
|
||||
set(_IS_FILES 1)
|
||||
else()
|
||||
if ("x${_i}" STREQUAL "xDESTINATION")
|
||||
set(_IS_DEST 1)
|
||||
else()
|
||||
if ("x${_i}" STREQUAL "xLANG")
|
||||
set(_IS_FILES 1)
|
||||
set(_IS_LANG 1)
|
||||
set(_ii "FILES")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
set(_INST_LIST ${_INST_LIST} ${_ii})
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
if (NOT _INVALID)
|
||||
if (NOT ("x${_prev_inst}" STREQUAL "x${_INST_LIST}"))
|
||||
#message("install: ${_INST_LIST}")
|
||||
install(${_INST_LIST})
|
||||
set(_prev_inst "${_INST_LIST}")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
endmacro()
|
||||
136
qad/cmake/TargetArch.cmake
Normal file
136
qad/cmake/TargetArch.cmake
Normal file
@@ -0,0 +1,136 @@
|
||||
# Based on the Qt 5 processor detection code, so should be very accurate
|
||||
# https://qt.gitorious.org/qt/qtbase/blobs/master/src/corelib/global/qprocessordetection.h
|
||||
# Currently handles arm (v5, v6, v7), x86 (32/64), ia64, and ppc (32/64)
|
||||
|
||||
# Regarding POWER/PowerPC, just as is noted in the Qt source,
|
||||
# "There are many more known variants/revisions that we do not handle/detect."
|
||||
|
||||
set(archdetect_c_code "
|
||||
#if defined(__aarch64__)
|
||||
#error cmake_ARCH arm64
|
||||
#elif defined(__arm__) || defined(__TARGET_ARCH_ARM)
|
||||
#if defined(__ARM_ARCH_7__) \\
|
||||
|| defined(__ARM_ARCH_7A__) \\
|
||||
|| defined(__ARM_ARCH_7R__) \\
|
||||
|| defined(__ARM_ARCH_7M__) \\
|
||||
|| (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 7)
|
||||
#error cmake_ARCH armv7
|
||||
#elif defined(__ARM_ARCH_6__) \\
|
||||
|| defined(__ARM_ARCH_6J__) \\
|
||||
|| defined(__ARM_ARCH_6T2__) \\
|
||||
|| defined(__ARM_ARCH_6Z__) \\
|
||||
|| defined(__ARM_ARCH_6K__) \\
|
||||
|| defined(__ARM_ARCH_6ZK__) \\
|
||||
|| defined(__ARM_ARCH_6M__) \\
|
||||
|| (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 6)
|
||||
#error cmake_ARCH armv6
|
||||
#elif defined(__ARM_ARCH_5TEJ__) \\
|
||||
|| (defined(__TARGET_ARCH_ARM) && __TARGET_ARCH_ARM-0 >= 5)
|
||||
#error cmake_ARCH armv5
|
||||
#else
|
||||
#error cmake_ARCH arm
|
||||
#endif
|
||||
#elif defined(__i386) || defined(__i386__) || defined(_M_IX86)
|
||||
#error cmake_ARCH i386
|
||||
#elif defined(__x86_64) || defined(__x86_64__) || defined(__amd64) || defined(_M_X64)
|
||||
#error cmake_ARCH x86_64
|
||||
#elif defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
|
||||
#error cmake_ARCH ia64
|
||||
#elif defined(__ppc__) || defined(__ppc) || defined(__powerpc__) \\
|
||||
|| defined(_ARCH_COM) || defined(_ARCH_PWR) || defined(_ARCH_PPC) \\
|
||||
|| defined(_M_MPPC) || defined(_M_PPC)
|
||||
#if defined(__ppc64__) || defined(__powerpc64__) || defined(__64BIT__)
|
||||
#error cmake_ARCH ppc64
|
||||
#else
|
||||
#error cmake_ARCH ppc
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#error cmake_ARCH unknown
|
||||
")
|
||||
|
||||
# Set ppc_support to TRUE before including this file or ppc and ppc64
|
||||
# will be treated as invalid architectures since they are no longer supported by Apple
|
||||
|
||||
function(target_architecture output_var)
|
||||
if(APPLE AND CMAKE_OSX_ARCHITECTURES)
|
||||
# On OS X we use CMAKE_OSX_ARCHITECTURES *if* it was set
|
||||
# First let's normalize the order of the values
|
||||
|
||||
# Note that it's not possible to compile PowerPC applications if you are using
|
||||
# the OS X SDK version 10.6 or later - you'll need 10.4/10.5 for that, so we
|
||||
# disable it by default
|
||||
# See this page for more information:
|
||||
# http://stackoverflow.com/questions/5333490/how-can-we-restore-ppc-ppc64-as-well-as-full-10-4-10-5-sdk-support-to-xcode-4
|
||||
|
||||
# Architecture defaults to i386 or ppc on OS X 10.5 and earlier, depending on the CPU type detected at runtime.
|
||||
# On OS X 10.6+ the default is x86_64 if the CPU supports it, i386 otherwise.
|
||||
|
||||
foreach(osx_arch ${CMAKE_OSX_ARCHITECTURES})
|
||||
if("${osx_arch}" STREQUAL "ppc" AND ppc_support)
|
||||
set(osx_arch_ppc TRUE)
|
||||
elseif("${osx_arch}" STREQUAL "i386")
|
||||
set(osx_arch_i386 TRUE)
|
||||
elseif("${osx_arch}" STREQUAL "x86_64")
|
||||
set(osx_arch_x86_64 TRUE)
|
||||
elseif("${osx_arch}" STREQUAL "ppc64" AND ppc_support)
|
||||
set(osx_arch_ppc64 TRUE)
|
||||
else()
|
||||
message(FATAL_ERROR "Invalid OS X arch name: ${osx_arch}")
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
# Now add all the architectures in our normalized order
|
||||
if(osx_arch_ppc)
|
||||
list(APPEND ARCH ppc)
|
||||
endif()
|
||||
|
||||
if(osx_arch_i386)
|
||||
list(APPEND ARCH i386)
|
||||
endif()
|
||||
|
||||
if(osx_arch_x86_64)
|
||||
list(APPEND ARCH x86_64)
|
||||
endif()
|
||||
|
||||
if(osx_arch_ppc64)
|
||||
list(APPEND ARCH ppc64)
|
||||
endif()
|
||||
else()
|
||||
file(WRITE "${CMAKE_BINARY_DIR}/arch.c" "${archdetect_c_code}")
|
||||
|
||||
enable_language(C)
|
||||
|
||||
# Detect the architecture in a rather creative way...
|
||||
# This compiles a small C program which is a series of ifdefs that selects a
|
||||
# particular #error preprocessor directive whose message string contains the
|
||||
# target architecture. The program will always fail to compile (both because
|
||||
# file is not a valid C program, and obviously because of the presence of the
|
||||
# #error preprocessor directives... but by exploiting the preprocessor in this
|
||||
# way, we can detect the correct target architecture even when cross-compiling,
|
||||
# since the program itself never needs to be run (only the compiler/preprocessor)
|
||||
try_run(
|
||||
run_result_unused
|
||||
compile_result_unused
|
||||
"${CMAKE_BINARY_DIR}"
|
||||
"${CMAKE_BINARY_DIR}/arch.c"
|
||||
COMPILE_OUTPUT_VARIABLE ARCH
|
||||
CMAKE_FLAGS CMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
|
||||
)
|
||||
|
||||
# Parse the architecture name from the compiler output
|
||||
string(REGEX MATCH "cmake_ARCH ([a-zA-Z0-9_]+)" ARCH "${ARCH}")
|
||||
|
||||
# Get rid of the value marker leaving just the architecture name
|
||||
string(REPLACE "cmake_ARCH " "" ARCH "${ARCH}")
|
||||
|
||||
# If we are compiling with an unknown architecture this variable should
|
||||
# already be set to "unknown" but in the case that it's empty (i.e. due
|
||||
# to a typo in the code), then set it to unknown
|
||||
if (NOT ARCH)
|
||||
set(ARCH unknown)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(${output_var} "${ARCH}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
Reference in New Issue
Block a user