Files
cmake/SHSTKMacros.cmake
2020-09-06 22:50:59 +03:00

379 lines
10 KiB
CMake

#[[
shstk_define_option(name desc)
shstk_begin_project(domain module)
shstk_install(dir is_app target h_files)
shstk_is_parent_exists(out)
shstk_copy_to_parent(domain)
shstk_add_directories(domain)
shstk_add_directories_with_include(is_qt domain)
shstk_set_find_dirs(domain)
shstk_find_header(module filename add_find_info)
align_list(list out)
print_list(list title prefix)
]]
find_package(MinGW REQUIRED)
include(GenerateExportHeader)
include(DeployMacros)
macro(shstk_define_option name desc)
if (NOT DEFINED ${name})
option(${name} ${desc} ${ARGN})
#message("define option ${name} ${desc} ${ARGN}")
endif()
endmacro()
macro(shstk_begin_project domain module)
set(INSTALL_PREFIX)
set(_plugins_default_ 1)
if (CMAKE_CROSSCOMPILING)
if (DEFINED ANDROID_PLATFORM)
set(INSTALL_PREFIX "${CMAKE_FIND_ROOT_PATH}/")
set(_plugins_default_ 0)
else()
set(INSTALL_PREFIX "${CMAKE_STAGING_PREFIX}")
endif()
endif()
if (NOT DEFINED BUILD_NUMBER)
set(BUILD_NUMBER 9999)
endif()
if("x${BUILD_NUMBER}" STREQUAL "x")
set(BUILD_NUMBER 0)
endif()
shstk_define_option(LOCAL "Local install" OFF)
shstk_define_option(STATIC_LIB "Build static libraries" OFF)
set(_path "local \"bin\", \"lib\" and \"include\"")
if (NOT LOCAL)
if (WIN32)
if (MINGW)
set(CMAKE_INSTALL_PREFIX ${MINGW_DIR})
endif()
else()
if (DEFINED ANDROID_PLATFORM)
set(CMAKE_INSTALL_PREFIX ${ANDROID_SYSTEM_LIBRARY_PATH}/usr)
else()
if (CMAKE_CROSSCOMPILING)
set(CMAKE_INSTALL_PREFIX ${CMAKE_STAGING_PREFIX})
else()
set(CMAKE_INSTALL_PREFIX ${INSTALL_PREFIX}/usr/local)
endif()
endif()
endif()
set(_path "\"${CMAKE_INSTALL_PREFIX}\"")
endif()
if (NOT _install_msg)
set(_install_msg ON) # CACHE STRING "shstk_install_msg")
message(STATUS "Install to ${_path}")
endif()
if (CMAKE_BUILD_TYPE MATCHES Debug)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g3 -Wall")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g3 -Wall")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -Wall")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -Wall")
endif()
if(MINGW)
list(APPEND CMAKE_LIBRARY_PATH ${MINGW_LIB})
endif()
if(APPLE)
set(CMAKE_INSTALL_RPATH "@executable_path/../Frameworks;@executable_path/lib;@loader_path/../lib")
set(CMAKE_MACOSX_RPATH TRUE)
if (CMAKE_CROSSCOMPILING)
set(CMAKE_INSTALL_NAME_DIR "@rpath")
else()
include_directories(/usr/local/include)
link_directories(/usr/local/lib)
endif()
else()
set(CMAKE_INSTALL_RPATH "\$ORIGIN;\$ORIGIN/lib")
endif()
if (DEFINED ANDROID_PLATFORM)
include_directories(${ANDROID_SYSTEM_LIBRARY_PATH}/usr/include)
endif()
set(_qt_libs )
set(_qt_apps )
set(_qt_plugs)
if (NOT "x${domain}" STREQUAL "x")
set(BUILDING_${domain} ON CACHE BOOL "build ${domain}")
set(${domain}_ROOT_SRC "${CMAKE_CURRENT_SOURCE_DIR}" CACHE STRING "")
set(${domain}_ROOT_BIN "${CMAKE_CURRENT_BINARY_DIR}" CACHE STRING "")
set(SET_TARGETS_${domain} OFF CACHE BOOL "" FORCE)
if(STATIC_LIB)
add_definitions(-D${module}_STATIC_DEFINE)
set(${domain}_LIB_TYPE STATIC)
set(${domain}_LIB_TYPE_MSG "Static")
else()
set(${domain}_LIB_TYPE SHARED)
set(${domain}_LIB_TYPE_MSG "Shared")
endif()
if (CMAKE_BUILD_TYPE MATCHES Debug)
set(${domain}_BUILD_TYPE "Debug")
#add_definitions(-DPIP_DEBUG)
else()
set(${domain}_BUILD_TYPE "Release")
endif()
#set(${domain}_MAJOR 1)
#set(${domain}_MINOR 8)
#set(${domain}_REVISION 0)
#set(${domain}_SUFFIX )
#set(${domain}_COMPANY SHS)
#set(${domain}_DOMAIN org.SHS)
set(${domain}_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/${domain}_version.h")
set_version(${domain}
MAJOR "${${domain}_MAJOR}"
MINOR "${${domain}_MINOR}"
REVISION "${${domain}_REVISION}"
BUILD "${BUILD_NUMBER}"
SUFFIX "${${domain}_SUFFIX}"
OUTPUT "${${domain}_VERSION_FILE}")
set_deploy_property(${domain} ${${domain}_LIB_TYPE}
FULLNAME "${${domain}_DOMAIN}.*"
COMPANY "${${domain}_COMPANY}")
endif()
endmacro()
macro(shstk_install _dir is_app _target _h_files)
if((NOT ${is_app}) AND (NOT "x${_h_files}" STREQUAL "x"))
if(LOCAL)
install(FILES ${_h_files} DESTINATION include/${_dir})
else()
if(WIN32)
install(FILES ${_h_files} DESTINATION ${MINGW_INCLUDE}/${_dir})
else()
install(FILES ${_h_files} DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${_dir})
endif()
endif()
endif()
if (NOT "x${_target}" STREQUAL "x")
if(LOCAL)
if(${is_app})
install(TARGETS ${_target} DESTINATION bin)
else()
if(WIN32)
install(TARGETS ${_target} RUNTIME DESTINATION bin)
install(TARGETS ${_target} ARCHIVE DESTINATION lib)
else()
install(TARGETS ${_target} DESTINATION lib)
endif()
endif()
else()
if(WIN32)
if (${is_app})
install(TARGETS ${_target} DESTINATION ${MINGW_BIN})
else()
install(TARGETS ${_target} ARCHIVE DESTINATION ${MINGW_LIB})
install(TARGETS ${_target} RUNTIME DESTINATION ${MINGW_BIN})
endif()
else()
if (${is_app})
install(TARGETS ${_target} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin)
else()
install(TARGETS ${_target} DESTINATION ${CMAKE_INSTALL_PREFIX}/lib)
endif()
endif()
endif()
endif()
endmacro()
macro(shstk_is_parent_exists _out)
set(${_out} FALSE)
get_property(_pd DIRECTORY PROPERTY PARENT_DIRECTORY)
if (NOT "x${_pd}" STREQUAL "x")
set(${_out} TRUE)
endif()
endmacro()
macro(shstk_copy_to_parent)
shstk_is_parent_exists(_pe)
if (_pe)
set(QT_MULTILIB_LIST ${QT_MULTILIB_LIST} PARENT_SCOPE)
set(_qt_libs ${_qt_libs} PARENT_SCOPE)
set(_qt_apps ${_qt_apps} PARENT_SCOPE)
set(_qt_plugs ${_qt_plugs} PARENT_SCOPE)
endif()
endmacro()
macro(shstk_add_directories domain)
file(GLOB _dl "[^.]*")
foreach(_d ${_dl})
if(IS_DIRECTORY ${_d})
add_subdirectory(${_d})
endif()
endforeach()
shstk_copy_to_parent()
endmacro()
macro(shstk_add_directories_with_include is_qt domain)
set(DIRS)
file(GLOB _dl "[^.]*")
foreach(_d ${_dl})
if(IS_DIRECTORY ${_d})
list(APPEND DIRS ${_d})
endif()
endforeach()
foreach(_d ${DIRS})
get_filename_component(_dname "${_d}" NAME)
if (${is_qt})
list(APPEND QT_MULTILIB_LIST ${domain}${_dname})
#set(QT_MULTILIB_LIST "${QT_MULTILIB_LIST}" CACHE STRING "")
endif()
endforeach()
foreach(_d ${DIRS})
add_subdirectory(${_d})
endforeach()
shstk_copy_to_parent()
endmacro()
macro(shstk_set_find_dirs domain)
#set(_PIP_INCDIR "${PIP_DIR}/include/pip")
#set(_PIP_LIBDIR "${PIP_DIR}/lib")
set(${domain}_INCDIR)
set(${domain}_LIBDIR)
set(${domain}_BINDIR)
set(${domain}_FIND_PROGRAM_ARG)
set(${domain}_BINEXT "")
#if (BUILDING_${domain})
# list(APPEND ${domain}_INCDIR "${${domain}_ROOT_SRC}")
# list(APPEND ${domain}_LIBDIR "${${domain}_ROOT_BIN}")
#endif()
if(MINGW_INCLUDE)
list(APPEND ${domain}_INCDIR "${MINGW_INCLUDE}/${domain}")
list(APPEND ${domain}_LIBDIR "${MINGW_LIB}")
list(APPEND ${domain}_BINDIR "${MINGW_BIN}")
endif()
if(CMAKE_CROSSCOMPILING)
list(APPEND ${domain}_INCDIR "${CMAKE_PREFIX_PATH}/include/${domain}")
list(APPEND ${domain}_LIBDIR "${CMAKE_PREFIX_PATH}/lib")
set(${domain}_FIND_PROGRAM_ARG "NO_DEFAULT_PATH")
list(APPEND ${domain}_BINDIR "/usr/bin" "/usr/local/bin")
include_directories(${CMAKE_PREFIX_PATH}/include)
link_directories(${CMAKE_PREFIX_PATH}/lib)
else()
list(APPEND ${domain}_BINDIR "${CMAKE_PREFIX_PATH}/bin")
if(NOT WIN32)
list(APPEND ${domain}_INCDIR "/usr/include/${domain}" "/usr/local/include/${domain}")
list(APPEND ${domain}_LIBDIR "/usr/lib" "/usr/local/lib")
endif()
if(APPLE)
include_directories(/usr/local/include)
link_directories(/usr/local/lib)
endif()
endif()
if ("x${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "xWindows")
set(${domain}_BINEXT ".exe")
if (CMAKE_CROSSCOMPILING)
set(${domain}_FIND_PROGRAM_ARG)
endif()
endif()
#list(APPEND ${domain}_BINDIR "${PIP_DIR}/bin")
endmacro()
macro(shstk_find_header domain module filename add_find_info)
if(NOT ${module}_VERSION)
find_file(${domain}_H_INCLUDE "${filename}" HINTS ${${domain}_INCDIR})
#message("${domain}_H_INCLUDE \"${filename}\" HINTS \"${${domain}_INCDIR}\" = \"${${domain}_H_INCLUDE}\"")
if (NOT ${domain}_H_INCLUDE)
message(FATAL_ERROR "Can`t find ${module} version file (\"${filename}\")!")
endif()
#if (DEFINED ANDROID_PLATFORM)
# set(CD_INCLUDES ${ANDROID_SYSTEM_LIBRARY_PATH}/usr/include/${domain})
#else()
get_filename_component(_inc ${${domain}_H_INCLUDE} PATH)
set(${domain}_INCLUDES "${_inc}" CACHE STRING "")
#endif()
include(CheckSymbolExists)
check_symbol_exists(${module}_VERSION_NAME "${${domain}_H_INCLUDE}" _version_found)
if (_version_found)
file(STRINGS "${${domain}_H_INCLUDE}" _version REGEX "^[ \t]*#define[ \t]+${module}_VERSION_NAME+[ \t]+.*$")
string(REGEX MATCH "\".*\"" _version ${_version})
string(LENGTH ${_version} SL)
math(EXPR SL ${SL}-2)
string(SUBSTRING ${_version} 1 ${SL} _version)
set(${module}_VERSION ${_version} CACHE STRING "${module}_VERSION")
if (NOT _FIND_${module}_MSG)
set(_FIND_${module}_MSG 1 CACHE BOOL "find_msg_${module}" FORCE)
set(_afi)
if (NOT "x${add_find_info}" STREQUAL "x")
set(_afi ": ${add_find_info}")
endif()
message(STATUS "Found ${module}${_afi} (version \"${${module}_VERSION}\")")
endif()
else()
message(FATAL_ERROR "Can`t find ${module}_VERSION_NAME in \"${filename}\"!")
endif()
endif()
if(${module}_FIND_VERSION VERSION_GREATER ${module}_VERSION)
message(FATAL_ERROR "${module} version ${${module}_VERSION} is available, but ${${module}_FIND_VERSION} requested!")
endif()
endmacro()
macro(align_list _list _out)
set(_max_len 0)
foreach(_m ${_list})
string(LENGTH "${_m}" _clen)
if (_clen GREATER _max_len)
set(_max_len ${_clen})
endif()
endforeach()
set(${_out})
foreach(_m ${_list})
set(_am "${_m}")
while(TRUE)
string(LENGTH "${_am}" _clen)
if (_clen GREATER_EQUAL ${_max_len})
break()
endif()
string(APPEND _am " ")
endwhile()
list(APPEND ${_out} "${_am}")
endforeach()
endmacro()
macro(print_list _list _title _prefix)
if (NOT "x${_list}" STREQUAL "x")
if (NOT "x${_title}" STREQUAL "x")
message("${_title}")
endif()
foreach(_m ${_list})
message("${_prefix}${_m}")
endforeach()
endif()
endmacro()