FindPackageOrBuild.cmake 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. function(build_dependency DEPENDENCY_NAME BUILD_CONFIG BUILD_OPTIONS)
  2. set(DEPENDENCY_BUILD_DIR "${CMAKE_SOURCE_DIR}/../Dependencies/Build/${DEPENDENCY_NAME}/${BUILD_CONFIG}")
  3. # Make the build folder
  4. execute_process(COMMAND "${CMAKE_COMMAND}"
  5. -E make_directory ${DEPENDENCY_BUILD_DIR}
  6. WORKING_DIRECTORY "${DEPENDENCY_BUILD_DIR}")
  7. # Make build files
  8. execute_process(COMMAND "${CMAKE_COMMAND}"
  9. -G "${CMAKE_GENERATOR}"
  10. ${BUILD_OPTIONS}
  11. "${CMAKE_SOURCE_DIR}/External/${DEPENDENCY_NAME}"
  12. WORKING_DIRECTORY "${DEPENDENCY_BUILD_DIR}")
  13. # Execute the build and install
  14. execute_process(COMMAND "${CMAKE_COMMAND}"
  15. --build "${DEPENDENCY_BUILD_DIR}"
  16. --config ${BUILD_CONFIG})
  17. execute_process(COMMAND "${CMAKE_COMMAND}"
  18. --build "${DEPENDENCY_BUILD_DIR}"
  19. --config ${BUILD_CONFIG}
  20. --target Install)
  21. endfunction()
  22. function(find_package_or_build DEPENDENCY_NAME DEPENDENCY_INCLUDE_PATH BUILD_OPTIONS)
  23. set(DEPENDENCIES_BUILD_DIR "${CMAKE_SOURCE_DIR}/../Dependencies/Build")
  24. set(DEPENDENCY_BUILD_DIR "${DEPENDENCIES_BUILD_DIR}/${DEPENDENCY_NAME}")
  25. set(DEPENDENCY_SOURCE_DIR "${CMAKE_SOURCE_DIR}/External/${DEPENDENCY_NAME}")
  26. # Look for dependency binaries
  27. find_package(${DEPENDENCY_NAME} QUIET)
  28. # Cannot find binaries, see if we can compile them
  29. if(NOT ${DEPENDENCY_NAME}_FOUND)
  30. message(STATUS "...${DEPENDENCY_NAME} binaries cannot be found, building from source and retrying.")
  31. # See if we have the source code for the dependency, and if not fetch them from git
  32. find_path(SUBMODULE_SOURCES ${DEPENDENCY_INCLUDE_PATH} ${DEPENDENCY_SOURCE_DIR})
  33. if(NOT SUBMODULE_SOURCES)
  34. execute_process(COMMAND git submodule update
  35. --init
  36. -- External/${DEPENDENCY_NAME}
  37. WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
  38. else()
  39. execute_process(COMMAND git submodule update
  40. -- External/${DEPENDENCY_NAME}
  41. WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
  42. endif()
  43. # Build
  44. build_dependency(${DEPENDENCY_NAME} Release "${BUILD_OPTIONS}")
  45. build_dependency(${DEPENDENCY_NAME} Debug "${BUILD_OPTIONS}")
  46. # Update the dependencies version
  47. file(WRITE ${DEPENDENCIES_BUILD_DIR}/.version ${BS_SRC_DEPENDENCIES_VERSION})
  48. # Now try finding the package again, this time it's required
  49. find_package(${DEPENDENCY_NAME} REQUIRED)
  50. mark_as_advanced(SUBMODULE_SOURCES)
  51. endif()
  52. endfunction()