configure_qt.cmake 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. function(configure_qt)
  2. cmake_parse_arguments(_csc "" "SOURCE_PATH;TARGET_PLATFORM;HOST_PLATFORM;HOST_TOOLS_ROOT" "OPTIONS;OPTIONS_DEBUG;OPTIONS_RELEASE" ${ARGN})
  3. if(NOT _csc_TARGET_PLATFORM)
  4. message(FATAL_ERROR "configure_qt requires a TARGET_PLATFORM argument.")
  5. endif()
  6. if(DEFINED _csc_HOST_PLATFORM)
  7. list(APPEND _csc_OPTIONS -platform ${_csc_HOST_PLATFORM})
  8. endif()
  9. if(DEFINED _csc_HOST_TOOLS_ROOT)
  10. ## vcpkg internal file struture assumed here!
  11. message(STATUS "Building Qt with prepared host tools from ${_csc_HOST_TOOLS_ROOT}!")
  12. vcpkg_add_to_path("${_csc_HOST_TOOLS_ROOT}/bin")
  13. vcpkg_add_to_path("${_csc_HOST_TOOLS_ROOT}")
  14. set(EXT_BIN_DIR -external-hostbindir ${_csc_HOST_TOOLS_ROOT}/bin) # we only use release binaries for building
  15. find_program(QMAKE_COMMAND NAMES qmake PATHS ${_csc_HOST_TOOLS_ROOT}/bin NO_DEFAULT_PATH)
  16. set(INVOKE "${QMAKE_COMMAND}" )
  17. else()
  18. if(CMAKE_HOST_WIN32)
  19. set(CONFIGURE_BAT "configure.bat")
  20. else()
  21. set(CONFIGURE_BAT "configure")
  22. endif()
  23. set(INVOKE "${_csc_SOURCE_PATH}/${CONFIGURE_BAT}")
  24. endif()
  25. #Cleanup previous build folders
  26. file(REMOVE_RECURSE "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-rel" "${CURRENT_BUILDTREES_DIR}/${TARGET_TRIPLET}-dbg")
  27. #Find and ad Perl to PATH
  28. vcpkg_find_acquire_program(PERL)
  29. get_filename_component(PERL_EXE_PATH ${PERL} DIRECTORY)
  30. vcpkg_add_to_path("${PERL_EXE_PATH}")
  31. if("${VCPKG_LIBRARY_LINKAGE}" STREQUAL "static")
  32. list(APPEND _csc_OPTIONS -static)
  33. else()
  34. #list(APPEND _csc_OPTIONS_DEBUG -separate-debug-info)
  35. endif()
  36. if(VCPKG_TARGET_IS_WINDOWS AND "${VCPKG_CRT_LINKAGE}" STREQUAL "static")
  37. list(APPEND _csc_OPTIONS -static-runtime)
  38. endif()
  39. list(APPEND _csc_OPTIONS_RELEASE -release)
  40. list(APPEND _csc_OPTIONS_DEBUG -debug)
  41. #Replace with VCPKG variables if PR #7733 is merged
  42. unset(BUILDTYPES)
  43. if(NOT DEFINED VCPKG_BUILD_TYPE OR "${VCPKG_BUILD_TYPE}" STREQUAL "debug")
  44. set(_buildname "DEBUG")
  45. list(APPEND BUILDTYPES ${_buildname})
  46. set(_short_name_${_buildname} "dbg")
  47. set(_path_suffix_${_buildname} "/debug")
  48. set(_build_type_${_buildname} "debug")
  49. endif()
  50. if(NOT DEFINED VCPKG_BUILD_TYPE OR "${VCPKG_BUILD_TYPE}" STREQUAL "release")
  51. set(_buildname "RELEASE")
  52. list(APPEND BUILDTYPES ${_buildname})
  53. set(_short_name_${_buildname} "rel")
  54. set(_path_suffix_${_buildname} "")
  55. set(_build_type_${_buildname} "release")
  56. endif()
  57. unset(_buildname)
  58. vcpkg_find_acquire_program(PKGCONFIG)
  59. set(ENV{PKG_CONFIG} "${PKGCONFIG}")
  60. get_filename_component(PKGCONFIG_PATH "${PKGCONFIG}" DIRECTORY)
  61. vcpkg_add_to_path("${PKGCONFIG_PATH}")
  62. foreach(_buildname ${BUILDTYPES})
  63. set(PKGCONFIG_INSTALLED_DIR "${_VCPKG_INSTALLED_PKGCONF}${_path_suffix_${_buildname}}/lib/pkgconfig")
  64. set(PKGCONFIG_INSTALLED_SHARE_DIR "${_VCPKG_INSTALLED_PKGCONF}/share/pkgconfig")
  65. set(PKGCONFIG_PACKAGES_DIR "${_VCPKG_PACKAGES_PKGCONF}${_path_suffix_${_buildname}}/lib/pkgconfig")
  66. set(PKGCONFIG_PACKAGES_SHARE_DIR "${_VCPKG_PACKAGES_PKGCONF}/share/pkgconfig")
  67. if(DEFINED ENV{PKG_CONFIG_PATH})
  68. set(BACKUP_ENV_PKG_CONFIG_PATH_${_config} $ENV{PKG_CONFIG_PATH})
  69. set(ENV{PKG_CONFIG_PATH} "${PKGCONFIG_INSTALLED_DIR}${VCPKG_HOST_PATH_SEPARATOR}${PKGCONFIG_INSTALLED_SHARE_DIR}${VCPKG_HOST_PATH_SEPARATOR}${PKGCONFIG_PACKAGES_DIR}${VCPKG_HOST_PATH_SEPARATOR}${PKGCONFIG_PACKAGES_SHARE_DIR}${VCPKG_HOST_PATH_SEPARATOR}$ENV{PKG_CONFIG_PATH}")
  70. else()
  71. set(ENV{PKG_CONFIG_PATH} "${PKGCONFIG_INSTALLED_DIR}${VCPKG_HOST_PATH_SEPARATOR}${PKGCONFIG_INSTALLED_SHARE_DIR}${VCPKG_HOST_PATH_SEPARATOR}${PKGCONFIG_PACKAGES_DIR}${VCPKG_HOST_PATH_SEPARATOR}${PKGCONFIG_PACKAGES_SHARE_DIR}")
  72. endif()
  73. set(_build_triplet ${TARGET_TRIPLET}-${_short_name_${_buildname}})
  74. message(STATUS "Configuring ${_build_triplet}")
  75. set(_build_dir "${CURRENT_BUILDTREES_DIR}/${_build_triplet}")
  76. file(MAKE_DIRECTORY ${_build_dir})
  77. # These paths get hardcoded into qmake. So point them into the CURRENT_INSTALLED_DIR instead of CURRENT_PACKAGES_DIR
  78. # makefiles will be fixed to install into CURRENT_PACKAGES_DIR in install_qt
  79. set(BUILD_OPTIONS ${_csc_OPTIONS} ${_csc_OPTIONS_${_buildname}}
  80. -prefix ${CURRENT_INSTALLED_DIR}
  81. #-extprefix ${CURRENT_INSTALLED_DIR}
  82. ${EXT_BIN_DIR}
  83. -hostprefix ${CURRENT_INSTALLED_DIR}/tools/qt5${_path_suffix_${_buildname}}
  84. #-hostprefix ${CURRENT_INSTALLED_DIR}/tools/qt5
  85. -hostlibdir ${CURRENT_INSTALLED_DIR}/tools/qt5${_path_suffix_${_buildname}}/lib # could probably be move to manual-link
  86. -hostbindir ${CURRENT_INSTALLED_DIR}/tools/qt5${_path_suffix_${_buildname}}/bin
  87. #-hostbindir ${CURRENT_INSTALLED_DIR}/tools/qt5/bin
  88. # Qt VS Plugin requires a /bin subfolder with the executables in the root dir. But to use the wizard a correctly setup lib folder is also required
  89. # So with the vcpkg layout there is no way to make it work unless all dll are are copied to tools/qt5/bin and all libs to tools/qt5/lib
  90. -archdatadir ${CURRENT_INSTALLED_DIR}/tools/qt5${_path_suffix_${_buildname}}
  91. -datadir ${CURRENT_INSTALLED_DIR}${_path_suffix}/share/qt5${_path_suffix_${_buildname}}
  92. -plugindir ${CURRENT_INSTALLED_DIR}${_path_suffix_${_buildname}}/plugins
  93. -qmldir ${CURRENT_INSTALLED_DIR}${_path_suffix_${_buildname}}/qml
  94. -headerdir ${CURRENT_INSTALLED_DIR}/include
  95. -libexecdir ${CURRENT_INSTALLED_DIR}/tools/qt5${_path_suffix_${_buildname}}
  96. -bindir ${CURRENT_INSTALLED_DIR}${_path_suffix_${_buildname}}/bin
  97. -libdir ${CURRENT_INSTALLED_DIR}${_path_suffix_${_buildname}}/lib
  98. -I ${CURRENT_INSTALLED_DIR}/include
  99. -L ${CURRENT_INSTALLED_DIR}${_path_suffix_${_buildname}}/lib
  100. -L ${CURRENT_INSTALLED_DIR}${_path_suffix_${_buildname}}/lib/manual-link
  101. -platform ${_csc_TARGET_PLATFORM}
  102. )
  103. if(DEFINED _csc_HOST_TOOLS_ROOT) #use qmake
  104. if(WIN32)
  105. set(INVOKE_OPTIONS "QMAKE_CXX.QMAKE_MSC_VER=1911" "QMAKE_MSC_VER=1911")
  106. endif()
  107. vcpkg_execute_required_process(
  108. COMMAND ${INVOKE} "${_csc_SOURCE_PATH}" "${INVOKE_OPTIONS}" -- ${BUILD_OPTIONS}
  109. WORKING_DIRECTORY ${_build_dir}
  110. LOGNAME config-${_build_triplet}
  111. )
  112. else()# call configure (builds qmake for triplet and calls it like above)
  113. vcpkg_execute_required_process(
  114. COMMAND "${INVOKE}" ${BUILD_OPTIONS}
  115. WORKING_DIRECTORY ${_build_dir}
  116. LOGNAME config-${_build_triplet}
  117. )
  118. endif()
  119. # Note archdatadir and datadir are required to be prefixed with the hostprefix?
  120. message(STATUS "Configuring ${_build_triplet} done")
  121. # Copy configuration dependent qt.conf
  122. file(TO_CMAKE_PATH "${CURRENT_PACKAGES_DIR}" CMAKE_CURRENT_PACKAGES_DIR_PATH)
  123. file(TO_CMAKE_PATH "${CURRENT_INSTALLED_DIR}" CMAKE_CURRENT_INSTALLED_DIR_PATH)
  124. file(READ "${CURRENT_BUILDTREES_DIR}/${_build_triplet}/bin/qt.conf" _contents)
  125. string(REPLACE "${CMAKE_CURRENT_PACKAGES_DIR_PATH}" "\${CURRENT_INSTALLED_DIR}" _contents ${_contents})
  126. string(REPLACE "${CMAKE_CURRENT_INSTALLED_DIR_PATH}" "\${CURRENT_INSTALLED_DIR}" _contents ${_contents})
  127. #string(REPLACE "HostPrefix=\${CURRENT_PACKAGES_DIR}" "HostPrefix=\${CURRENT_INSTALLED_DIR}" _contents ${_contents})
  128. string(REPLACE "[EffectivePaths]\nPrefix=..\n" "" _contents ${_contents})
  129. string(REPLACE "[EffectiveSourcePaths]\nPrefix=${_csc_SOURCE_PATH}\n" "" _contents ${_contents})
  130. string(REPLACE "Sysroot=\n" "" _contents ${_contents})
  131. string(REPLACE "SysrootifyPrefix=false\n" "" _contents ${_contents})
  132. file(WRITE "${CURRENT_PACKAGES_DIR}/tools/qt5/qt_${_build_type_${_buildname}}.conf" "${_contents}")
  133. endforeach()
  134. endfunction()