CMakeLists.txt 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. project(pcitool C)
  2. set(RELEASE "0")
  3. set(PCILIB_VERSION "0.2.8")
  4. set(PCILIB_ABI_VERSION "2")
  5. cmake_minimum_required(VERSION 2.8)
  6. #set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH true)
  7. #set(CMAKE_PREFIX_PATH ${CMAKE_SYSTEM_PREFIX_PATH})
  8. set(DISABLE_PCITOOL FALSE CACHE BOOL "Build only the library")
  9. set(DISABLE_PYTHON FALSE CACHE BOOL "Disable python scripting support")
  10. set(DISABLE_SERVERS FALSE CACHE BOOL "Disable Web API support")
  11. #list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
  12. include(GNUInstallDirs)
  13. include(CheckIncludeFiles)
  14. include(cmake/tools.cmake)
  15. include(cmake/version.cmake)
  16. VERSION_TO_VARS(${PCILIB_VERSION} PCILIB_VERSION_MAJOR PCILIB_VERSION_MINOR PCILIB_VERSION_MICRO)
  17. set(EXTRA_SYSTEM_LIBS -lrt)
  18. add_definitions("-fPIC --std=c99 -Wall -O2 -gdwarf-2 -g3 -fno-omit-frame-pointer")
  19. #add_definitions("-fPIC --std=c99 -Wall -O2")
  20. find_package(PkgConfig REQUIRED)
  21. find_package(Threads REQUIRED)
  22. find_package(Doxygen)
  23. if (NOT DEFINED PCILIB_PLUGIN_DIR)
  24. set(PCILIB_PLUGIN_DIR "${CMAKE_INSTALL_FULL_LIBDIR}/pcilib" CACHE PATH "Directory to install plugins")
  25. endif (NOT DEFINED PCILIB_PLUGIN_DIR)
  26. if (NOT DEFINED PCILIB_DATA_DIR)
  27. set(PCILIB_DATA_DIR "${CMAKE_INSTALL_FULL_DATAROOTDIR}/pcilib" CACHE PATH "Directory to install data files")
  28. endif (NOT DEFINED PCILIB_DATA_DIR)
  29. if (NOT DEFINED PCILIB_MODEL_DIR)
  30. set(PCILIB_MODEL_DIR "${PCILIB_DATA_DIR}/models" CACHE PATH "Directory to install XML models")
  31. endif (NOT DEFINED PCILIB_MODEL_DIR)
  32. if (NOT DEFINED PCILIB_SERVER_DIR)
  33. set(PCILIB_SERVER_DIR "${PCILIB_DATA_DIR}/pyserver" CACHE PATH "Directory to install python server")
  34. endif (NOT DEFINED PCILIB_SERVER_DIR)
  35. if (NOT DEFINED PCILIB_DOC_DIR)
  36. set(PCILIB_DOC_DIR "${CMAKE_BINARY_DIR}/docs/" CACHE PATH "Directory to install documentation")
  37. endif (NOT DEFINED PCILIB_DOC_DIR)
  38. if (NOT DEFINED PCILIB_DEBUG_DIR)
  39. set(PCILIB_DEBUG_DIR "." CACHE PATH "Directory to write debug information")
  40. endif (NOT DEFINED PCILIB_DEBUG_DIR)
  41. if (NOT DEFINED PCILIB_DYNAMIC_HEADERS_INC)
  42. set(PCILIB_DYNAMIC_HEADERS_INC "-I${CMAKE_BINARY_DIR}")
  43. endif (NOT DEFINED PCILIB_DYNAMIC_HEADERS_INC)
  44. SET(ENV{PKG_CONFIG_PATH} "${CMAKE_INSTALL_LIBDIR}/pkgconfig:$ENV{PKG_CONFIG_PATH}")
  45. if (NOT DISABLE_PYTHON)
  46. set(PYTHON_VERSION 2.7 CACHE STRING "python version")
  47. find_package(PythonInterp ${PYTHON_VERSION} REQUIRED)
  48. find_package(PythonLibs ${PYTHON_VERSION_STRING} EXACT REQUIRED)
  49. find_package(SWIG REQUIRED)
  50. if (NOT PYTHON_VERSION_STRING VERSION_EQUAL PYTHONLIBS_VERSION_STRING)
  51. message (FATAL_ERROR "Version mismatch between python interpreter and libraries")
  52. endif (NOT PYTHON_VERSION_STRING VERSION_EQUAL PYTHONLIBS_VERSION_STRING)
  53. # execute_process (COMMAND ${PYTHON_EXECUTABLE} -c "from sysconfig import get_path; print get_path('platlib')" OUTPUT_VARIABLE PCILIB_PYTHON_SITEDIR OUTPUT_STRIP_TRAILING_WHITESPACE)
  54. if (NOT DEFINED PCILIB_PYTHON_SITEDIR)
  55. execute_process (COMMAND ${PYTHON_EXECUTABLE} -c "import site; print (site.PREFIXES[-1])" OUTPUT_VARIABLE PYTHON_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE)
  56. file (TO_CMAKE_PATH "${PYTHON_PREFIX}" PYTHON_PREFIX)
  57. # execute_process (COMMAND ${PYTHON_EXECUTABLE} -c "import site; print (site.getsitepackages()[0])" OUTPUT_VARIABLE PYTHON_SITE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
  58. # file (TO_CMAKE_PATH "${PYTHON_SITE_DIR}" PYTHON_SITE_DIR)
  59. # string (REGEX REPLACE "^${PYTHON_PREFIX}/" "${CMAKE_INSTALL_PREFIX}/" PYTHON_SITE_DIR "${PYTHON_SITE_DIR}")
  60. execute_process (COMMAND ${PYTHON_EXECUTABLE} -c "import site; list = [dir for dir in site.getsitepackages() if dir.startswith('${CMAKE_INSTALL_PREFIX}')]; liblist = [dir for dir in list if dir.startswith('${CMAKE_INSTALL_PREFIX}/lib')]; print (liblist[0] if liblist else list[0] if list else site.getsitepackages()[0])" OUTPUT_VARIABLE PYTHON_SITE_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
  61. message(${PYTHON_SITE_DIR})
  62. file (TO_CMAKE_PATH "${PYTHON_SITE_DIR}" PYTHON_SITE_DIR)
  63. set(PCILIB_PYTHON_SITEDIR ${PYTHON_SITE_DIR} CACHE PATH "path to install python module")
  64. endif (NOT DEFINED PCILIB_PYTHON_SITEDIR)
  65. set(HAVE_PYTHON TRUE)
  66. endif (NOT DISABLE_PYTHON)
  67. if (NOT HAVE_PYTHON)
  68. set(DISABLE_SERVERS TRUE)
  69. endif (NOT HAVE_PYTHON)
  70. check_include_files(stdatomic.h HAVE_STDATOMIC_H)
  71. find_path(UTHASH_INCLUDE_DIRS uthash.h PATH_SUFFIXES uthash)
  72. if (UTHASH_INCLUDE_DIRS)
  73. message ("uthash is found at ${UTHASH_INCLUDE_DIRS}")
  74. else (UTHASH_INCLUDE_DIRS)
  75. message (FATAL_ERROR "uthash is not found...")
  76. endif (UTHASH_INCLUDE_DIRS)
  77. pkg_check_modules(LIBXML2 libxml-2.0 REQUIRED)
  78. #Check in sibling directory
  79. if (NOT DISABLE_PCITOOL)
  80. pkg_check_modules(FASTWRITER fastwriter REQUIRED)
  81. endif (NOT DISABLE_PCITOOL)
  82. add_subdirectory(dma)
  83. add_subdirectory(protocols)
  84. add_subdirectory(views)
  85. add_subdirectory(pcilib)
  86. add_subdirectory(pcitool)
  87. add_subdirectory(apps)
  88. add_subdirectory(xml)
  89. if (HAVE_PYTHON)
  90. add_subdirectory(pywrap)
  91. endif (HAVE_PYTHON)
  92. set_target_properties(pcilib PROPERTIES VERSION ${PCILIB_VERSION} SOVERSION ${PCILIB_ABI_VERSION})
  93. add_custom_target(docs
  94. COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/docs/Doxyfile
  95. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/docs
  96. COMMENT "Generating API documentation with Doxygen" VERBATIM
  97. )
  98. set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "docs/html")
  99. install(FILES
  100. ${CMAKE_CURRENT_BINARY_DIR}/misc/pcitool.pc
  101. DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
  102. )
  103. if (NOT DISABLE_SERVERS)
  104. #install Python servers
  105. file(GLOB DEPLOY_FILES_AND_DIRS "${CMAKE_SOURCE_DIR}/pyserver/*")
  106. foreach(ITEM ${DEPLOY_FILES_AND_DIRS})
  107. if( IS_DIRECTORY "${ITEM}" )
  108. list(APPEND DIRS_TO_DEPLOY "${ITEM}")
  109. else()
  110. list(APPEND FILES_TO_DEPLOY "${ITEM}")
  111. endif()
  112. endforeach()
  113. install(FILES ${FILES_TO_DEPLOY} DESTINATION ${PCILIB_SERVER_DIR})
  114. install(DIRECTORY ${DIRS_TO_DEPLOY} DESTINATION ${PCILIB_SERVER_DIR})
  115. endif (NOT DISABLE_SERVERS)
  116. set(TARNAME "pcitool")
  117. set(PACKAGE_VERSION ${PCILIB_VERSION})
  118. set(PACKAGE_NAME "${TARNAME}")
  119. set(PACKAGE_TARNAME "${TARNAME}")
  120. set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
  121. set(PACKAGE_BUGREPORT "http://ufo.kit.edu/ufo/newticket")
  122. set(CPACK_SOURCE_GENERATOR "TBZ2")
  123. set(CPACK_PACKAGE_CONTACT "Suren A. Chilingaryan <csa@suren.me>")
  124. if (${RELEASE} GREATER 0)
  125. set(CPACK_PACKAGE_VERSION "${PACKAGE_VERSION}.${RELEASE}")
  126. else (${RELEASE} GREATER 0)
  127. set(CPACK_PACKAGE_VERSION "${PACKAGE_VERSION}")
  128. endif (${RELEASE} GREATER 0)
  129. #set(CPACK_SOURCE_IGNORE_FILES "([^d]|d[^r])[^/]*/Makefile;${CPACK_SOURCE_IGNORE_FILES}")
  130. set(CPACK_SOURCE_IGNORE_FILES "/build/;/.bzr/;CMakeFiles;_CPack_Packages;cmake_install.cmake;CPack.*.cmake;CMakeCache.txt;install_manifest.txt;common.mk;pcilib/config.h$;.pc$;Makefile$;__pycache__;.pyc$;.tar.bz2$;~$;${CPACK_SOURCE_IGNORE_FILES}")
  131. set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CPACK_PACKAGE_VERSION}")
  132. include(CPack)
  133. # In releases, we just keep the pre-generated build.h
  134. if(EXISTS ${CMAKE_SOURCE_DIR}/.bzr/ OR NOT EXISTS ${CMAKE_SOURCE_DIR}/pcilib/build.h)
  135. add_custom_target(build
  136. COMMAND ${CMAKE_COMMAND} -DPCILIB_SOURCE_DIR=${CMAKE_SOURCE_DIR} -DPCILIB_BINARY_DIR=${CMAKE_BINARY_DIR} -DPCILIB_RELEASE=${CPACK_PACKAGE_VERSION} -P ${CMAKE_SOURCE_DIR}/cmake/build.cmake
  137. WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  138. )
  139. add_dependencies(pcilib build)
  140. if (NOT DISABLE_PCITOOL)
  141. add_dependencies(pci build)
  142. endif (NOT DISABLE_PCITOOL)
  143. # We need to generate build.h for source releases
  144. add_custom_target(dist_clean make clean -C driver
  145. COMMAND ${CMAKE_MAKE_PROGRAM} clean
  146. WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  147. )
  148. add_custom_target(dist_prepare DEPENDS dist_clean
  149. COMMAND ${CMAKE_COMMAND} -DPCILIB_SOURCE_DIR=${CMAKE_SOURCE_DIR} -DPCILIB_BINARY_DIR=${CMAKE_SOURCE_DIR} -DPCILIB_RELEASE=${CPACK_PACKAGE_VERSION} -P ${CMAKE_SOURCE_DIR}/cmake/build.cmake
  150. WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
  151. )
  152. add_custom_target(dist DEPENDS dist_prepare COMMAND ${CMAKE_MAKE_PROGRAM} package_source)
  153. set_source_files_properties(${CMAKE_BINARY_DIR}/pcilib/build.h PROPERTIES GENERATED TRUE)
  154. set_source_files_properties(${CMAKE_SOURCE_DIR}/pcilib/build.h PROPERTIES GENERATED TRUE)
  155. endif(EXISTS ${CMAKE_SOURCE_DIR}/.bzr/ OR NOT EXISTS ${CMAKE_SOURCE_DIR}/pcilib/build.h)
  156. if (NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
  157. file(COPY ${CMAKE_SOURCE_DIR}/xml DESTINATION ${CMAKE_BINARY_DIR})
  158. file(COPY ${CMAKE_SOURCE_DIR}/pyserver DESTINATION ${CMAKE_BINARY_DIR})
  159. file(COPY ${CMAKE_SOURCE_DIR}/pci
  160. DESTINATION ${CMAKE_BINARY_DIR}
  161. FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
  162. )
  163. file(COPY ${CMAKE_SOURCE_DIR}/run
  164. DESTINATION ${CMAKE_BINARY_DIR}
  165. FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
  166. )
  167. endif(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
  168. configure_file(${CMAKE_SOURCE_DIR}/driver/Makefile.in ${CMAKE_SOURCE_DIR}/driver/Makefile)
  169. configure_file(${CMAKE_SOURCE_DIR}/pcitool.spec.in ${CMAKE_BINARY_DIR}/pcitool.spec)
  170. configure_file(${CMAKE_SOURCE_DIR}/misc/dkms.conf.in ${CMAKE_BINARY_DIR}/misc/dkms.conf)
  171. configure_file(${CMAKE_SOURCE_DIR}/misc/pcitool.pc.in ${CMAKE_BINARY_DIR}/misc/pcitool.pc)
  172. configure_file(${CMAKE_SOURCE_DIR}/pcilib/config.h.in ${CMAKE_BINARY_DIR}/pcilib/config.h)
  173. configure_file(${CMAKE_SOURCE_DIR}/pcilib/version.h.in ${CMAKE_BINARY_DIR}/pcilib/version.h)
  174. configure_file(${CMAKE_SOURCE_DIR}/docs/Doxyfile.in ${CMAKE_BINARY_DIR}/docs/Doxyfile)
  175. if (NOT DISABLE_SERVERS)
  176. configure_file(${CMAKE_SOURCE_DIR}/misc/pcilib_api.service.in ${CMAKE_BINARY_DIR}/misc/pcilib_api.service)
  177. configure_file(${CMAKE_SOURCE_DIR}/misc/pcilib_html.service.in ${CMAKE_BINARY_DIR}/misc/pcilib_html.service)
  178. configure_file(${CMAKE_SOURCE_DIR}/misc/pcilib.sysconfig.in ${CMAKE_BINARY_DIR}/misc/pcilib.sysconfig)
  179. endif (NOT DISABLE_SERVERS)
  180. PYTHON_CLEAN_LIST("${CMAKE_BINARY_DIR}/xml" XML_PY_FILES)
  181. PYTHON_CLEAN_LIST("${CMAKE_BINARY_DIR}/pyserver" SERVER_PY_FILES)
  182. set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${XML_PY_FILES};${SERVER_PY_FILES}")
  183. message("-- Configured pcitool ${PCILIB_VERSION_MAJOR}.${PCILIB_VERSION_MINOR}.${PCILIB_VERSION_MICRO} with public ABI ${PCILIB_ABI_VERSION}")