VCMIUtils.cmake 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. # This file should contain custom functions and macro and them only.
  2. # It's should not alter any configuration on inclusion
  3. #######################################
  4. # Build output path #
  5. #######################################
  6. macro(vcmi_set_output_dir name dir)
  7. # Multi-config builds for Visual Studio, Xcode
  8. foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
  9. string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGUPPERCASE)
  10. set_target_properties(${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIGUPPERCASE} ${CMAKE_BINARY_DIR}/bin/${OUTPUTCONFIG}/${dir})
  11. if(ANDROID)
  12. set_target_properties(${name} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIGUPPERCASE} "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
  13. else()
  14. set_target_properties(${name} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIGUPPERCASE} ${CMAKE_BINARY_DIR}/bin/${OUTPUTCONFIG}/${dir})
  15. endif()
  16. set_target_properties(${name} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIGUPPERCASE} ${CMAKE_BINARY_DIR}/bin/${OUTPUTCONFIG}/${dir})
  17. endforeach()
  18. # Generic no-config case for Makefiles, Ninja.
  19. # This is what Qt Creator is using
  20. set_target_properties(${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/${dir})
  21. if(NOT ANDROID)
  22. set_target_properties(${name} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/${dir})
  23. endif()
  24. set_target_properties(${name} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/${dir})
  25. endmacro()
  26. #######################################
  27. # Project generation #
  28. #######################################
  29. # Let us have proper tree-like structure in IDEs such as Visual Studio
  30. function(assign_source_group)
  31. foreach(_source IN ITEMS ${ARGN})
  32. if(IS_ABSOLUTE "${_source}")
  33. file(RELATIVE_PATH _source_rel "${CMAKE_CURRENT_SOURCE_DIR}" "${_source}")
  34. else()
  35. set(_source_rel "${_source}")
  36. endif()
  37. get_filename_component(_source_path "${_source_rel}" PATH)
  38. string(REPLACE "/" "\\" _source_path_msvc "${_source_path}")
  39. source_group("${_source_path_msvc}" FILES "${_source}")
  40. endforeach()
  41. endfunction(assign_source_group)
  42. # Macro to add subdirectory and set appropriate FOLDER for generated projects files
  43. macro(add_subdirectory_with_folder _folder_name _folder)
  44. add_subdirectory(${_folder} ${ARGN})
  45. set_property(DIRECTORY "${_folder}" PROPERTY FOLDER "${_folder_name}")
  46. endmacro()
  47. #######################################
  48. # CMake debugging #
  49. #######################################
  50. # Can be called to see check cmake variables and environment variables
  51. # For "install" debugging just copy it here. There no easy way to include modules from source.
  52. function(vcmi_print_all_variables)
  53. message(STATUS "-- -- Start of all internal variables")
  54. get_cmake_property(_variableNames VARIABLES)
  55. foreach(_variableName ${_variableNames})
  56. message(STATUS "${_variableName}=${${_variableName}}")
  57. endforeach()
  58. message(STATUS "-- -- End of all internal variables")
  59. message(STATUS "--")
  60. message(STATUS "-- -- Start of all environment variables")
  61. execute_process(COMMAND "${CMAKE_COMMAND}" "-E" "environment")
  62. message(STATUS "-- -- End of all environment variables")
  63. endfunction()
  64. # Print CMake variables most important for debugging
  65. function(vcmi_print_important_variables)
  66. message(STATUS "-- -- Start of VCMI build debug information")
  67. message(STATUS "CMAKE_VERSION: " ${CMAKE_VERSION})
  68. message(STATUS "CMAKE_BUILD_TYPE: " ${CMAKE_BUILD_TYPE})
  69. message(STATUS "CMAKE_BINARY_DIR: " ${CMAKE_BINARY_DIR})
  70. message(STATUS "CMAKE_SOURCE_DIR: " ${CMAKE_SOURCE_DIR})
  71. # message(STATUS "PROJECT_BINARY_DIR: " ${PROJECT_BINARY_DIR})
  72. # message(STATUS "PROJECT_SOURCE_DIR: " ${PROJECT_SOURCE_DIR})
  73. message(STATUS "CMAKE_MODULE_PATH: " ${CMAKE_MODULE_PATH})
  74. message(STATUS "CMAKE_COMMAND: " ${CMAKE_COMMAND})
  75. message(STATUS "CMAKE_ROOT: " ${CMAKE_ROOT})
  76. # message(STATUS "CMAKE_CURRENT_LIST_FILE and LINE: ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE}")
  77. # message(STATUS "CMAKE_INCLUDE_PATH: " ${CMAKE_INCLUDE_PATH})
  78. # message(STATUS "CMAKE_LIBRARY_PATH: " ${CMAKE_LIBRARY_PATH})
  79. message(STATUS "UNIX: ${UNIX} - WIN32: ${WIN32} - APPLE: ${APPLE}")
  80. message(STATUS "MINGW: ${MINGW} - CYGWIN: ${CYGWIN} - MSVC: ${MSVC}")
  81. message(STATUS "CMAKE_CXX_COMPILER_ID: " ${CMAKE_CXX_COMPILER_ID})
  82. message(STATUS "CMAKE_CXX_COMPILER_VERSION: " ${CMAKE_CXX_COMPILER_VERSION})
  83. message(STATUS "CMAKE_C_COMPILER: " ${CMAKE_C_COMPILER})
  84. message(STATUS "CMAKE_CXX_COMPILER: " ${CMAKE_CXX_COMPILER})
  85. # message(STATUS "CMAKE_COMPILER_IS_GNUCC: " ${CMAKE_COMPILER_IS_GNUCC})
  86. # message(STATUS "CMAKE_COMPILER_IS_GNUCXX: " ${CMAKE_COMPILER_IS_GNUCXX})
  87. # message(STATUS "CMAKE_C_FLAGS: " ${CMAKE_C_FLAGS})
  88. # message(STATUS "CMAKE_CXX_FLAGS: " ${CMAKE_CXX_FLAGS})
  89. message(STATUS "CMAKE_SYSTEM: " ${CMAKE_SYSTEM})
  90. message(STATUS "CMAKE_SYSTEM_NAME: " ${CMAKE_SYSTEM_NAME})
  91. message(STATUS "CMAKE_SYSTEM_VERSION: " ${CMAKE_SYSTEM_VERSION})
  92. message(STATUS "CMAKE_SYSTEM_PROCESSOR: " ${CMAKE_SYSTEM_PROCESSOR})
  93. message(STATUS "-- -- End of VCMI build debug information")
  94. endfunction()
  95. # Print Git commit hash
  96. function(vcmi_print_git_commit_hash)
  97. message(STATUS "-- -- Start of Git information")
  98. message(STATUS "GIT_SHA1: " ${GIT_SHA1})
  99. message(STATUS "-- -- End of Git information")
  100. endfunction()
  101. # install dependencies from Conan, CONAN_RUNTIME_LIBS_FILE is set in conanfile.py
  102. function(vcmi_install_conan_deps)
  103. if(NOT USING_CONAN)
  104. return()
  105. endif()
  106. file(STRINGS "${CONAN_RUNTIME_LIBS_FILE}" runtimeLibs)
  107. install(FILES ${runtimeLibs} DESTINATION ${LIB_DIR})
  108. endfunction()
  109. function(vcmi_deploy_qt deployQtToolName deployQtOptions)
  110. # TODO: use qt_generate_deploy_app_script() with Qt 6
  111. find_program(TOOL_DEPLOYQT NAMES ${deployQtToolName} PATHS "${qtBinDir}")
  112. if(TOOL_DEPLOYQT)
  113. install(CODE "
  114. execute_process(COMMAND \"${TOOL_DEPLOYQT}\" ${deployQtOptions} -verbose 2)
  115. ")
  116. else()
  117. message(WARNING "${deployQtToolName} not found, running cpack would result in broken package")
  118. endif()
  119. endfunction()
  120. # generate .bat for .exe with proper PATH
  121. function(vcmi_create_exe_shim tgt)
  122. if(NOT CONAN_RUNENV_SCRIPT)
  123. return()
  124. endif()
  125. file(GENERATE OUTPUT "$<TARGET_FILE_DIR:${tgt}>/$<TARGET_FILE_BASE_NAME:${tgt}>.bat" CONTENT
  126. "call ${CONAN_RUNENV_SCRIPT}
  127. @start $<TARGET_FILE_NAME:${tgt}>"
  128. )
  129. endfunction()