CMakeLists.txt 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. ########################################################################
  2. ## locate the Poco development libraries
  3. ########################################################################
  4. enable_language(C) #newer Poco config scrips require c to be enabled
  5. include(SetupPoco)
  6. if (Poco_FOUND)
  7. message(STATUS "Poco_VERSION: ${Poco_VERSION}")
  8. message(STATUS "Poco_INCLUDE_DIRS: ${Poco_INCLUDE_DIRS}")
  9. message(STATUS "Poco_LIBRARIES: ${Poco_LIBRARIES}")
  10. else (Poco_FOUND)
  11. message(WARNING "Pothos library requires Poco libraries...")
  12. endif (Poco_FOUND)
  13. ########################################################################
  14. # muparserx library
  15. ########################################################################
  16. if(NOT MUPARSERX_IN_TREE)
  17. find_package(muparserx CONFIG)
  18. endif(NOT MUPARSERX_IN_TREE)
  19. if (muparserx_FOUND)
  20. message(STATUS "muparserx_VERSION: ${muparserx_VERSION}")
  21. message(STATUS "muparserx_INCLUDE_DIRS: ${muparserx_INCLUDE_DIRS}")
  22. message(STATUS "muparserx_LIBRARIES: ${muparserx_LIBRARIES}")
  23. else (muparserx_FOUND)
  24. message(WARNING "Pothos library requires dependency muparserx...")
  25. endif (muparserx_FOUND)
  26. ########################################################################
  27. # json.hpp header
  28. ########################################################################
  29. find_path(JSON_HPP_INCLUDE_DIR NAMES json.hpp PATH_SUFFIXES nlohmann)
  30. if (NOT JSON_HPP_INCLUDE_DIR)
  31. message(WARNING "Pothos library requires dependency json.hpp...")
  32. endif (NOT JSON_HPP_INCLUDE_DIR)
  33. ########################################################################
  34. ## Feature registration
  35. ########################################################################
  36. cmake_dependent_option(ENABLE_LIBRARY_LIB "Enable Pothos Library.Lib component" ON "ENABLE_LIBRARY;Poco_FOUND;muparserx_FOUND;JSON_HPP_INCLUDE_DIR" OFF)
  37. add_feature_info(" Lib" ENABLE_LIBRARY_LIB "Pothos development and runtime libraries")
  38. if (NOT ENABLE_LIBRARY_LIB)
  39. return()
  40. endif()
  41. ########################################################################
  42. # Library sources
  43. ########################################################################
  44. add_library(Pothos SHARED
  45. Init.cpp
  46. Exception.cpp
  47. Testing/Testing.cpp
  48. System/Logger.cpp
  49. System/HostInfo.cpp
  50. System/NumaInfo.cpp
  51. System/Exception.cpp
  52. System/SIMD.cpp
  53. Object/Object.cpp
  54. Object/Hash.cpp
  55. Object/Compare.cpp
  56. Object/Convert.cpp
  57. Object/ToString.cpp
  58. Object/Serialize.cpp
  59. Object/Exception.cpp
  60. Object/Builtin/Compare.cpp
  61. Object/Builtin/ConvertIntermediate.cpp
  62. Object/Builtin/ConvertIntegers.cpp
  63. Object/Builtin/ConvertFloats.cpp
  64. Object/Builtin/ConvertString.cpp
  65. Object/Builtin/Hash.cpp
  66. Object/Builtin/Serialize.cpp
  67. Object/Builtin/Tests.cpp
  68. Object/Builtin/TestConvertVectors.cpp
  69. Callable/Callable.cpp
  70. Callable/CallInterface.cpp
  71. Callable/CallRegistry.cpp
  72. Callable/Exception.cpp
  73. Callable/Tests.cpp
  74. Framework/Packet.cpp
  75. Framework/DType.cpp
  76. Framework/Label.cpp
  77. Framework/InputPort.cpp
  78. Framework/OutputPort.cpp
  79. Framework/Connectable.cpp
  80. Framework/Block.cpp
  81. Framework/Topology.cpp
  82. Framework/TopologyCommit.cpp
  83. Framework/TopologySquashFlows.cpp
  84. Framework/TopologyNetworkFlows.cpp
  85. Framework/TopologyDomainFlows.cpp
  86. Framework/TopologyDotMarkup.cpp
  87. Framework/TopologyDumpJSON.cpp
  88. Framework/TopologyMakeJSON.cpp
  89. Framework/TopologyStatsJSON.cpp
  90. Framework/WorkInfo.cpp
  91. Framework/WorkerActor.cpp
  92. Framework/WorkerActorPortAllocation.cpp
  93. Framework/ThreadPool.cpp
  94. Framework/ThreadEnvironment.cpp
  95. Framework/SharedBuffer.cpp
  96. Framework/ManagedBuffer.cpp
  97. Framework/BufferPool.cpp
  98. Framework/BufferChunk.cpp
  99. Framework/BufferConvert.cpp
  100. Framework/BufferManager.cpp
  101. Framework/BufferAccumulator.cpp
  102. Framework/BlockRegistry.cpp
  103. Framework/Exception.cpp
  104. ConfLoader/ConfLoader.cpp
  105. ConfLoader/FileRealPath.cpp
  106. ConfLoader/BlockDescLoader.cpp
  107. ConfLoader/JSONTopologyLoader.cpp
  108. ConfLoader/JITCompilerLoader.cpp
  109. Framework/Builtin/CircularBufferManager.cpp
  110. Framework/Builtin/TestBufferChunkSerialization.cpp
  111. Framework/Builtin/TestToString.cpp
  112. Framework/Builtin/TestBufferConvert.cpp
  113. Framework/Builtin/TestDoesBlockExist.cpp
  114. Framework/Builtin/TestDType.cpp
  115. Framework/Builtin/TestAutomaticPorts.cpp
  116. Framework/Builtin/TestSharedBuffer.cpp
  117. Framework/Builtin/GenericBufferManager.cpp
  118. Framework/Builtin/TestCircularBufferManager.cpp
  119. Framework/Builtin/TestGenericBufferManager.cpp
  120. Framework/Builtin/TestBufferManagerWithCustomAllocation.cpp
  121. Framework/Builtin/TestWorker.cpp
  122. Framework/Builtin/TestLabel.cpp
  123. Framework/Builtin/TestThreadPool.cpp
  124. Framework/Builtin/TestTopology.cpp
  125. Plugin/Path.cpp
  126. Plugin/Plugin.cpp
  127. Plugin/Registry.cpp
  128. Plugin/Module.cpp
  129. Plugin/ModuleSafeLoad.cpp
  130. Plugin/ModulePaths.cpp
  131. Plugin/Static.cpp
  132. Plugin/Exception.cpp
  133. Plugin/Tests.cpp
  134. Proxy/Proxy.cpp
  135. Proxy/Handle.cpp
  136. Proxy/Convert.cpp
  137. Proxy/Environment.cpp
  138. Proxy/Exception.cpp
  139. Proxy/Builtin/ConvertContainers.cpp
  140. Remote/RemoteProxyDatagram.cpp
  141. Remote/RemoteProxy.cpp
  142. Remote/RemoteProxyHandle.cpp
  143. Remote/Server.cpp
  144. Remote/ServerHandler.cpp
  145. Remote/Client.cpp
  146. Remote/Exception.cpp
  147. Remote/Builtin/TestRemote.cpp
  148. Managed/Class.cpp
  149. Managed/Registry.cpp
  150. Managed/Exception.cpp
  151. Managed/Builtin/ManagedHandle.cpp
  152. Managed/Builtin/ManagedProxy.cpp
  153. Managed/Builtin/ManagedProxy.hpp
  154. Managed/Builtin/TestManaged.cpp
  155. Managed/Builtin/TestManagedOpaque.cpp
  156. Managed/Builtin/TestManagedWildcard.cpp
  157. Managed/Builtin/TestManagedInheritance.cpp
  158. Util/UID.cpp
  159. Util/RefHolder.cpp
  160. Util/TypeInfo.cpp
  161. Util/Compiler.cpp
  162. Util/Network.cpp
  163. Util/EvalEnvironment.cpp
  164. Util/EvalEnvironmentListParsers.cpp
  165. Util/BlockDescription.cpp
  166. Util/Builtin/BlockEval.cpp
  167. Util/Builtin/DeviceInfoUtils.cpp
  168. Util/Builtin/DocUtils.cpp
  169. Util/Builtin/MupOctalValReader.cpp
  170. Util/Builtin/SIMDDispatcherUtils.cpp
  171. Util/Builtin/TestDocUtils.cpp
  172. Util/Builtin/TestErrorCodeHandling.cpp
  173. Util/Builtin/TestEvalExpression.cpp
  174. Util/Builtin/TestRingDeque.cpp
  175. Util/Builtin/TestSIMDDispatcherUtils.cpp
  176. Archive/ArchiveEntry.cpp
  177. Archive/StreamArchiver.cpp
  178. Archive/TestBasicTypes.cpp
  179. Archive/TestCustomType.cpp
  180. Archive/TestPolymorphicType.cpp
  181. Archive/Exception.cpp
  182. )
  183. if(WIN32)
  184. target_sources(Pothos PRIVATE WindowsDelayLoadedSymbols.cpp)
  185. target_sources(Pothos PRIVATE Framework/SharedBufferWindows.cpp)
  186. target_sources(Pothos PRIVATE Util/FileLockWindows.cpp)
  187. target_sources(Pothos PRIVATE Util/Builtin/WindowsGetLogicalProcessorInfo.cpp)
  188. elseif(UNIX)
  189. target_sources(Pothos PRIVATE Framework/SharedBufferUnix.cpp)
  190. target_sources(Pothos PRIVATE Util/FileLockUnix.cpp)
  191. endif()
  192. target_link_libraries(Pothos PUBLIC ${Pothos_LINKER_FLAGS})
  193. target_include_directories(Pothos PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
  194. target_include_directories(Pothos PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include>)
  195. target_compile_options(Pothos PUBLIC ${Pothos_COMPILE_OPTIONS})
  196. target_compile_definitions(Pothos PUBLIC ${Pothos_COMPILE_DEFINITIONS})
  197. set_target_properties(Pothos PROPERTIES SOVERSION ${POTHOS_ABI_VERSION})
  198. set_target_properties(Pothos PROPERTIES VERSION ${POTHOS_LIBVER})
  199. set_target_properties(Pothos PROPERTIES DEFINE_SYMBOL "POTHOS_DLL_EXPORTS")
  200. #symbols are only exported from the library explicitly
  201. set_property(TARGET Pothos PROPERTY C_VISIBILITY_PRESET hidden)
  202. set_property(TARGET Pothos PROPERTY CXX_VISIBILITY_PRESET hidden)
  203. set_property(TARGET Pothos PROPERTY VISIBILITY_INLINES_HIDDEN ON)
  204. if(MSVC)
  205. target_compile_options(Pothos PRIVATE /bigobj) #builtin convert.cpp too large in debug mode
  206. target_compile_options(Pothos PRIVATE /Zc:__cplusplus) #report __cplusplus correctly
  207. endif(MSVC)
  208. ########################################################################
  209. # Link feature dependencies
  210. ########################################################################
  211. if (Poco_INCLUDE_DIRS)
  212. target_include_directories(Pothos PUBLIC ${Poco_INCLUDE_DIRS})
  213. endif (Poco_INCLUDE_DIRS)
  214. target_link_libraries(Pothos PUBLIC ${Poco_LIBRARIES})
  215. target_include_directories(Pothos PRIVATE ${muparserx_INCLUDE_DIRS})
  216. target_link_libraries(Pothos PRIVATE ${muparserx_LIBRARIES})
  217. list(APPEND PC_LIBS_PRIVATE "-lmuparserx")
  218. target_include_directories(Pothos PRIVATE ${JSON_HPP_INCLUDE_DIR})
  219. ########################################################################
  220. # Compiler flags that are generally always a good idea to set
  221. # or sensible to use because of the project's constraints.
  222. ########################################################################
  223. if(CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  224. #these warnings are caused by static warnings used throughout the code
  225. target_compile_options(Pothos PRIVATE -Wno-unused-local-typedefs)
  226. #common warnings to help encourage good coding practices
  227. target_compile_options(Pothos PUBLIC -Wall)
  228. target_compile_options(Pothos PUBLIC -Wextra)
  229. target_compile_options(Pothos PUBLIC -Wnon-virtual-dtor)
  230. endif()
  231. if(APPLE)
  232. #fixes issue with duplicate module registry when using application bundle
  233. target_link_libraries(Pothos PUBLIC "-flat_namespace")
  234. endif()
  235. if(MSVC)
  236. #we always want to use multiple cores for compilation
  237. target_compile_options(Pothos PUBLIC /MP)
  238. #projects should be cross-platform and standard stl functions should work
  239. target_compile_definitions(Pothos PUBLIC -DNOMINMAX) #enables std::min and std::max
  240. #suppress the following warnings which are commonly caused by project headers
  241. target_compile_options(Pothos PUBLIC /wd4251) #disable 'identifier' : class 'type' needs to have dll-interface to be used by clients of class 'type2'
  242. target_compile_options(Pothos PUBLIC /wd4275) #disable non – DLL-interface classkey 'identifier' used as base for DLL-interface classkey 'identifier'
  243. target_compile_options(Pothos PUBLIC /wd4503) #'identifier' : decorated name length exceeded, name was truncated
  244. endif(MSVC)
  245. if ("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD")
  246. target_compile_options(Pothos PUBLIC -stdlib=libc++)
  247. endif()
  248. ########################################################################
  249. # Configure sources
  250. ########################################################################
  251. #force the following CMAKE_INSTALL_*DIR to be relative for the System/Paths.cpp
  252. file(RELATIVE_PATH CMAKE_INSTALL_LIBDIR "${CMAKE_INSTALL_PREFIX}" "${CMAKE_INSTALL_FULL_LIBDIR}")
  253. file(RELATIVE_PATH CMAKE_INSTALL_BINDIR "${CMAKE_INSTALL_PREFIX}" "${CMAKE_INSTALL_FULL_BINDIR}")
  254. file(RELATIVE_PATH CMAKE_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_PREFIX}" "${CMAKE_INSTALL_FULL_INCLUDEDIR}")
  255. file(RELATIVE_PATH CMAKE_INSTALL_DATADIR "${CMAKE_INSTALL_PREFIX}" "${CMAKE_INSTALL_FULL_DATADIR}")
  256. #get the library name into Paths.cpp for getPothosRuntimeLibraryPath()
  257. target_compile_definitions(Pothos PRIVATE "-DPOTHOS_LIBRARY_NAME=\"$<TARGET_FILE_NAME:Pothos>\"")
  258. if (WIN32)
  259. set(MODULE_EXT "dll")
  260. elseif (UNIX)
  261. set(MODULE_EXT "so")
  262. else()
  263. message(FATAL_ERROR "not win32 or unix")
  264. endif()
  265. configure_file(
  266. ${CMAKE_CURRENT_SOURCE_DIR}/System/Paths.in.cpp
  267. ${CMAKE_CURRENT_BINARY_DIR}/Paths.cpp @ONLY)
  268. configure_file(
  269. ${CMAKE_CURRENT_SOURCE_DIR}/System/Version.in.cpp
  270. ${CMAKE_CURRENT_BINARY_DIR}/Version.cpp @ONLY)
  271. configure_file(
  272. ${CMAKE_CURRENT_SOURCE_DIR}/Plugin/Loader.in.cpp
  273. ${CMAKE_CURRENT_BINARY_DIR}/Loader.cpp @ONLY)
  274. target_sources(Pothos PRIVATE
  275. ${CMAKE_CURRENT_BINARY_DIR}/Version.cpp
  276. ${CMAKE_CURRENT_BINARY_DIR}/Paths.cpp
  277. ${CMAKE_CURRENT_BINARY_DIR}/Loader.cpp
  278. )
  279. ########################################################################
  280. # NUMA info support
  281. ########################################################################
  282. find_library(
  283. NUMA_LIBRARIES
  284. NAMES numa
  285. PATHS /usr/lib /usr/lib64
  286. )
  287. if(NUMA_LIBRARIES)
  288. target_compile_definitions(Pothos PRIVATE -DHAVE_LIBNUMA)
  289. target_sources(Pothos PRIVATE System/NumaInfoLinux.cpp)
  290. target_link_libraries(Pothos PRIVATE ${NUMA_LIBRARIES})
  291. list(APPEND PC_LIBS_PRIVATE "-lnuma")
  292. elseif(WIN32)
  293. target_sources(Pothos PRIVATE System/NumaInfoWindows.cpp)
  294. elseif(APPLE)
  295. target_sources(Pothos PRIVATE System/NumaInfoOSX.cpp)
  296. else()
  297. target_sources(Pothos PRIVATE System/NumaInfoOther.cpp)
  298. endif()
  299. ########################################################################
  300. # Link libatomic
  301. ########################################################################
  302. find_library(
  303. ATOMIC_LIBRARIES
  304. NAMES atomic atomic.so.1 libatomic.so.1
  305. PATHS /usr/lib /usr/lib64
  306. )
  307. if (ATOMIC_LIBRARIES)
  308. target_link_libraries(Pothos PRIVATE ${ATOMIC_LIBRARIES})
  309. list(APPEND PC_LIBS_PRIVATE "-latomic")
  310. endif()
  311. ########################################################################
  312. # Thread config support
  313. ########################################################################
  314. find_library(
  315. RT_LIBRARIES
  316. NAMES rt
  317. PATHS /usr/lib /usr/lib64
  318. )
  319. if (RT_LIBRARIES)
  320. target_link_libraries(Pothos PRIVATE ${RT_LIBRARIES})
  321. list(APPEND PC_LIBS_PRIVATE "-lrt")
  322. endif()
  323. if(WIN32)
  324. target_sources(Pothos PRIVATE Framework/ThreadConfigWindows.cpp)
  325. elseif(UNIX)
  326. target_sources(Pothos PRIVATE Framework/ThreadConfigUnix.cpp)
  327. endif()
  328. ########################################################################
  329. # OSX support
  330. ########################################################################
  331. if (APPLE)
  332. #Need to link to CoreFoundation to fix dlopen() issue:
  333. #http://openradar.appspot.com/7209349
  334. find_library(COREFOUNDATION_LIBRARY CoreFoundation)
  335. target_link_libraries(Pothos PRIVATE ${COREFOUNDATION_LIBRARY})
  336. endif()
  337. ########################################################################
  338. # Compiler support wrapper
  339. ########################################################################
  340. target_sources(Pothos PRIVATE Util/Builtin/TestCompilerSupport.cpp)
  341. if(CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
  342. configure_file(
  343. ${CMAKE_CURRENT_SOURCE_DIR}/Util/Builtin/GccClangCompilerSupport.in.cpp
  344. ${CMAKE_CURRENT_BINARY_DIR}/GccClangCompilerSupport.cpp @ONLY)
  345. target_sources(Pothos PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/GccClangCompilerSupport.cpp)
  346. endif()
  347. if(MSVC)
  348. get_filename_component(MSVC_INSTALL_PATH ${CMAKE_LINKER} PATH)
  349. file(TO_NATIVE_PATH ${MSVC_INSTALL_PATH} MSVC_INSTALL_PATH)
  350. string(REPLACE "\\" "\\\\" MSVC_INSTALL_PATH ${MSVC_INSTALL_PATH})
  351. configure_file(
  352. ${CMAKE_CURRENT_SOURCE_DIR}/Util/Builtin/MsvcCompilerSupport.in.cpp
  353. ${CMAKE_CURRENT_BINARY_DIR}/MsvcCompilerSupport.cpp @ONLY)
  354. target_sources(Pothos PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/MsvcCompilerSupport.cpp)
  355. endif(MSVC)
  356. ########################################################################
  357. # Generate dynamic dispatch files for SIMD code
  358. ########################################################################
  359. target_include_directories(Pothos PRIVATE ${PROJECT_SOURCE_DIR}/libsimdpp)
  360. include(${CMAKE_CURRENT_SOURCE_DIR}/../libsimdpp/cmake/SimdppMultiarch.cmake)
  361. set(simd_sources
  362. SIMD/SIMDConvert.cpp)
  363. simdpp_get_runnable_archs(simdpp_runnable_archs)
  364. simdpp_multiarch(
  365. GeneratedSIMDFiles
  366. ${simd_sources}
  367. ${simdpp_runnable_archs})
  368. target_sources(Pothos PRIVATE ${GeneratedSIMDFiles})
  369. ########################################################################
  370. # Install the library
  371. ########################################################################
  372. install(TARGETS Pothos
  373. EXPORT PothosExport
  374. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT pothos_runtime # .so file
  375. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT pothos_devel # .lib file
  376. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT pothos_runtime # .dll file
  377. )
  378. #export target to Pothos project config
  379. install(EXPORT PothosExport DESTINATION ${POTHOS_CMAKE_DIRECTORY})
  380. ########################################################################
  381. # Build pkg config file
  382. ########################################################################
  383. string(REPLACE ";" " " PC_LIBS_PRIVATE "${PC_LIBS_PRIVATE}")
  384. configure_file(
  385. ${CMAKE_CURRENT_SOURCE_DIR}/Pothos.in.pc
  386. ${CMAKE_CURRENT_BINARY_DIR}/Pothos.pc
  387. @ONLY)
  388. install(
  389. FILES ${CMAKE_CURRENT_BINARY_DIR}/Pothos.pc
  390. DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
  391. COMPONENT pothos_devel
  392. )