PothosConfig.cmake 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. if(DEFINED INCLUDED_POTHOS_CONFIG_CMAKE)
  2. return()
  3. endif()
  4. set(INCLUDED_POTHOS_CONFIG_CMAKE TRUE)
  5. ########################################################################
  6. # PothosConfig - sets Pothos installation variables
  7. #
  8. # POTHOS_UTIL_EXE - the path to PothosUtil executable
  9. # Pothos_INCLUDE_DIRS - Pothos development includes
  10. # Pothos_LIBRARIES - Pothos development libraries
  11. # POTHOS_CMAKE_DIRECTORY - where to install CMake files
  12. ########################################################################
  13. list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_CURRENT_LIST_DIR})
  14. include(PothosUtil) #utility functions
  15. ########################################################################
  16. # select the release build type by default to get optimization flags
  17. ########################################################################
  18. if(NOT CMAKE_BUILD_TYPE)
  19. set(CMAKE_BUILD_TYPE "Release")
  20. message(STATUS "Build type not specified: defaulting to release.")
  21. endif(NOT CMAKE_BUILD_TYPE)
  22. set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "")
  23. ########################################################################
  24. # Use GNU Install Dirs, but support LIB_SUFFIX if specified
  25. ########################################################################
  26. include(GNUInstallDirs)
  27. if(LIB_SUFFIX)
  28. set(CMAKE_INSTALL_LIBDIR "lib${LIB_SUFFIX}") #support old lib suffix
  29. endif(LIB_SUFFIX)
  30. ########################################################################
  31. # extract the ABI version string from the Version.hpp header
  32. ########################################################################
  33. function(_POTHOS_GET_ABI_VERSION VERSION INCLUDE_DIR)
  34. file(READ "${INCLUDE_DIR}/Pothos/System/Version.hpp" version_hpp)
  35. string(REGEX MATCH "\\#define POTHOS_ABI_VERSION \"([0-9]+\\.[0-9]+(-[A-Za-z0-9]+)?)\"" POTHOS_ABI_VERSION_MATCHES "${version_hpp}")
  36. if(NOT POTHOS_ABI_VERSION_MATCHES)
  37. message(FATAL_ERROR "Failed to extract version number from Version.hpp")
  38. endif(NOT POTHOS_ABI_VERSION_MATCHES)
  39. set(${VERSION} "${CMAKE_MATCH_1}" CACHE INTERNAL "")
  40. endfunction(_POTHOS_GET_ABI_VERSION)
  41. ########################################################################
  42. # install directory for cmake files
  43. # used publicly in PothosPython
  44. ########################################################################
  45. if (UNIX)
  46. set(POTHOS_CMAKE_DIRECTORY ${CMAKE_INSTALL_DATADIR}/cmake/Pothos)
  47. elseif (WIN32)
  48. set(POTHOS_CMAKE_DIRECTORY cmake)
  49. endif ()
  50. ########################################################################
  51. ## in-tree build support
  52. ########################################################################
  53. if (POTHOS_IN_TREE_SOURCE_DIR)
  54. if(NOT POTHOS_ROOT)
  55. set(POTHOS_ROOT ${CMAKE_INSTALL_PREFIX})
  56. endif(NOT POTHOS_ROOT)
  57. _POTHOS_GET_ABI_VERSION(POTHOS_ABI_VERSION ${POTHOS_IN_TREE_SOURCE_DIR}/include)
  58. #a list of in-tree built libraries to generate a library path script
  59. set(IN_TREE_LIBRARIES Pothos)
  60. if (POCO_IN_TREE)
  61. list(APPEND IN_TREE_LIBRARIES ${Poco_LIBRARIES})
  62. endif()
  63. if (MUPARSERX_IN_TREE)
  64. list(APPEND IN_TREE_LIBRARIES ${muparserx_LIBRARIES})
  65. endif()
  66. if(MSVC)
  67. set(built_dll_paths "%PATH%")
  68. foreach(target ${IN_TREE_LIBRARIES})
  69. set(built_dll_paths "$<TARGET_FILE_DIR:${target}>;${built_dll_paths}")
  70. endforeach(target)
  71. set(POTHOS_UTIL_EXE ${PROJECT_BINARY_DIR}/PothosUtil.bat)
  72. add_custom_command(
  73. OUTPUT ${POTHOS_UTIL_EXE}
  74. DEPENDS PothosUtil
  75. COMMAND ${CMAKE_COMMAND} -E echo "set PATH=${built_dll_paths}" > ${POTHOS_UTIL_EXE}
  76. COMMAND ${CMAKE_COMMAND} -E echo "\"$<TARGET_FILE:PothosUtil>\" %*" >> ${POTHOS_UTIL_EXE}
  77. VERBATIM
  78. )
  79. endif()
  80. if(UNIX)
  81. set(built_dll_paths "\${LD_LIBRARY_PATH}")
  82. foreach(target ${IN_TREE_LIBRARIES})
  83. set(built_dll_paths "$<TARGET_FILE_DIR:${target}>:${built_dll_paths}")
  84. endforeach(target)
  85. find_program(SH_EXE sh)
  86. find_program(CHMOD_EXE chmod)
  87. set(POTHOS_UTIL_EXE ${PROJECT_BINARY_DIR}/PothosUtil.sh)
  88. add_custom_command(
  89. OUTPUT ${POTHOS_UTIL_EXE}
  90. DEPENDS PothosUtil
  91. COMMAND ${CMAKE_COMMAND} -E echo "#!${SH_EXE}" > ${POTHOS_UTIL_EXE}
  92. COMMAND ${CMAKE_COMMAND} -E echo "export LD_LIBRARY_PATH=${built_dll_paths}" >> ${POTHOS_UTIL_EXE}
  93. COMMAND ${CMAKE_COMMAND} -E echo "export DYLD_LIBRARY_PATH=\${LD_LIBRARY_PATH}:\${DYLD_LIBRARY_PATH}" >> ${POTHOS_UTIL_EXE}
  94. COMMAND ${CMAKE_COMMAND} -E echo "\"$<TARGET_FILE:PothosUtil>\" $@" >> ${POTHOS_UTIL_EXE}
  95. COMMAND ${CHMOD_EXE} +x ${POTHOS_UTIL_EXE}
  96. VERBATIM
  97. )
  98. endif()
  99. set(__POTHOS_UTIL_TARGET_NAME ${PROJECT_NAME}PothosUtil)
  100. add_custom_target(${__POTHOS_UTIL_TARGET_NAME} DEPENDS ${POTHOS_UTIL_EXE})
  101. #set old-style variables
  102. unset(Pothos_INCLUDE_DIRS)
  103. set(Pothos_LIBRARIES Pothos)
  104. return()
  105. endif ()
  106. ########################################################################
  107. ## Determine root installation path
  108. ########################################################################
  109. file(RELATIVE_PATH POTHOS_ROOT_RELDIR "${CMAKE_INSTALL_PREFIX}/${POTHOS_CMAKE_DIRECTORY}" "${CMAKE_INSTALL_PREFIX}")
  110. get_filename_component(POTHOS_ROOT "${CMAKE_CURRENT_LIST_DIR}/${POTHOS_ROOT_RELDIR}" ABSOLUTE)
  111. ########################################################################
  112. ## locate the PothosUtil application
  113. ########################################################################
  114. find_program(
  115. POTHOS_UTIL_EXE PothosUtil
  116. PATHS ${POTHOS_ROOT}/bin
  117. NO_DEFAULT_PATH
  118. )
  119. if(NOT POTHOS_UTIL_EXE)
  120. message(FATAL_ERROR "cannot find PothosUtil in ${POTHOS_ROOT}/bin")
  121. endif()
  122. if(MSVC)
  123. file(TO_NATIVE_PATH "${POTHOS_ROOT}/bin" bin_path)
  124. file(TO_NATIVE_PATH "${POTHOS_UTIL_EXE}" POTHOS_UTIL_EXE)
  125. file(WRITE ${PROJECT_BINARY_DIR}/PothosUtil.bat
  126. "set PATH=${bin_path};%PATH%\n"
  127. "\"${POTHOS_UTIL_EXE}\" %*\n"
  128. )
  129. set(POTHOS_UTIL_EXE ${PROJECT_BINARY_DIR}/PothosUtil.bat)
  130. endif()
  131. if(UNIX)
  132. file(TO_NATIVE_PATH "${POTHOS_ROOT}/${CMAKE_INSTALL_LIBDIR}" lib_path)
  133. file(TO_NATIVE_PATH "${POTHOS_UTIL_EXE}" POTHOS_UTIL_EXE)
  134. find_program(SH_EXE sh)
  135. find_program(CHMOD_EXE chmod)
  136. file(WRITE ${PROJECT_BINARY_DIR}/PothosUtil.sh
  137. "#!${SH_EXE}\n"
  138. "export LD_LIBRARY_PATH=${lib_path}:\${LD_LIBRARY_PATH}\n"
  139. "export DYLD_LIBRARY_PATH=\${LD_LIBRARY_PATH}:\${DYLD_LIBRARY_PATH}\n"
  140. "\"${POTHOS_UTIL_EXE}\" $@\n"
  141. )
  142. execute_process(COMMAND ${CHMOD_EXE} +x ${PROJECT_BINARY_DIR}/PothosUtil.sh)
  143. set(POTHOS_UTIL_EXE ${PROJECT_BINARY_DIR}/PothosUtil.sh)
  144. endif()
  145. set(__success_code "200")
  146. execute_process(
  147. COMMAND ${POTHOS_UTIL_EXE} --success-code ${__success_code}
  148. RESULT_VARIABLE __result_code
  149. )
  150. if(NOT __result_code STREQUAL __success_code)
  151. message(FATAL_ERROR "PothosUtil execution test failed")
  152. endif()
  153. ########################################################################
  154. ## create import library target
  155. ########################################################################
  156. enable_language(C) #newer Poco config scrips require c to be enabled
  157. include(SetupPoco) #Poco is a Pothos library public dependency
  158. include(PothosExport)
  159. #set old-style variables
  160. get_target_property(POTHOS_INCLUDE_DIR Pothos INTERFACE_INCLUDE_DIRECTORIES)
  161. set(Pothos_INCLUDE_DIRS ${POTHOS_INCLUDE_DIR})
  162. set(Pothos_LIBRARIES Pothos)
  163. _POTHOS_GET_ABI_VERSION(POTHOS_ABI_VERSION ${POTHOS_INCLUDE_DIR})