Mirror of Awesome WM window manager
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CMakeLists.txt 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. cmake_minimum_required(VERSION 3.0.0)
  2. project(awesome C)
  3. # Require an out-of-source build. We generate an awesomerc.lua in the build dir
  4. # from the one in the source dir and this does not work otherwise.
  5. if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
  6. message(SEND_ERROR "\
  7. You appear to be doing an in-source build, which means that the binaries are \
  8. generated in the same directory where the source code is. This is currently not \
  9. supported. Instead, do, for example, the following:\n\
  10. mkdir build && cd build && cmake ..\n\
  11. Beware that CMake likely already generated a CMakeCache.txt in the source \
  12. directory which you first have to delete. \
  13. ")
  14. message(FATAL_ERROR "In-source builds are not supported")
  15. endif()
  16. set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS TRUE)
  17. if(COMMAND cmake_policy)
  18. cmake_policy(VERSION 2.6)
  19. endif()
  20. set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
  21. set(BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR})
  22. if(NOT EXISTS ${SOURCE_DIR}/awesomeConfig.cmake)
  23. message(FATAL_ERROR "Please provide awesomeConfig.cmake")
  24. endif()
  25. # Define many variables
  26. include(awesomeConfig.cmake)
  27. include_directories(
  28. ${BUILD_DIR}
  29. ${AWESOME_COMMON_REQUIRED_INCLUDE_DIRS}
  30. ${AWESOME_REQUIRED_INCLUDE_DIRS}
  31. ${AWESOME_OPTIONAL_INCLUDE_DIRS})
  32. set(AWE_ICON_DIR ${SOURCE_DIR}/icons)
  33. set(AWE_THEMES_DIR ${SOURCE_DIR}/themes)
  34. set(AWE_DOC_DIR ${BUILD_DIR}/docs)
  35. set(AWE_DOC_FILES
  36. ${AWE_DOC_DIR}/00-authors.md
  37. ${AWE_DOC_DIR}/01-readme.md
  38. ${AWE_DOC_DIR}/02-contributing.md
  39. ${SOURCE_DIR}/LICENSE)
  40. set(AWE_SRCS
  41. ${BUILD_DIR}/awesome.c
  42. ${BUILD_DIR}/banning.c
  43. ${BUILD_DIR}/color.c
  44. ${BUILD_DIR}/dbus.c
  45. ${BUILD_DIR}/draw.c
  46. ${BUILD_DIR}/event.c
  47. ${BUILD_DIR}/ewmh.c
  48. ${BUILD_DIR}/keygrabber.c
  49. ${BUILD_DIR}/luaa.c
  50. ${BUILD_DIR}/mouse.c
  51. ${BUILD_DIR}/mousegrabber.c
  52. ${BUILD_DIR}/property.c
  53. ${BUILD_DIR}/root.c
  54. ${BUILD_DIR}/selection.c
  55. ${BUILD_DIR}/spawn.c
  56. ${BUILD_DIR}/stack.c
  57. ${BUILD_DIR}/strut.c
  58. ${BUILD_DIR}/systray.c
  59. ${BUILD_DIR}/xwindow.c
  60. ${BUILD_DIR}/xkb.c
  61. ${BUILD_DIR}/xrdb.c
  62. ${BUILD_DIR}/common/atoms.c
  63. ${BUILD_DIR}/common/backtrace.c
  64. ${BUILD_DIR}/common/buffer.c
  65. ${BUILD_DIR}/common/luaclass.c
  66. ${BUILD_DIR}/common/lualib.c
  67. ${BUILD_DIR}/common/luaobject.c
  68. ${BUILD_DIR}/common/util.c
  69. ${BUILD_DIR}/common/version.c
  70. ${BUILD_DIR}/common/xcursor.c
  71. ${BUILD_DIR}/common/xembed.c
  72. ${BUILD_DIR}/common/xutil.c
  73. ${BUILD_DIR}/objects/button.c
  74. ${BUILD_DIR}/objects/client.c
  75. ${BUILD_DIR}/objects/drawable.c
  76. ${BUILD_DIR}/objects/drawin.c
  77. ${BUILD_DIR}/objects/key.c
  78. ${BUILD_DIR}/objects/screen.c
  79. ${BUILD_DIR}/objects/selection_acquire.c
  80. ${BUILD_DIR}/objects/selection_transfer.c
  81. ${BUILD_DIR}/objects/selection_watcher.c
  82. ${BUILD_DIR}/objects/tag.c
  83. ${BUILD_DIR}/objects/selection_getter.c
  84. ${BUILD_DIR}/objects/window.c)
  85. set(AWE_MAN_SRCS
  86. ${SOURCE_DIR}/manpages/awesome.1.txt
  87. ${SOURCE_DIR}/manpages/awesome-client.1.txt
  88. ${SOURCE_DIR}/manpages/awesomerc.5.txt)
  89. set(AWE_MAN_LANGS it es fr de ru)
  90. # Don't strip RPATH if compiling on Solaris
  91. if (${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
  92. set(CMAKE_SKIP_BUILD_RPATH FALSE)
  93. set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
  94. set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
  95. endif()
  96. add_executable(${PROJECT_AWE_NAME}
  97. ${AWE_SRCS})
  98. # CFLAGS
  99. set(AWESOME_C_FLAGS
  100. -O1 -std=gnu99 -ggdb3 -fno-strict-aliasing -Wall -Wextra
  101. -Wchar-subscripts -Wundef -Wshadow -Wcast-align -Wwrite-strings
  102. -Wsign-compare -Wunused -Wno-unused-parameter -Wuninitialized -Winit-self
  103. -Wpointer-arith -Wformat-nonliteral
  104. -Wno-format-zero-length -Wmissing-format-attribute -Wmissing-prototypes
  105. -Wstrict-prototypes
  106. CACHE STRING "CFLAGS used to compile ${PROJECT_AWE_NAME}")
  107. mark_as_advanced(AWESOME_C_FLAGS)
  108. target_compile_options(${PROJECT_AWE_NAME} PRIVATE ${AWESOME_C_FLAGS})
  109. # Make sure awesomerc.lua is generated
  110. add_dependencies(${PROJECT_AWE_NAME} generate_awesomerc)
  111. # Linux w/ GCC requires -rdynamic to get backtrace to fully work.
  112. #
  113. # For "historical reasons", CMake adds the option to the linker flags
  114. # unnoticeably for Linux w/ GCC through its modules Linux-GNU.cmake
  115. # and Linux-GNU-C.cmake. Our build system has counted on that. But
  116. # just in case CMake should do away with the convention suddenly...
  117. if(DEFINED CMAKE_SHARED_LIBRARY_LINK_C_FLAGS AND
  118. NOT CMAKE_SHARED_LIBRARY_LINK_C_FLAGS MATCHES "-rdynamic")
  119. target_link_libraries(${PROJECT_AWE_NAME}
  120. $<$<AND:$<PLATFORM_ID:Linux>,$<C_COMPILER_ID:GNU>>:-rdynamic>)
  121. endif()
  122. # FreeBSD requires dynamic linking
  123. if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
  124. set_target_properties(${PROJECT_AWE_NAME}
  125. PROPERTIES
  126. LINK_FLAGS -export-dynamic)
  127. endif()
  128. target_link_libraries(${PROJECT_AWE_NAME}
  129. ${AWESOME_COMMON_REQUIRED_LDFLAGS}
  130. ${AWESOME_REQUIRED_LDFLAGS}
  131. ${AWESOME_OPTIONAL_LDFLAGS})
  132. # {{{ Generated sources
  133. # atoms
  134. file(MAKE_DIRECTORY ${BUILD_DIR}/common)
  135. add_custom_command(
  136. COMMAND ${SOURCE_DIR}/build-utils/atoms-ext.sh ${SOURCE_DIR}/common/atoms.list
  137. ARGS > ${BUILD_DIR}/common/atoms-extern.h
  138. OUTPUT ${BUILD_DIR}/common/atoms-extern.h
  139. WORKING_DIRECTORY ${SOURCE_DIR}
  140. DEPENDS ${SOURCE_DIR}/common/atoms.list
  141. COMMENT "Generating atoms-extern.h"
  142. VERBATIM)
  143. add_custom_command(
  144. COMMAND ${SOURCE_DIR}/build-utils/atoms-int.sh ${SOURCE_DIR}/common/atoms.list
  145. ARGS > ${BUILD_DIR}/common/atoms-intern.h
  146. OUTPUT ${BUILD_DIR}/common/atoms-intern.h
  147. WORKING_DIRECTORY ${SOURCE_DIR}
  148. DEPENDS ${SOURCE_DIR}/common/atoms.list
  149. COMMENT "Generating atoms-intern.h"
  150. VERBATIM)
  151. add_custom_target(generated_sources
  152. DEPENDS ${BUILD_DIR}/common/atoms-intern.h
  153. ${BUILD_DIR}/common/atoms-extern.h)
  154. # Default theme directory
  155. file(MAKE_DIRECTORY ${BUILD_DIR}/themes/default)
  156. file(MAKE_DIRECTORY ${BUILD_DIR}/themes/sky)
  157. file(MAKE_DIRECTORY ${BUILD_DIR}/themes/zenburn)
  158. file(MAKE_DIRECTORY ${BUILD_DIR}/themes/xresources)
  159. add_dependencies(${PROJECT_AWE_NAME} generated_sources)
  160. # }}}
  161. # {{{ Version stamp
  162. if(BUILD_FROM_GIT)
  163. add_custom_target(version_stamp ALL
  164. COMMAND ${SOURCE_DIR}/build-utils/git-version-stamp.sh
  165. ${VERSION_STAMP_FILE}
  166. ${BUILD_DIR}/awesome-version-internal.h
  167. WORKING_DIRECTORY ${SOURCE_DIR})
  168. add_dependencies(${PROJECT_AWE_NAME} version_stamp)
  169. endif()
  170. # }}}
  171. # {{{ Manpages
  172. if(GENERATE_MANPAGES)
  173. if(NOT BUILD_DIR STREQUAL SOURCE_DIR)
  174. file(MAKE_DIRECTORY ${BUILD_DIR}/manpages)
  175. endif()
  176. # add the default translation to the list of languages
  177. set(AWE_MAN_LANGS default ${AWE_MAN_LANGS})
  178. foreach(lang ${AWE_MAN_LANGS})
  179. foreach(txtfile ${AWE_MAN_SRCS})
  180. # figure the base name of the file (ie "awesome.1")
  181. GET_FILENAME_COMPONENT(tmpname ${txtfile} NAME)
  182. string(REGEX REPLACE ".txt\$" "" basename ${tmpname})
  183. # figure the relative path of the file
  184. GET_FILENAME_COMPONENT(tmppath ${txtfile} PATH)
  185. string(REPLACE ${SOURCE_DIR}/ "" relpath ${tmppath})
  186. # figure the manpage section to install to from filename
  187. string(REGEX REPLACE "^.*\\.([0-9])$" "\\1" section ${basename})
  188. # construct the language specific versions of the basename and path
  189. if (lang STREQUAL default)
  190. set(basename2 ${basename})
  191. set(relpath2 ${relpath}/man${section})
  192. else()
  193. set(basename2 ${basename}.${lang})
  194. set(relpath2 ${relpath}/${lang}/man${section})
  195. endif()
  196. # create the build directory (if it does not exist)
  197. file(MAKE_DIRECTORY ${BUILD_DIR}/${relpath2})
  198. # set the final filenames
  199. set(txtfile ${SOURCE_DIR}/${relpath}/${basename2}.txt)
  200. set(gzfile ${BUILD_DIR}/${relpath2}/${basename}.gz)
  201. set(manfile ${BUILD_DIR}/${relpath2}/${basename})
  202. if (lang STREQUAL default)
  203. set(asciilang en)
  204. else()
  205. set(asciilang ${lang})
  206. endif()
  207. add_custom_command(
  208. COMMAND ${ASCIIDOCTOR_EXECUTABLE} -a lang=${asciilang} -d manpage -b manpage -o ${manfile} ${txtfile}
  209. WORKING_DIRECTORY ${BUILD_DIR}/${relpath2}
  210. OUTPUT ${manfile}
  211. DEPENDS ${txtfile}
  212. VERBATIM)
  213. if(COMPRESS_MANPAGES)
  214. add_custom_command(
  215. COMMAND ${GZIP_EXECUTABLE} < ${manfile} > ${gzfile}
  216. OUTPUT ${gzfile}
  217. WORKING_DIRECTORY ${BUILD_DIR}/${relpath2}
  218. DEPENDS ${manfile}
  219. VERBATIM)
  220. set(MAN_FILES ${MAN_FILES} ${gzfile})
  221. else()
  222. set(MAN_FILES ${MAN_FILES} ${manfile})
  223. endif()
  224. endforeach()
  225. endforeach()
  226. add_custom_target(man ALL DEPENDS ${MAN_FILES})
  227. endif()
  228. # }}}
  229. # {{{ Lua API Documentation
  230. if(GENERATE_DOC)
  231. if(NOT BUILD_DIR STREQUAL SOURCE_DIR)
  232. file(MAKE_DIRECTORY ${BUILD_DIR}/lib)
  233. file(MAKE_DIRECTORY ${BUILD_DIR}/doc)
  234. endif()
  235. file(GLOB_RECURSE AWE_LUA_FILES ${BUILD_DIR}/lib/*.lua)
  236. file(GLOB_RECURSE AWE_MD_FILES ${AWE_DOC_DIR}/*.md)
  237. file(GLOB_RECURSE AWE_MD_LUA_FILES RELATIVE "${SOURCE_DIR}/docs" docs/*.md.lua)
  238. foreach(file ${AWE_MD_LUA_FILES})
  239. # Remove .lua file extensions
  240. string(REPLACE ".lua" "" file ${file})
  241. list(APPEND AWE_MD_FILES "${AWE_DOC_DIR}/${file}")
  242. endforeach()
  243. # Copy the images to the build directory
  244. file(COPY ${SOURCE_DIR}/docs/images DESTINATION ${BUILD_DIR}/doc)
  245. # Copy ldoc files.
  246. configure_file(${SOURCE_DIR}/docs/ldoc.css ${BUILD_DIR}/docs COPYONLY)
  247. configure_file(${SOURCE_DIR}/docs/ldoc.ltp ${BUILD_DIR}/docs COPYONLY)
  248. add_custom_target(ldoc ALL
  249. DEPENDS ${BUILD_DIR}/doc/index.html
  250. )
  251. if (STRICT_TESTS)
  252. set(ldoc_args --fatalwarnings .)
  253. set(ldoc_desc_suffix " (fatal warnings)")
  254. else()
  255. set(ldoc_args .)
  256. endif()
  257. add_custom_command(
  258. OUTPUT ${BUILD_DIR}/doc/index.html
  259. COMMAND ${LDOC_EXECUTABLE} ${ldoc_args}
  260. WORKING_DIRECTORY ${AWE_DOC_DIR}
  261. DEPENDS
  262. ${AWE_SRCS}
  263. ${AWE_LUA_FILES}
  264. ${AWE_MD_FILES}
  265. ${BUILD_DIR}/docs/config.ld
  266. ${BUILD_DIR}/docs/ldoc.css
  267. ${BUILD_DIR}/docs/ldoc.ltp
  268. generate_awesomerc
  269. generate-examples
  270. COMMENT "Generating API documentation${ldoc_desc_suffix}")
  271. endif()
  272. # }}}
  273. # {{{ Theme icons
  274. file(GLOB_RECURSE icon_sources RELATIVE ${SOURCE_DIR} ${SOURCE_DIR}/themes/*.png)
  275. foreach(icon ${icon_sources})
  276. # Copy all icons to the build dir to simplify the following code.
  277. # Source paths are interpreted relative to ${SOURCE_DIR}, target paths
  278. # relative to ${BUILD_DIR}.
  279. get_filename_component(icon_path ${icon} PATH)
  280. get_filename_component(icon_name ${icon} NAME)
  281. file(COPY ${icon} DESTINATION ${icon_path})
  282. set(ALL_ICONS ${ALL_ICONS} "${icon_path}/${icon_name}")
  283. endforeach()
  284. macro(a_icon_convert match replacement input)
  285. string(REPLACE ${match} ${replacement} output ${input})
  286. if(NOT ${input} STREQUAL ${output} AND NOT ";${ALL_ICONS};" MATCHES ";${output};")
  287. set(ALL_ICONS ${ALL_ICONS} ${output})
  288. add_custom_command(
  289. COMMAND ${CONVERT_EXECUTABLE} ${input} -strip ${ARGN} ${output}
  290. OUTPUT ${output}
  291. DEPENDS ${input}
  292. VERBATIM)
  293. endif()
  294. endmacro()
  295. foreach(icon ${ALL_ICONS})
  296. # Make unfocused icons translucent
  297. a_icon_convert("_focus" "_normal" ${icon}
  298. -colorspace rgb -gamma 0.6 -channel A -evaluate Multiply 0.4)
  299. endforeach()
  300. foreach(icon ${ALL_ICONS})
  301. # Make inactive icons grayscale
  302. a_icon_convert("_active" "_inactive" ${icon}
  303. -colorspace Gray)
  304. endforeach()
  305. add_custom_target(generated_icons ALL DEPENDS ${ALL_ICONS})
  306. # }}}
  307. # {{{ Dist tarball
  308. if(BUILD_FROM_GIT)
  309. add_custom_target(dist
  310. COMMAND ${SOURCE_DIR}/build-utils/dist.sh ${VERSION}
  311. WORKING_DIRECTORY ${SOURCE_DIR})
  312. endif()
  313. # }}}
  314. # {{{ Installation
  315. install(TARGETS ${PROJECT_AWE_NAME} RUNTIME DESTINATION bin)
  316. install(FILES "utils/awesome-client" DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
  317. install(DIRECTORY ${BUILD_DIR}/lib DESTINATION ${AWESOME_DATA_PATH}
  318. PATTERN "*.in" EXCLUDE)
  319. install(FILES ${BUILD_DIR}/awesomerc.lua DESTINATION ${AWESOME_SYSCONFDIR}
  320. RENAME rc.lua)
  321. if(GENERATE_MANPAGES)
  322. if(COMPRESS_MANPAGES)
  323. set(regex "\\.(xml|txt|[0-9])$")
  324. else()
  325. set(regex "\\.(xml|txt|gz)$")
  326. endif()
  327. install(DIRECTORY ${BUILD_DIR}/${relpath}/ DESTINATION ${AWESOME_MAN_PATH}
  328. REGEX ${regex} EXCLUDE )
  329. endif()
  330. install(DIRECTORY ${AWE_ICON_DIR} DESTINATION ${AWESOME_DATA_PATH})
  331. install(DIRECTORY ${SOURCE_DIR}/themes DESTINATION ${AWESOME_DATA_PATH}
  332. PATTERN "*.lua" EXCLUDE)
  333. install(DIRECTORY ${BUILD_DIR}/themes DESTINATION ${AWESOME_DATA_PATH}
  334. PATTERN "*.lua")
  335. install(FILES ${AWE_DOC_FILES} DESTINATION ${AWESOME_DOC_PATH})
  336. install(FILES "awesome.desktop" DESTINATION ${AWESOME_XSESSION_PATH})
  337. if(GENERATE_DOC)
  338. install(DIRECTORY ${BUILD_DIR}/doc DESTINATION ${AWESOME_DOC_PATH})
  339. endif()
  340. # }}}
  341. # {{{ Tests
  342. add_custom_target(check DEPENDS check-integration)
  343. add_executable(test-gravity tests/test-gravity.c)
  344. target_link_libraries(test-gravity
  345. ${AWESOME_COMMON_REQUIRED_LDFLAGS} ${AWESOME_REQUIRED_LDFLAGS})
  346. if(DO_COVERAGE)
  347. set(TESTS_RUN_ENV DO_COVERAGE=1)
  348. endif()
  349. # Start AwesomeWM tests with `--screen off`
  350. if ("${TEST_MANUAL_SCREENS}" MATCHES "1")
  351. set(TEST_RUN_ARGS "--W --m")
  352. endif()
  353. add_custom_target(check-integration
  354. ${CMAKE_COMMAND} -E env CMAKE_BINARY_DIR='${CMAKE_BINARY_DIR}' ${TESTS_RUN_ENV} ./tests/run.sh \$\${TEST_RUN_ARGS:--W}
  355. WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
  356. COMMENT "Running integration tests"
  357. DEPENDS ${PROJECT_AWE_NAME}
  358. USES_TERMINAL)
  359. add_dependencies(check-integration test-gravity)
  360. add_custom_target(check-themes
  361. ${CMAKE_COMMAND} -E env CMAKE_BINARY_DIR='${CMAKE_BINARY_DIR}' ${TESTS_RUN_ENV} ./tests/themes/run.sh
  362. WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
  363. COMMENT "Testing themes"
  364. USES_TERMINAL
  365. DEPENDS generated_icons generate_awesomerc ${PROJECT_AWE_NAME})
  366. add_dependencies(check check-themes)
  367. add_custom_target(check-requires
  368. lua "${CMAKE_SOURCE_DIR}/build-utils/check_for_invalid_requires.lua"
  369. WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
  370. COMMENT "Checking use of require()"
  371. USES_TERMINAL
  372. VERBATIM)
  373. list(APPEND CHECK_QA_TARGETS check-requires)
  374. a_find_program(BUSTED_EXECUTABLE busted FALSE)
  375. if(BUSTED_EXECUTABLE)
  376. if(DO_COVERAGE)
  377. set(BUSTED_ARGS "--coverage")
  378. else()
  379. set(BUSTED_ARGS)
  380. endif()
  381. add_custom_target(check-unit
  382. COMMAND ${BUSTED_EXECUTABLE} ${BUSTED_ARGS}
  383. WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
  384. COMMENT "Running unit tests"
  385. VERBATIM)
  386. else()
  387. add_custom_target(check-unit true
  388. COMMENT "Skipping check-unit, since busted was not found (during configuration)"
  389. VERBATIM)
  390. endif()
  391. add_dependencies(check check-unit)
  392. a_find_program(LUACHECK_EXECUTABLE luacheck FALSE)
  393. if(LUACHECK_EXECUTABLE)
  394. add_custom_target(luacheck
  395. ${LUACHECK_EXECUTABLE} lib spec tests themes awesomerc.lua
  396. WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
  397. COMMENT "Running Luacheck"
  398. VERBATIM)
  399. list(APPEND CHECK_QA_TARGETS luacheck)
  400. endif()
  401. add_custom_target(check-qa DEPENDS ${CHECK_QA_TARGETS})
  402. add_dependencies(check check-qa check-examples)
  403. # }}}
  404. INCLUDE(${CMAKE_SOURCE_DIR}/Packaging.cmake)
  405. # vim: filetype=cmake:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80:foldmethod=marker