VCMIUtils.cmake 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #######################################
  2. # Output directories #
  3. #######################################
  4. if(APPLE)
  5. set(MACOSX_BUNDLE_NAME "${CMAKE_PROJECT_NAME}")
  6. set(MACOSX_BUNDLE_BUNDLE_NAME "${CMAKE_PROJECT_NAME}")
  7. set(APP_BUNDLE_NAME "${CMAKE_PROJECT_NAME}.app")
  8. set(APP_BUNDLE_DIR "${CMAKE_BINARY_DIR}/build/${APP_BUNDLE_NAME}")
  9. set(APP_BUNDLE_CONTENTS_DIR "${APP_BUNDLE_DIR}/Contents")
  10. set(APP_BUNDLE_BINARY_DIR "${APP_BUNDLE_CONTENTS_DIR}/MacOS")
  11. set(APP_BUNDLE_RESOURCES_DIR "${APP_BUNDLE_CONTENTS_DIR}/Resources")
  12. endif()
  13. macro(vcmi_set_output_dir name dir)
  14. # Multi-config builds for Visual Studio, Xcode
  15. foreach (OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES})
  16. string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGUPPERCASE)
  17. set_target_properties(${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIGUPPERCASE} ${CMAKE_BINARY_DIR}/bin/${OUTPUTCONFIG}/${dir})
  18. set_target_properties(${name} PROPERTIES LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIGUPPERCASE} ${CMAKE_BINARY_DIR}/bin/${OUTPUTCONFIG}/${dir})
  19. set_target_properties(${name} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIGUPPERCASE} ${CMAKE_BINARY_DIR}/bin/${OUTPUTCONFIG}/${dir})
  20. endforeach()
  21. # Generic no-config case for Makefiles, Ninja.
  22. # This is what Qt Creator is using
  23. set_target_properties(${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/${dir})
  24. set_target_properties(${name} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/${dir})
  25. set_target_properties(${name} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/${dir})
  26. endmacro()
  27. #######################################
  28. # Better project generation #
  29. #######################################
  30. # Let us have proper tree-like structure in IDEs such as Visual Studio
  31. function(assign_source_group)
  32. foreach(_source IN ITEMS ${ARGN})
  33. if(IS_ABSOLUTE "${_source}")
  34. file(RELATIVE_PATH _source_rel "${CMAKE_CURRENT_SOURCE_DIR}" "${_source}")
  35. else()
  36. set(_source_rel "${_source}")
  37. endif()
  38. get_filename_component(_source_path "${_source_rel}" PATH)
  39. string(REPLACE "/" "\\" _source_path_msvc "${_source_path}")
  40. source_group("${_source_path_msvc}" FILES "${_source}")
  41. endforeach()
  42. endfunction(assign_source_group)
  43. # Options to enable folders in CMake generated projects for Visual Studio, Xcode, etc
  44. # Very useful to put 3rd-party libraries such as Minizip, GoogleTest and FuzzyLite in their own folders
  45. set_property(GLOBAL PROPERTY USE_FOLDERS TRUE)
  46. define_property(
  47. TARGET
  48. PROPERTY FOLDER
  49. INHERITED
  50. BRIEF_DOCS "Set the folder name."
  51. FULL_DOCS "Use to organize targets in an IDE."
  52. )
  53. function(add_subdirectory_with_folder _folder_name _folder)
  54. add_subdirectory(${_folder} ${ARGN})
  55. set_property(DIRECTORY "${_folder}" PROPERTY FOLDER "${_folder_name}")
  56. endfunction()
  57. # Macro for Xcode Projects generation
  58. # Slightly outdated, but useful reference for all options available here:
  59. # https://pewpewthespells.com/blog/buildsettings.html
  60. # https://github.com/samdmarshall/Xcode-Build-Settings-Reference
  61. if(${CMAKE_GENERATOR} MATCHES "Xcode")
  62. macro(set_xcode_property TARGET XCODE_PROPERTY XCODE_VALUE)
  63. set_property(TARGET ${TARGET} PROPERTY
  64. XCODE_ATTRIBUTE_${XCODE_PROPERTY} ${XCODE_VALUE})
  65. endmacro(set_xcode_property)
  66. endif(${CMAKE_GENERATOR} MATCHES "Xcode")
  67. #######################################
  68. # CMake debugging #
  69. #######################################
  70. # Can be called to see check cmake variables and environment variables
  71. # For "install" debugging just copy it here. There no easy way to include modules from source.
  72. function(vcmi_get_cmake_debug_info)
  73. message(STATUS "Debug - Internal variables:")
  74. get_cmake_property(_variableNames VARIABLES)
  75. foreach(_variableName ${_variableNames})
  76. message(STATUS "${_variableName}=${${_variableName}}")
  77. endforeach()
  78. message(STATUS "Debug - Environment variables:")
  79. execute_process(COMMAND "${CMAKE_COMMAND}" "-E" "environment")
  80. endfunction()