aboutsummaryrefslogtreecommitdiffstats
path: root/cmake/QbsBuildConfig.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/QbsBuildConfig.cmake')
-rw-r--r--cmake/QbsBuildConfig.cmake253
1 files changed, 253 insertions, 0 deletions
diff --git a/cmake/QbsBuildConfig.cmake b/cmake/QbsBuildConfig.cmake
new file mode 100644
index 000000000..b6614ce3f
--- /dev/null
+++ b/cmake/QbsBuildConfig.cmake
@@ -0,0 +1,253 @@
+option(WITH_TESTS "Build Tests" ON)
+option(WITH_UNIT_TESTS "Build Unit Tests" OFF)
+option(WITH_PROJECT_FILE_UPDATES "Enable project file updates support" ON)
+option(INSTALL_PUBLIC_HEADERS "Whether to install public headers" ON)
+option(QBS_ENABLE_RPATH "Whether to enable RPATH" ON)
+option(QBS_INSTALL_HTML_DOCS "Whether to install HTML Documentation" OFF)
+option(QBS_INSTALL_QCH_DOCS "Whether to install QCH Documentation" OFF)
+
+set(QBS_APP_INSTALL_DIR "bin" CACHE STRING "Relative install location for Qbs binaries.")
+# default paths
+set(QBS_LIBDIR_NAME "lib")
+if(WIN32)
+ set(_DEFAULT_LIB_INSTALL_DIR ${QBS_APP_INSTALL_DIR})
+ set(_DEFAULT_LIBEXEC_INSTALL_DIR ${QBS_APP_INSTALL_DIR})
+else()
+ set(_DEFAULT_LIB_INSTALL_DIR ${QBS_LIBDIR_NAME})
+ set(_DEFAULT_LIBEXEC_INSTALL_DIR "libexec/qbs")
+endif()
+
+# path options
+set(QBS_OUTPUT_PREFIX "" CACHE STRING "Qbs build output location relative to CMAKE_BINARY_DIR.")
+set(QBS_LIB_INSTALL_DIR "${_DEFAULT_LIB_INSTALL_DIR}" CACHE STRING "Relative install location for Qbs libraries.")
+set(QBS_DLL_INSTALL_DIR "${QBS_LIB_INSTALL_DIR}" CACHE STRING "Relative install location for Qbs DLLs.")
+set(QBS_LIBEXEC_INSTALL_DIR "${_DEFAULT_LIBEXEC_INSTALL_DIR}" CACHE STRING "Relative install location for Qbs libexec.")
+set(QBS_PLUGINS_INSTALL_BASE "${QBS_LIBDIR_NAME}" CACHE STRING "Relative install location for Qbs plugins.")
+set(QBS_RESOURCES_INSTALL_BASE "." CACHE STRING "Relative install location for Qbs resources.")
+set(QBS_HEADERS_INSTALL_DIR "include/qbs" CACHE STRING "Relative install location for Qbs headers.")
+set(QBS_DOC_INSTALL_DIR "${QBS_RESOURCES_INSTALL_BASE}/share/doc/qbs/html" CACHE STRING "Relative install location for Qbs documentation.")
+
+set(QBS_PLUGINS_INSTALL_DIR "${QBS_PLUGINS_INSTALL_BASE}/qbs/plugins")
+set(QBS_RESOURCES_INSTALL_DIR "${QBS_RESOURCES_INSTALL_BASE}/share")
+
+# rpaths
+file(RELATIVE_PATH QBS_RELATIVE_LIBEXEC_RPATH "/${QBS_LIBEXEC_INSTALL_DIR}" "/${QBS_LIB_INSTALL_DIR}")
+file(RELATIVE_PATH QBS_RELATIVE_APP_RPATH "/${QBS_APP_INSTALL_DIR}" "/${QBS_LIB_INSTALL_DIR}")
+file(RELATIVE_PATH QBS_RELATIVE_PLUGINS_RPATH "/${QBS_PLUGINS_INSTALL_DIR}" "/${QBS_LIB_INSTALL_DIR}")
+
+if(WIN32 OR NOT QBS_ENABLE_RPATH)
+ set(QBS_LIB_RPATH "")
+ set(QBS_LIBEXEC_RPATH "")
+ set(QBS_APP_RPATH "")
+ set(QBS_PLUGINS_RPATH "")
+elseif(APPLE)
+ set(QBS_LIB_RPATH "@loader_path")
+ set(QBS_LIBEXEC_RPATH "@loader_path/${QBS_RELATIVE_LIBEXEC_RPATH}")
+ set(QBS_APP_RPATH "@loader_path/${QBS_RELATIVE_APP_RPATH}")
+ set(QBS_PLUGINS_RPATH "@loader_path/${QBS_RELATIVE_PLUGINS_RPATH}")
+else()
+ set(QBS_LIB_RPATH "\$ORIGIN")
+ set(QBS_LIBEXEC_RPATH "\$ORIGIN/${QBS_RELATIVE_LIBEXEC_RPATH}")
+ set(QBS_APP_RPATH "\$ORIGIN/${QBS_RELATIVE_APP_RPATH}")
+ set(QBS_PLUGINS_RPATH "\$ORIGIN/${QBS_RELATIVE_PLUGINS_RPATH}")
+endif()
+
+function(get_update_path_command var)
+ if(WIN32)
+ get_target_property(_QTCORE_LIBRARY Qt5::Core IMPORTED_LOCATION_RELEASE)
+ if(NOT _QTCORE_LIBRARY)
+ get_target_property(_QTCORE_LIBRARY Qt5::Core IMPORTED_LOCATION_DEBUG)
+ endif()
+ get_filename_component(_QT_LIBRARY_PATH "${_QTCORE_LIBRARY}" DIRECTORY)
+ get_target_property(_QBS_LIBRARY_PATH qbscore LIBRARY_OUTPUT_DIRECTORY)
+ file(TO_NATIVE_PATH "${_QT_LIBRARY_PATH}\;${_QBS_LIBRARY_PATH}\;$ENV{PATH}" _NEW_PATH)
+ set(${var} "PATH=${_NEW_PATH}" PARENT_SCOPE)
+ else()
+ set(${var} "")
+ endif()
+endfunction()
+
+if(WITH_UNIT_TESTS)
+ set(QBS_UNIT_TESTS_DEFINES "QBS_ENABLE_UNIT_TESTS")
+else()
+ set(QBS_UNIT_TESTS_DEFINES "")
+endif()
+
+if(WITH_PROJECT_FILE_UPDATES)
+ set(QBS_PROJECT_FILE_UPDATES_DEFINES "QBS_ENABLE_PROJECT_FILE_UPDATES")
+else()
+ set(QBS_PROJECT_FILE_UPDATES_DEFINES "")
+endif()
+
+file(RELATIVE_PATH QBS_RELATIVE_LIBEXEC_PATH "/${QBS_APP_INSTALL_DIR}" "/${QBS_LIBEXEC_INSTALL_DIR}")
+file(RELATIVE_PATH QBS_RELATIVE_SEARCH_PATH "/${QBS_APP_INSTALL_DIR}" "/${QBS_RESOURCES_INSTALL_BASE}")
+file(RELATIVE_PATH QBS_RELATIVE_PLUGINS_PATH "/${QBS_APP_INSTALL_DIR}" "/${QBS_PLUGINS_INSTALL_BASE}")
+
+set(DEFAULT_DEFINES "")
+if(WIN32)
+ list(APPEND DEFAULT_DEFINES UNICODE _UNICODE _SCL_SECURE_NO_WARNINGS)
+endif()
+
+# CMake 3.10 doesn't have list(TRANSFORM)
+function(list_transform_prepend var prefix)
+ set(temp "")
+ foreach(f ${${var}})
+ list(APPEND temp "${prefix}${f}")
+ endforeach()
+ set(${var} "${temp}" PARENT_SCOPE)
+endfunction()
+
+function(add_qbs_app target_name)
+ cmake_parse_arguments(_arg
+ ""
+ "DESTINATION"
+ "DEFINES;PUBLIC_DEFINES;DEPENDS;PUBLIC_DEPENDS;INCLUDES;PUBLIC_INCLUDES;SOURCES;"
+ ${ARGN}
+ )
+
+ if (${_arg_UNPARSED_ARGUMENTS})
+ message(FATAL_ERROR "add_qbs_app had unparsed arguments")
+ endif()
+
+ set(_DESTINATION "${QBS_APP_INSTALL_DIR}")
+ if(_arg_DESTINATION)
+ set(_DESTINATION "${_arg_DESTINATION}")
+ endif()
+
+ add_executable(${target_name} ${_arg_SOURCES})
+ target_compile_definitions(
+ ${target_name} PRIVATE ${_arg_DEFINES} ${DEFAULT_DEFINES} PUBLIC ${_arg_PUBLIC_DEFINES})
+ target_include_directories(
+ ${target_name} PRIVATE ${_arg_INCLUDES} PUBLIC ${_arg_PUBLIC_INCLUDES})
+ target_link_libraries(${target_name} PRIVATE ${_arg_DEPENDS} PUBLIC ${_arg_PUBLIC_DEPENDS})
+
+ set_target_properties(${target_name} PROPERTIES
+ RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${QBS_OUTPUT_PREFIX}${_DESTINATION}
+ BUILD_RPATH "${QBS_APP_RPATH}"
+ INSTALL_RPATH "${QBS_APP_RPATH}"
+ )
+ install(TARGETS ${target_name} RUNTIME DESTINATION ${_DESTINATION})
+endfunction()
+
+function(add_qbs_library target_name)
+ cmake_parse_arguments(_arg
+ "STATIC"
+ ""
+ "DEFINES;PUBLIC_DEFINES;DEPENDS;PUBLIC_DEPENDS;INCLUDES;PUBLIC_INCLUDES;SOURCES;"
+ ${ARGN}
+ )
+
+ if (${_arg_UNPARSED_ARGUMENTS})
+ message(FATAL_ERROR "add_qbs_library had unparsed arguments")
+ endif()
+
+ set(library_type SHARED)
+ if (_arg_STATIC)
+ set(library_type STATIC)
+ endif()
+
+ string(REGEX REPLACE "\\.[0..9]+$" "" _SOVERSION ${QBS_VERSION})
+
+ add_library(${target_name} ${library_type} ${_arg_SOURCES})
+ target_compile_definitions(
+ ${target_name}
+ PRIVATE ${_arg_DEFINES} ${DEFAULT_DEFINES}
+ PUBLIC ${_arg_PUBLIC_DEFINES})
+ target_include_directories(
+ ${target_name}
+ PRIVATE ${_arg_INCLUDES}
+ PUBLIC ${_arg_PUBLIC_INCLUDES}
+ INTERFACE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/>)
+ target_link_libraries(${target_name} PRIVATE ${_arg_DEPENDS} PUBLIC ${_arg_PUBLIC_DEPENDS})
+
+ set_target_properties(${target_name} PROPERTIES
+ ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${QBS_OUTPUT_PREFIX}${QBS_LIB_INSTALL_DIR}
+ LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${QBS_OUTPUT_PREFIX}${QBS_LIB_INSTALL_DIR}
+ RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${QBS_OUTPUT_PREFIX}${QBS_DLL_INSTALL_DIR}
+ BUILD_RPATH "${QBS_LIB_RPATH}"
+ INSTALL_RPATH "${QBS_LIB_RPATH}"
+ SOVERSION ${_SOVERSION}
+ VERSION ${QBS_VERSION}
+ )
+ if (NOT _arg_STATIC)
+ install(TARGETS ${target_name}
+ LIBRARY DESTINATION ${QBS_LIB_INSTALL_DIR}
+ RUNTIME DESTINATION ${QBS_DLL_INSTALL_DIR}
+ )
+ endif()
+endfunction()
+
+function(add_qbs_plugin target_name)
+ cmake_parse_arguments(_arg
+ ""
+ ""
+ "DEFINES;PUBLIC_DEFINES;DEPENDS;PUBLIC_DEPENDS;INCLUDES;PUBLIC_INCLUDES;SOURCES;"
+ ${ARGN}
+ )
+
+ if (${_arg_UNPARSED_ARGUMENTS})
+ message(FATAL_ERROR "add_qbs_plugin had unparsed arguments")
+ endif()
+
+ add_library(${target_name} SHARED ${_arg_SOURCES})
+ target_compile_definitions(
+ ${target_name} PRIVATE ${_arg_DEFINES} ${DEFAULT_DEFINES} PUBLIC ${_arg_PUBLIC_DEFINES})
+ target_include_directories(
+ ${target_name} PRIVATE ${_arg_INCLUDES} PUBLIC ${_arg_PUBLIC_INCLUDES})
+ target_link_libraries(${target_name} PRIVATE ${_arg_DEPENDS} PUBLIC ${_arg_PUBLIC_DEPENDS})
+
+ set_target_properties(${target_name} PROPERTIES
+ LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${QBS_OUTPUT_PREFIX}${QBS_PLUGINS_INSTALL_DIR}
+ RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${QBS_OUTPUT_PREFIX}${QBS_PLUGINS_INSTALL_DIR}
+ BUILD_RPATH "${QBS_PLUGINS_RPATH}"
+ INSTALL_RPATH "${QBS_PLUGINS_RPATH}"
+ )
+ install(TARGETS ${target_name}
+ LIBRARY DESTINATION ${QBS_PLUGINS_INSTALL_DIR}
+ RUNTIME DESTINATION ${QBS_PLUGINS_INSTALL_DIR}
+ )
+endfunction()
+
+function(add_qbs_test test_name)
+ cmake_parse_arguments(_arg
+ ""
+ ""
+ "DEFINES;PUBLIC_DEFINES;DEPENDS;PUBLIC_DEPENDS;INCLUDES;PUBLIC_INCLUDES;SOURCES;"
+ ${ARGN}
+ )
+
+ if (${_arg_UNPARSED_ARGUMENTS})
+ message(FATAL_ERROR "add_qbs_test had unparsed arguments")
+ endif()
+
+ set(target_name "tst_${test_name}")
+
+ string(TOUPPER ${test_name} suite_name) # cmake is beatiful, here we have <input, output>
+ string(REPLACE - _ suite_name ${suite_name}) # and here we have <output, input>
+
+ add_executable(${target_name} ${_arg_SOURCES})
+ target_compile_definitions(${target_name} PRIVATE
+ "QBS_TEST_SUITE_NAME=\"${suite_name}\""
+ "SRCDIR=\"${CMAKE_CURRENT_SOURCE_DIR}\""
+ )
+ target_compile_definitions(
+ ${target_name} PRIVATE ${_arg_DEFINES} ${DEFAULT_DEFINES} PUBLIC ${_arg_PUBLIC_DEFINES})
+ target_include_directories(
+ ${target_name}
+ PRIVATE ${_arg_INCLUDES} "${CMAKE_CURRENT_SOURCE_DIR}/../../../src"
+ PUBLIC ${_arg_PUBLIC_INCLUDES}
+ )
+ target_link_libraries(
+ ${target_name}
+ PRIVATE ${_arg_DEPENDS} qbscore qbsconsolelogger Qt5::Test
+ PUBLIC ${_arg_PUBLIC_DEPENDS}
+ )
+
+ set_target_properties(${target_name} PROPERTIES
+ RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${QBS_OUTPUT_PREFIX}${QBS_APP_INSTALL_DIR}
+ BUILD_RPATH "${QBS_APP_RPATH}"
+ INSTALL_RPATH "${QBS_APP_RPATH}"
+ )
+ install(TARGETS ${target_name} RUNTIME DESTINATION ${QBS_APP_INSTALL_DIR})
+ add_test(NAME ${target_name} COMMAND ${target_name})
+endfunction()