CMakeLists.txt 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  1. cmake_minimum_required(VERSION 3.14.0 FATAL_ERROR)
  2. if (POLICY CMP0077)
  3. cmake_policy(SET CMP0077 NEW)
  4. endif ()
  5. if (POLICY CMP0069)
  6. cmake_policy(SET CMP0069 NEW)
  7. endif ()
  8. project(cppgir VERSION 2.0.0)
  9. include(GNUInstallDirs)
  10. include(CTest)
  11. enable_testing()
  12. set(CMAKE_INCLUDE_CURRENT_DIR ON)
  13. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  14. set(CMAKE_CXX_STANDARD 14)
  15. if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
  16. add_compile_options (-Wall -Wextra $<$<COMPILE_LANGUAGE:CXX>:-Wnon-virtual-dtor>)
  17. endif()
  18. # clang debug stdc++
  19. if (${CMAKE_C_COMPILER_ID} STREQUAL "Clang")
  20. set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fstandalone-debug")
  21. endif()
  22. ## OPTIONS ##
  23. option(BUILD_DOC "build documentation" ON)
  24. option(BUILD_EXAMPLES "build examples" ON)
  25. option(BUILD_EMBED_IGNORE "embed default ignore" OFF)
  26. option(EXAMPLES_EXPECTED "use expected<> in examples" OFF)
  27. option(EXAMPLES_DL "use dynamic symbol load in examples" OFF)
  28. option(INTERNAL_EXPECTED "use internal expected-lite" ON)
  29. option(LINK_STDFS "link to stdc++fs" OFF)
  30. set(BUILD_FMT AUTO CACHE STRING "format library")
  31. set_property(CACHE BUILD_FMT PROPERTY STRINGS AUTO FMTLIB STDFORMAT)
  32. set(GTK_MAJOR GTK3 CACHE STRING "gtk version")
  33. set_property(CACHE GTK_MAJOR PROPERTY STRINGS GTK3 GTK4)
  34. set(GIR_DIR ${CMAKE_INSTALL_FULL_DATADIR}/gir-1.0 CACHE STRING "extra GIR search directory")
  35. ## CONTENT ##
  36. find_package(Boost 1.58 REQUIRED)
  37. # check fmtlib
  38. find_path(FORMAT_INCLUDE_DIRS fmt/format.h)
  39. find_library(FORMAT_LIBRARIES fmt)
  40. if (${FORMAT_INCLUDE_DIRS} STREQUAL "FORMAT_INCLUDE_DIRS-NOTFOUND" OR
  41. ${FORMAT_LIBRARIES} STREQUAL "FORMAT_LIBRARIES-NOTFOUND")
  42. set(HAVE_FMTLIB OFF)
  43. else()
  44. set(HAVE_FMTLIB ON)
  45. endif()
  46. message(STATUS "fmtlib available status: ${HAVE_FMTLIB}")
  47. # check C++20 format
  48. try_compile(HAVE_STDFORMAT ${CMAKE_BINARY_DIR}
  49. SOURCES ${CMAKE_CURRENT_LIST_DIR}/cmake/cpp20_format.cpp
  50. CXX_STANDARD 20)
  51. message(STATUS "std::format available status: ${HAVE_STDFORMAT}")
  52. # check and decide on which fmt to use
  53. set(USE_FMTLIB NONE)
  54. if (BUILD_FMT STREQUAL "AUTO")
  55. if (HAVE_FMTLIB)
  56. set(USE_FMTLIB ON)
  57. elseif (HAVE_STDFORMAT)
  58. set(USE_FMTLIB OFF)
  59. endif()
  60. elseif(BUILD_FMT STREQUAL "FMTLIB" AND HAVE_FMTLIB)
  61. set(USE_FMTLIB ON)
  62. elseif(BUILD_FMT STREQUAL "STDFORMAT" AND HAVE_STDFORMAT)
  63. set(USE_FMTLIB OFF)
  64. endif()
  65. if (USE_FMTLIB STREQUAL "NONE")
  66. message (FATAL_ERROR "no format library found")
  67. endif()
  68. # required ignore file
  69. set(GI_IGNORE_FILE_DIR data)
  70. set(GI_IGNORE_FILE cppgir.ignore)
  71. file(READ data/cppgir.ignore CPPGIR_IGNORE)
  72. if (UNIX)
  73. set(GI_IGNORE_FILE_PLATFORM cppgir_unix.ignore)
  74. file(READ data/cppgir_unix.ignore CPPGIR_UNIX_IGNORE)
  75. else ()
  76. set(GI_IGNORE_FILE_PLATFORM cppgir_win.ignore)
  77. file(READ data/cppgir_win.ignore CPPGIR_WIN_IGNORE)
  78. endif ()
  79. set(GI_IGNORE_FILE_INSTALL_DIR ${CMAKE_INSTALL_FULL_DATADIR}/${PROJECT_NAME})
  80. add_executable(cppgir tools/cppgir.cpp
  81. tools/genbase.cpp tools/genbase.hpp
  82. tools/genns.cpp tools/genns.hpp
  83. tools/genutils.cpp tools/genutils.hpp
  84. tools/function.cpp tools/function.hpp
  85. tools/repository.cpp tools/repository.hpp
  86. tools/common.hpp)
  87. target_link_libraries(cppgir Boost::boost)
  88. if (UNIX)
  89. # add fixed fallback search places
  90. set(GI_DEFAULT_GIRPATH "/usr/${CMAKE_INSTALL_DATADIR}:/usr/local/${CMAKE_INSTALL_DATADIR}")
  91. target_compile_definitions(cppgir PRIVATE
  92. -DDEFAULT_GIRPATH=${GI_DEFAULT_GIRPATH}
  93. -DGI_GIR_DIR=${GIR_DIR}
  94. -DGI_DATA_DIR=${CMAKE_INSTALL_FULL_DATADIR}/gir-1.0
  95. -DGI_DEF_DIR=/usr/share/gir-1.0
  96. )
  97. endif ()
  98. if (BUILD_EMBED_IGNORE)
  99. # generate embedded ignore data
  100. configure_file(tools/ignore.hpp.in tools/ignore.hpp @ONLY)
  101. target_include_directories(cppgir PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/tools)
  102. set(GENERATED_IGNORE "")
  103. else()
  104. target_compile_definitions(cppgir PRIVATE
  105. -DDEFAULT_IGNORE_FILE=${GI_IGNORE_FILE_INSTALL_DIR}/${GI_IGNORE_FILE}:${GI_IGNORE_FILE_INSTALL_DIR}/${GI_IGNORE_FILE_PLATFORM})
  106. set(GENERATED_IGNORE --ignore ${GI_IGNORE_FILE_DIR}/${GI_IGNORE_FILE}:${GI_IGNORE_FILE_DIR}/${GI_IGNORE_FILE_PLATFORM})
  107. endif()
  108. if (USE_FMTLIB)
  109. target_link_libraries(cppgir ${FORMAT_LIBRARIES})
  110. set_property(TARGET cppgir PROPERTY CXX_STANDARD 17)
  111. else()
  112. set_property(TARGET cppgir PROPERTY CXX_STANDARD 20)
  113. endif()
  114. if (LINK_STDFS)
  115. # some older gcc might sometimes (?) need this, even in c++17 mode
  116. # see issue #80
  117. target_link_libraries(cppgir stdc++fs)
  118. endif ()
  119. add_executable(CppGir::cppgir ALIAS cppgir)
  120. add_library(gi INTERFACE)
  121. target_include_directories(gi INTERFACE
  122. "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>"
  123. "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/gi>"
  124. "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/override>"
  125. "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}>"
  126. "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/gi>"
  127. "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/override>"
  128. )
  129. add_library(CppGir::gi ALIAS gi)
  130. if (INTERNAL_EXPECTED)
  131. set(EXPECTED_LITE_INCLUDE "expected-lite/include")
  132. if (EXISTS ${CMAKE_CURRENT_LIST_DIR}/${EXPECTED_LITE_INCLUDE}/nonstd/expected.hpp)
  133. target_include_directories(gi INTERFACE
  134. "$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${EXPECTED_LITE_INCLUDE}>"
  135. )
  136. else ()
  137. message (FATAL_ERROR "missing submodule expected-lite")
  138. endif ()
  139. else ()
  140. find_package(expected-lite)
  141. if (expected-lite_FOUND)
  142. target_link_libraries(gi INTERFACE nonstd::expected-lite)
  143. else ()
  144. target_compile_features(gi INTERFACE cxx_std_23)
  145. message (WARNING "thus cppgir headers will require C++23")
  146. endif ()
  147. endif ()
  148. if (BUILD_EXAMPLES OR BUILD_TESTING)
  149. include(FindPkgConfig)
  150. pkg_check_modules(GOBJECT gobject-2.0)
  151. endif ()
  152. if (BUILD_EXAMPLES)
  153. pkg_check_modules(GIO gio-2.0 gio-unix-2.0)
  154. pkg_check_modules(GST gstreamer-1.0)
  155. if (GTK_MAJOR STREQUAL "GTK3")
  156. pkg_check_modules(GTK gtk+-3.0)
  157. set(GTK_GIR Gtk-3.0)
  158. endif ()
  159. if (GTK_MAJOR STREQUAL "GTK4")
  160. # only plain gio is a dependency, but GIR requires other gio parts
  161. pkg_check_modules(GTK gtk4 gtk4-unix-print gio-unix-2.0)
  162. set(GTK_GIR Gtk-4.0)
  163. endif ()
  164. endif ()
  165. ## TEST ##
  166. if (BUILD_TESTING AND GOBJECT_FOUND)
  167. add_library(ltest
  168. test/test_object.c test/test_object.h test/test_boxed.c test/test_boxed.h)
  169. target_include_directories(ltest PUBLIC "gi" "override")
  170. target_link_libraries(ltest gi ${GOBJECT_LDFLAGS})
  171. target_compile_options(ltest PUBLIC ${GOBJECT_CFLAGS})
  172. add_executable(gi-test test/main.cpp)
  173. target_link_libraries(gi-test PRIVATE ltest)
  174. add_test(NAME gi-test COMMAND gi-test)
  175. # a C++17 version of the above
  176. add_executable(gi-test-17 test/main.cpp)
  177. target_link_libraries(gi-test-17 PRIVATE ltest)
  178. set_property(TARGET gi-test-17 PROPERTY CXX_STANDARD 17)
  179. add_test(NAME gi-test-17 COMMAND gi-test-17)
  180. endif ()
  181. ## EXAMPLES ##
  182. # generated wrappers' dir
  183. set (GENERATED_DIR_DEFAULT "/tmp/gi")
  184. set (GENERATED_ARGS "")
  185. set (EXAMPLES_LIBS "")
  186. if (EXAMPLES_EXPECTED)
  187. set (GENERATED_DIR_DEFAULT "${GENERATED_DIR_DEFAULT}_expected")
  188. set (GENERATED_ARGS "${GENERATED_ARGS}" "--expected")
  189. endif ()
  190. if (EXAMPLES_DL)
  191. set (GENERATED_DIR_DEFAULT "${GENERATED_DIR_DEFAULT}_dl")
  192. set (GENERATED_ARGS "${GENERATED_ARGS}" "--dl")
  193. set (EXAMPLES_LIBS ${CMAKE_DL_LIBS})
  194. endif ()
  195. if (NOT GENERATED_DIR)
  196. set (GENERATED_DIR ${GENERATED_DIR_DEFAULT})
  197. endif ()
  198. set(EXAMPLE_TARGETS "")
  199. set(EXAMPLE_NS "")
  200. # if both --dl and --expected are enabled,
  201. # all function return value become gi::result<>
  202. # to keep examples straight and simple,
  203. # only few of them are adjusted to handle that scenario
  204. set(PLAIN_API ON)
  205. if (EXAMPLES_DL AND EXAMPLES_EXPECTED)
  206. set(PLAIN_API OFF)
  207. endif ()
  208. include(CheckCXXCompilerFlag)
  209. check_cxx_compiler_flag("-mxgot" NEEDS_LARGE_GOT)
  210. if (GOBJECT_FOUND)
  211. add_executable(example-gobject EXCLUDE_FROM_ALL examples/gobject.cpp)
  212. target_compile_options(example-gobject PRIVATE ${GOBJECT_CFLAGS})
  213. target_link_libraries(example-gobject PRIVATE ${GOBJECT_LDFLAGS})
  214. set_property(TARGET example-gobject PROPERTY CXX_STANDARD 14)
  215. message(STATUS "adding GObject example")
  216. set(EXAMPLE_TARGETS ${EXAMPLE_TARGETS} example-gobject)
  217. set(EXAMPLE_NS ${EXAMPLE_NS} GObject-2.0)
  218. endif ()
  219. if (GIO_FOUND AND PLAIN_API)
  220. add_executable(example-gio EXCLUDE_FROM_ALL examples/gio.cpp)
  221. target_compile_options(example-gio PRIVATE ${GIO_CFLAGS})
  222. target_link_libraries(example-gio PRIVATE ${GIO_LDFLAGS})
  223. set_property(TARGET example-gio PROPERTY CXX_STANDARD 17)
  224. message(STATUS "adding Gio communication example")
  225. set(EXAMPLE_TARGETS ${EXAMPLE_TARGETS} example-gio)
  226. endif ()
  227. if (GIO_FOUND)
  228. add_executable(example-gio-dbus-client EXCLUDE_FROM_ALL examples/gio-dbus-client.cpp)
  229. target_compile_options(example-gio-dbus-client PRIVATE ${GIO_CFLAGS})
  230. target_link_libraries(example-gio-dbus-client PRIVATE ${GIO_LDFLAGS})
  231. message(STATUS "adding Gio dbus example")
  232. set(EXAMPLE_TARGETS ${EXAMPLE_TARGETS} example-gio-dbus-client)
  233. set(EXAMPLE_NS ${EXAMPLE_NS} Gio-2.0)
  234. endif ()
  235. if (GIO_FOUND AND PLAIN_API)
  236. find_package(Boost 1.65 COMPONENTS fiber)
  237. if (Boost_FOUND)
  238. # no import target; multiple calls do not override first call targets
  239. add_executable(example-gio-async EXCLUDE_FROM_ALL examples/gio-async.cpp)
  240. target_include_directories(example-gio-async PRIVATE ${Boost_INCLUDE_DIRS})
  241. target_compile_options(example-gio-async PRIVATE ${GIO_CFLAGS})
  242. target_link_libraries(example-gio-async PRIVATE ${GIO_LDFLAGS} ${Boost_LIBRARIES})
  243. message(STATUS "adding Gio async example")
  244. set(EXAMPLE_TARGETS ${EXAMPLE_TARGETS} example-gio-async)
  245. else ()
  246. set(GIO_ASYNC_EXAMPLE_TARGET "")
  247. message(STATUS "disabling Gio async example")
  248. endif ()
  249. endif ()
  250. if (GST_FOUND AND PLAIN_API)
  251. add_executable(example-gst EXCLUDE_FROM_ALL examples/gst.cpp)
  252. # add generated files
  253. foreach (GENSRC IN ITEMS ${GENERATED_DIR}/glib/glib.cpp
  254. ${GENERATED_DIR}/gst/gst.cpp ${GENERATED_DIR}/gobject/gobject.cpp)
  255. target_sources(example-gst PRIVATE ${GENSRC})
  256. set_property(SOURCE ${GENSRC} PROPERTY GENERATED true)
  257. endforeach ()
  258. target_link_libraries(example-gst PRIVATE ${GST_LDFLAGS})
  259. target_compile_options(example-gst PRIVATE ${GST_CFLAGS})
  260. # a lot of class methods are wrapped these days, so there is some overlap
  261. # however, no class implementation is used here, so arrange for suppression
  262. target_compile_definitions(example-gst PRIVATE GI_CLASS_IMPL_PRAGMA=1)
  263. set_property(TARGET example-gst PROPERTY CXX_STANDARD 14)
  264. if (NEEDS_LARGE_GOT)
  265. set_property(SOURCE ${GENERATED_DIR}/gst/gst.cpp APPEND PROPERTY COMPILE_OPTIONS "-mxgot")
  266. endif ()
  267. message(STATUS "adding Gst example")
  268. set(EXAMPLE_TARGETS ${EXAMPLE_TARGETS} example-gst)
  269. set(EXAMPLE_NS ${EXAMPLE_NS} Gst-1.0)
  270. endif ()
  271. if (GTK_FOUND AND PLAIN_API)
  272. add_executable(example-gtk EXCLUDE_FROM_ALL examples/gtk.cpp examples/gtk-obj.cpp)
  273. target_compile_options(example-gtk PRIVATE ${GTK_CFLAGS})
  274. target_link_libraries(example-gtk PRIVATE ${GTK_LIBRARIES})
  275. target_compile_options(example-gtk PRIVATE -DEXAMPLES_DIR=${CMAKE_CURRENT_LIST_DIR}/examples)
  276. if (NEEDS_LARGE_GOT)
  277. set_property(SOURCE examples/gtk-obj.cpp APPEND PROPERTY COMPILE_OPTIONS "-mxgot")
  278. endif ()
  279. # sanity check
  280. if (NOT GTK_GIR)
  281. message(FATAL_ERROR "unknown Gtk GIR")
  282. endif ()
  283. message(STATUS "adding Gtk example ${GTK_GIR}")
  284. set(EXAMPLE_TARGETS ${EXAMPLE_TARGETS} example-gtk)
  285. set(EXAMPLE_NS ${EXAMPLE_NS} ${GTK_GIR})
  286. endif ()
  287. # optional Qt example
  288. if (BUILD_EXAMPLES)
  289. find_package(Qt5Core 5.9)
  290. endif ()
  291. if (Qt5Core_FOUND AND GIO_FOUND AND PLAIN_API)
  292. set(CMAKE_INCLUDE_CURRENT_DIR ON)
  293. add_executable(example-gio-qt-async EXCLUDE_FROM_ALL examples/gio-qt-async.cpp)
  294. target_compile_options(example-gio-qt-async PRIVATE ${GIO_CFLAGS})
  295. target_link_libraries(example-gio-qt-async PRIVATE ${GIO_LDFLAGS} Qt5::Core)
  296. set_target_properties(example-gio-qt-async PROPERTIES AUTOMOC ON)
  297. message(STATUS "adding Qt GIO async example")
  298. set(EXAMPLE_TARGETS ${EXAMPLE_TARGETS} example-gio-qt-async)
  299. endif ()
  300. add_custom_command(OUTPUT ${GENERATED_DIR}
  301. COMMENT "Generating wrapper code for: ${EXAMPLE_NS}"
  302. DEPENDS cppgir ${GI_IGNORE_FILE_DIR}/${GI_IGNORE_FILE} ${GI_IGNORE_FILE_DIR}/${GI_IGNORE_FILE_PLATFORM}
  303. COMMAND cppgir --class --class-full
  304. ${GENERATED_IGNORE}
  305. ${GENERATED_ARGS} --output ${GENERATED_DIR} ${EXAMPLE_NS}
  306. COMMAND cmake -E touch_nocreate ${GENERATED_DIR}
  307. WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
  308. # example might have been added if dependencies found
  309. # make sure to disable as needed
  310. if (NOT BUILD_EXAMPLES)
  311. set(EXAMPLE_TARGETS "")
  312. endif ()
  313. message(STATUS "example programs: ${EXAMPLE_TARGETS}")
  314. add_custom_target(examples)
  315. if (EXAMPLE_TARGETS)
  316. add_dependencies(examples ${EXAMPLE_TARGETS})
  317. endif ()
  318. add_custom_target(wrappers DEPENDS ${GENERATED_DIR})
  319. foreach (example ${EXAMPLE_TARGETS})
  320. target_link_libraries(${example} PRIVATE gi ${EXAMPLES_LIBS})
  321. target_include_directories(${example} PRIVATE ${GENERATED_DIR})
  322. add_dependencies(${example} wrappers)
  323. endforeach ()
  324. ## INSTALL ##
  325. # manpage processor
  326. find_program(RONN ronn DOC "ronn markdown man page processor")
  327. if (${RONN} STREQUAL "RONN-NOTFOUND")
  328. message(STATUS "ronn manpage processor not found; not building manpage")
  329. elseif (BUILD_DOC)
  330. message(STATUS "building manpage")
  331. add_custom_command(OUTPUT cppgir.1
  332. COMMAND ${RONN} --roff --pipe ${CMAKE_CURRENT_LIST_DIR}/docs/cppgir.md > cppgir.1
  333. DEPENDS docs/cppgir.md
  334. WORKING_DIRECTORY .)
  335. add_custom_target(manpages ALL DEPENDS cppgir.1)
  336. endif()
  337. # headers
  338. install(DIRECTORY gi override
  339. DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}/${PROJECT_NAME})
  340. if (INTERNAL_EXPECTED)
  341. install(DIRECTORY ${EXPECTED_LITE_INCLUDE}/nonstd
  342. DESTINATION ${CMAKE_INSTALL_FULL_INCLUDEDIR}/${PROJECT_NAME}/gi)
  343. endif ()
  344. # doc
  345. install(FILES README.md docs/cppgir.md
  346. DESTINATION ${CMAKE_INSTALL_FULL_DOCDIR})
  347. install(DIRECTORY examples
  348. DESTINATION ${CMAKE_INSTALL_FULL_DOCDIR})
  349. if (TARGET manpages)
  350. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cppgir.1
  351. DESTINATION ${CMAKE_INSTALL_FULL_MANDIR}/man1)
  352. endif()
  353. # pkgconfig
  354. set(PKG_CONFIG "${CMAKE_BINARY_DIR}/${PROJECT_NAME}.pc")
  355. set(PKG_CONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
  356. # configure pkg config file
  357. configure_file("cmake/cppgir.pc.in" "${PKG_CONFIG}" @ONLY)
  358. install(FILES "${PKG_CONFIG}"
  359. DESTINATION "${PKG_CONFIG_INSTALL_DIR}")
  360. # ignore file
  361. if (NOT BUILD_EMBED_IGNORE)
  362. install(FILES ${GI_IGNORE_FILE_DIR}/${GI_IGNORE_FILE} ${GI_IGNORE_FILE_DIR}/${GI_IGNORE_FILE_PLATFORM}
  363. DESTINATION ${GI_IGNORE_FILE_INSTALL_DIR})
  364. endif()
  365. # cmake EXPORTS
  366. set(CONFIG_PACKAGE_LOCATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
  367. set(CONFIG_VERSION_NAME ${PROJECT_NAME}-config-version.cmake)
  368. set(CONFIG_TARGETS_NAME ${PROJECT_NAME}-targets.cmake)
  369. set(CONFIG_NAME ${PROJECT_NAME}-config.cmake)
  370. if (INTERNAL_EXPECTED OR NOT expected-lite_FOUND)
  371. set(CONFIG_NAME_IN ${CONFIG_NAME})
  372. else ()
  373. set(CONFIG_NAME_IN ${PROJECT_NAME}-config-deps.cmake)
  374. endif ()
  375. set(TARGETS_EXPORT_NAME CppGirTargets)
  376. # generator
  377. set_property(TARGET cppgir
  378. PROPERTY IMPORTED_LOCATION "${CMAKE_INSTALL_FULL_BINDIR}")
  379. install(TARGETS cppgir
  380. DESTINATION ${CMAKE_INSTALL_FULL_BINDIR}
  381. EXPORT "${TARGETS_EXPORT_NAME}")
  382. # headers
  383. install(TARGETS gi EXPORT "${TARGETS_EXPORT_NAME}")
  384. include(CMakePackageConfigHelpers)
  385. write_basic_package_version_file(
  386. "${CMAKE_CURRENT_BINARY_DIR}/cmake/${CONFIG_VERSION_NAME}"
  387. VERSION ${PROJECT_VERSION}
  388. COMPATIBILITY SameMajorVersion
  389. ARCH_INDEPENDENT
  390. )
  391. install(FILES
  392. "${CMAKE_CURRENT_BINARY_DIR}/cmake/${CONFIG_VERSION_NAME}"
  393. DESTINATION ${CONFIG_PACKAGE_LOCATION}
  394. )
  395. install(FILES cmake/${CONFIG_NAME_IN} RENAME ${CONFIG_NAME}
  396. DESTINATION ${CONFIG_PACKAGE_LOCATION}
  397. )
  398. export(EXPORT ${TARGETS_EXPORT_NAME}
  399. FILE "${CMAKE_CURRENT_BINARY_DIR}/cmake/${CONFIG_TARGETS_NAME}"
  400. NAMESPACE CppGir::
  401. )
  402. install(EXPORT ${TARGETS_EXPORT_NAME}
  403. FILE ${CONFIG_TARGETS_NAME}
  404. NAMESPACE CppGir::
  405. DESTINATION ${CONFIG_PACKAGE_LOCATION}
  406. )
  407. # uninstall target;
  408. # intermediate directories are not removed though
  409. if(NOT TARGET uninstall)
  410. configure_file(
  411. "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake-uninstall.cmake.in"
  412. "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
  413. IMMEDIATE @ONLY)
  414. add_custom_target(uninstall
  415. COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
  416. endif()