CMakeLists.txt 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. # -*- mode: cmake -*-
  2. #Cmakelists.txt
  3. # Minimum version of CMake
  4. cmake_minimum_required(VERSION 2.6)
  5. if(COMMAND cmake_policy)
  6. cmake_policy(VERSION 2.6)
  7. endif()
  8. CONFIGURE_FILE(
  9. "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in"
  10. "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  11. IMMEDIATE @ONLY)
  12. ADD_CUSTOM_TARGET(uninstall
  13. "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
  14. # Source dir
  15. set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
  16. set(BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR})
  17. #set(CMAKE_BUILD_TYPE RELEASE)
  18. option(WITH_LOGOS "install wmfs logos")
  19. option(GENERATE_MANPAGES "generate manpages" ON)
  20. # Project name - wmfs
  21. set(PROJECT_NAME wmfs)
  22. set(PROJECT_NAME_SHELL wmfs-shell)
  23. project(${PROJECT_NAME} C)
  24. # Definition of the wmfs source
  25. set(wmfs_src
  26. src/barwin.c
  27. src/client.c
  28. src/config.c
  29. src/draw.c
  30. src/event.c
  31. src/ewmh.c
  32. src/frame.c
  33. src/infobar.c
  34. src/init.c
  35. src/launcher.c
  36. src/layout.c
  37. src/menu.c
  38. src/mouse.c
  39. src/screen.c
  40. src/tag.c
  41. src/util.c
  42. src/wmfs.c)
  43. set(wmfs-shell_src
  44. shell/wmfs-shell.c)
  45. # Set the executable from the wmfs_src
  46. add_executable(wmfs ${wmfs_src})
  47. add_executable(wmfs-shell ${wmfs-shell_src})
  48. # Set the version - NOT USED AT THE MOMENT
  49. set(VERSION "0.1rc4 (On The Run)")
  50. # FLAGS
  51. set(CFLAGS "-g -Wall")
  52. set(CMAKE_C_FLAGS ${CFLAGS})
  53. set(LDFLAGS "-L /usr/local/lib")
  54. set_target_properties(wmfs PROPERTIES LINK_FLAGS ${LDFLAGS})
  55. # Includes dir for libs in build_dir
  56. include_directories(
  57. ${BUILD_DIR}/src
  58. )
  59. # Package find
  60. find_package(Freetype)
  61. if(FREETYPE_FOUND)
  62. include_directories(${FREETYPE_INCLUDE_DIRS})
  63. else (FREETYPE_FOUND)
  64. message(FATAL_ERROR "Could not find Freetype")
  65. endif (FREETYPE_FOUND)
  66. find_package(X11)
  67. if(X11_FOUND)
  68. include_directories(${X11_INCLUDE_DIR})
  69. else (X11_FOUND)
  70. message(FATAL_ERROR "Could not find X11")
  71. endif (X11_FOUND)
  72. find_package(PythonInterp)
  73. if(PYTHONINTERP_FOUND)
  74. else(PYTHONINTERP_FOUND)
  75. message(FATAL_ERROR "Could not find Python interpreter")
  76. endif(PYTHONINTERP_FOUND)
  77. find_package(PythonLibs)
  78. if(PYTHONLIBS_FOUND)
  79. else(PYTHONLIBS_FOUND)
  80. message(FATAL_ERROR "Could not find Python libs")
  81. endif(PYTHONLIBS_FOUND)
  82. # Link Libraries
  83. set(LIBRARIES_TO_LINK
  84. ${FREETYPE_LIBRARIES}
  85. ${X11_LIBRARIES}
  86. confuse
  87. Xft
  88. Xinerama)
  89. set(SHELL_LINK_LIBS
  90. ${X11_LIBRARIES})
  91. target_link_libraries(wmfs ${LIBRARIES_TO_LINK})
  92. target_link_libraries(wmfs-shell ${SHELL_LINK_LIBS})
  93. # Messages
  94. message("Project version: ${VERSION}")
  95. message("Using these CFLAGS: ${CFLAGS}")
  96. message("Using these LDFLAGS: ${LDFLAGS}")
  97. message("Linking with theses libraries : ${LIBRARIES_TO_LINK}")
  98. # Includes
  99. include(FindDoxygen)
  100. include(FindPkgConfig)
  101. # Use pkgconfig to get required libraries
  102. pkg_check_modules(wmfs_required
  103. x11
  104. libconfuse
  105. freetype2
  106. xinerama
  107. xft)
  108. # Find exterbal programs
  109. macro(a_find_program var prg req)
  110. set(required ${req})
  111. find_program(${var} ${prg})
  112. if(NOT ${var})
  113. message(STATUS "${prg} not found.")
  114. if(required)
  115. message(FATAL_ERROR "${prg} is required to build wmfs")
  116. endif()
  117. else()
  118. message(STATUS "${prg} -> ${${var}}")
  119. endif()
  120. endmacro()
  121. find_program(GIT_EXECUTABLE git)
  122. # programs needed for man pages
  123. a_find_program(ASCIIDOC_EXECUTABLE asciidoc FALSE)
  124. a_find_program(XMLTO_EXECUTABLE xmlto FALSE)
  125. a_find_program(GZIP_EXECUTABLE gzip FALSE)
  126. a_find_program(CAT_EXECUTABLE cat TRUE)
  127. # Generating CHANGELOG
  128. if(EXISTS ${SOURCE_DIR}/.git/HEAD AND GIT_EXECUTABLE)
  129. # generate
  130. message("Git dir -- Generating changelog...")
  131. execute_process(
  132. COMMAND ${GIT_EXECUTABLE} log
  133. WORKING_DIRECTORY ${SOURCE_DIR}
  134. OUTPUT_VARIABLE WMFS_CHANGELOG
  135. )
  136. set(CHANGELOG_FILE ${SOURCE_DIR}/CHANGELOG)
  137. file(WRITE ${CHANGELOG_FILE} ${WMFS_CHANGELOG})
  138. else()
  139. message("Non-Git dir -- Generating fake changelog")
  140. execute_process(
  141. COMMAND touch ${SOURCE_DIR}/CHANGELOG
  142. )
  143. endif()
  144. # Build python lib
  145. add_custom_command(
  146. COMMAND ${PYTHON_EXECUTABLE}
  147. ARGS python/setup.py build
  148. WORKING_DIRECTORY ${SOURCE_DIR}
  149. COMMENT "Building python lib"
  150. TARGET ${SOURCE_DIR}
  151. )
  152. add_custom_target(python_lib)
  153. add_dependencies(${PROJECT_NAME} python_lib)
  154. # {{{ Check if documentation can be build
  155. if(GENERATE_MANPAGES)
  156. if(NOT ASCIIDOC_EXECUTABLE OR NOT XMLTO_EXECUTABLE OR NOT GZIP_EXECUTABLE)
  157. if(NOT ASCIIDOC_EXECUTABLE)
  158. SET(missing "asciidoc")
  159. endif()
  160. if(NOT XMLTO_EXECUTABLE)
  161. SET(missing ${missing} " xmlto")
  162. endif()
  163. if(NOT GZIP_EXECUTABLE)
  164. SET(missing ${missing} " gzip")
  165. endif()
  166. message(STATUS "Not generating manpages. Missing: " ${missing})
  167. set(GENERATE_MANPAGES OFF)
  168. endif()
  169. endif()
  170. # sets
  171. # {{{ Install path and configuration variables
  172. if(DEFINED PREFIX)
  173. set(PREFIX ${PREFIX} CACHE PATH "install prefix")
  174. set(CMAKE_INSTALL_PREFIX ${PREFIX})
  175. else()
  176. set(PREFIX ${CMAKE_INSTALL_PREFIX} CACHE PATH "install prefix")
  177. endif()
  178. #If a sysconfdir is specified, use it instead
  179. #of the default configuration dir.
  180. if(DEFINED SYSCONFDIR)
  181. set(SYSCONFDIR ${SYSCONFDIR} CACHE PATH "config directory")
  182. else()
  183. set(SYSCONFDIR /etc CACHE PATH "config directory")
  184. endif()
  185. #If an XDG Config Dir is specificed, use it instead
  186. #of the default XDG configuration dir.
  187. if(DEFINED XDG_CONFIG_DIR)
  188. set(XDG_CONFIG_DIR ${XDG_CONFIG_SYS} CACHE PATH "xdg config directory")
  189. else()
  190. set(XDG_CONFIG_DIR ${SYSCONFDIR}/xdg CACHE PATH "xdg config directory")
  191. endif()
  192. # setting WMFS_XSESSION_PATH
  193. if(DEFINED WMFS_XSESSION_PATH)
  194. set(WMFS_XSESSION_PATH ${WMFS_XSESSION_PATH} CACHE PATH "wmfs xsessions directory")
  195. else()
  196. set(WMFS_XSESSION_PATH ${PREFIX}/share/xsessions CACHE PATH "wmfs xsessions directory")
  197. endif()
  198. # set man path
  199. set(WMFS_MAN_SRCS
  200. ${SOURCE_DIR}/wmfs.1.txt)
  201. if(DEFINED WMFS_MAN_PATH)
  202. set(WMFS_MAN_PATH ${WMFS_MAN_PATH} CACHE PATH "wmfs manpage directory")
  203. else()
  204. set(WMFS_MAN_PATH ${PREFIX}/share/man CACHE PATH "wmfs manpage directory")
  205. endif()
  206. # {{{ Manpages
  207. if(GENERATE_MANPAGES)
  208. foreach(txtfile ${WMFS_MAN_SRCS})
  209. string(REGEX REPLACE ".txt\$" ".xml" xmlfile ${txtfile})
  210. string(REPLACE ${SOURCE_DIR}
  211. ${BUILD_DIR} xmlfile ${xmlfile})
  212. string(REGEX REPLACE ".xml\$" ".gz" gzfile ${xmlfile})
  213. string(REGEX REPLACE ".gz\$" "" manfile ${gzfile})
  214. add_custom_command(
  215. COMMAND ${CAT_EXECUTABLE} ${txtfile}
  216. | ${ASCIIDOC_EXECUTABLE} -d manpage -b docbook -o ${xmlfile} -
  217. WORKING_DIRECTORY ${BUILD_DIR}
  218. OUTPUT ${xmlfile}
  219. DEPENDS ${txtfile}
  220. VERBATIM)
  221. add_custom_command(
  222. COMMAND ${XMLTO_EXECUTABLE} man ${xmlfile}
  223. OUTPUT ${manfile}
  224. DEPENDS ${xmlfile})
  225. add_custom_command(
  226. COMMAND ${CAT_EXECUTABLE} ${manfile}
  227. | ${GZIP_EXECUTABLE}
  228. > ${gzfile}
  229. OUTPUT ${gzfile}
  230. DEPENDS ${manfile}
  231. VERBATIM)
  232. set(MAN_FILES ${MAN_FILES} ${gzfile})
  233. # figure out in what section to install to from filename
  234. string(REGEX REPLACE "^.*\\.([0-9])\\.gz\$" "\\1" section ${gzfile})
  235. set(WMFS_MAN${section}_FILES ${WMFS_MAN${section}_FILES} ${gzfile})
  236. endforeach()
  237. add_custom_target(man ALL DEPENDS ${MAN_FILES})
  238. endif()
  239. # }}}
  240. # {{ Doxygen
  241. if(DOXYGEN_EXECUTABLE)
  242. add_custom_target(doc
  243. COMMAND ${DOXYGEN_EXECUTABLE} ${SOURCE_DIR}/wmfs.doxygen
  244. WORKING_DIRECTORY ${BUILD_DIR})
  245. endif()
  246. # }}
  247. # Remplace strings in configs
  248. set(WMFS_VERSION ${VERSION})
  249. set(WMFS_COMPILE_MACHINE ${CMAKE_SYSTEM_PROCESSOR})
  250. set(WMFS_COMPILE_BY $ENV{USER})
  251. set(WMFS_COMPILE_FLAGS ${CFLAGS})
  252. set(WMFS_LINKED_LIBS ${LIBRARIES_TO_LINK})
  253. set(WMFS_SYSCONFDIR ${XDG_CONFIG_DIR}/${PROJECT_NAME})
  254. set(WMFS_SOURCE_DIR ${SOURCE_DIR})
  255. # Configure files
  256. set(wmfs_configure_files
  257. src/config.h.in
  258. wmfs.1.txt.in
  259. wmfs.doxygen.in)
  260. macro(a_configure_file file)
  261. string(REGEX REPLACE ".in\$" "" outfile ${file})
  262. message(STATUS "Configuring ${outfile}")
  263. configure_file(${SOURCE_DIR}/${file}
  264. ${SOURCE_DIR}/${outfile}
  265. ESCAPE_QUOTE
  266. @ONLY)
  267. endmacro()
  268. foreach(file ${wmfs_configure_files})
  269. a_configure_file(${file})
  270. endforeach()
  271. set(PROJECT_DATA_PATH share/${PROJECT_NAME})
  272. set(PROJECT_TODO ${SOURCE_DIR}/TODO)
  273. set(PROJECT_README ${SOURCE_DIR}/README)
  274. set(PROJECT_CHANGELOG ${SOURCE_DIR}/CHANGELOG)
  275. set(PROJECT_DEFAULT_CONF ${SOURCE_DIR}/wmfsrc)
  276. # installs
  277. install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME_SHELL} RUNTIME DESTINATION bin)
  278. if(WITH_LOGOS)
  279. set(PROJECT_LOGOS ${PROJECT_DATA_PATH}/logos)
  280. set(PROJECT_LOGOS_DIR ${SOURCE_DIR}/logos)
  281. install(DIRECTORY ${PROJECT_LOGOS_DIR} DESTINATION ${PROJECT_DATA_PATH})
  282. message("Install With logos")
  283. endif()
  284. if(GENERATE_MANPAGES)
  285. install(FILES ${WMFS_MAN1_FILES} DESTINATION ${WMFS_MAN_PATH}/man1)
  286. endif()
  287. install(FILES ${PROJECT_TODO} ${PROJECT_README} ${PROJECT_CHANGELOG}
  288. ${PROJECT_DEFAULT_CONF} DESTINATION ${PROJECT_DATA_PATH})
  289. install(FILES ${PROJECT_DEFAULT_CONF} DESTINATION ${WMFS_SYSCONFDIR})
  290. install(FILES "wmfs.desktop" DESTINATION ${WMFS_XSESSION_PATH})