CMakeLists.txt 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. cmake_minimum_required(VERSION 3.18)
  2. project(iniparser VERSION 4.2.3)
  3. include(GNUInstallDirs)
  4. include(CMakePackageConfigHelpers)
  5. include(CMakeDependentOption)
  6. option(
  7. BUILD_SHARED_LIBS
  8. "Build using shared libraries"
  9. ON)
  10. # For packaging by tools like bitbake, shared and static libs should be build
  11. # at once
  12. CMAKE_DEPENDENT_OPTION(BUILD_STATIC_LIBS "Build static libs" ON
  13. "BUILD_SHARED_LIBS" OFF)
  14. if(BUILD_SHARED_LIBS)
  15. list(
  16. APPEND
  17. TARGET_TYPES
  18. "shared")
  19. endif()
  20. if(BUILD_STATIC_LIBS OR NOT BUILD_SHARED_LIBS)
  21. list(
  22. APPEND
  23. TARGET_TYPES
  24. "static")
  25. endif()
  26. set(CONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}")
  27. foreach(TARGET_TYPE ${TARGET_TYPES})
  28. set(TARGET_NAME "${PROJECT_NAME}-${TARGET_TYPE}")
  29. set(TARGETS_EXPORT_NAME "${TARGET_NAME}Targets")
  30. string(TOUPPER ${TARGET_TYPE} UPPER_TARGET_TYPE)
  31. message(DEBUG "TARGET_TYPE: ${TARGET_TYPE}")
  32. message(DEBUG "UPPER_TARGET_TYPE: ${UPPER_TARGET_TYPE}")
  33. message(DEBUG "TARGET_NAME: ${TARGET_NAME}")
  34. add_library(
  35. ${TARGET_NAME}
  36. ${UPPER_TARGET_TYPE}
  37. "src/iniparser.c"
  38. "src/dictionary.c")
  39. set(PUBLIC_HEADERS "src/iniparser.h" "src/dictionary.h")
  40. set_target_properties(${TARGET_NAME} PROPERTIES PUBLIC_HEADER
  41. "${PUBLIC_HEADERS}")
  42. target_include_directories(
  43. ${TARGET_NAME}
  44. PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
  45. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}>)
  46. set_target_properties(${TARGET_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
  47. set_target_properties(${TARGET_NAME} PROPERTIES VERSION ${PROJECT_VERSION})
  48. set_target_properties(${TARGET_NAME} PROPERTIES SOVERSION
  49. ${PROJECT_VERSION_MAJOR})
  50. if(UNIX)
  51. target_compile_options(
  52. ${TARGET_NAME}
  53. PRIVATE -fPIC
  54. -Wall
  55. -Wextra
  56. -pedantic)
  57. endif(UNIX)
  58. # install targets
  59. install(
  60. TARGETS ${TARGET_NAME}
  61. EXPORT ${TARGETS_EXPORT_NAME}
  62. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  63. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  64. PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME})
  65. # build directory package config
  66. export(
  67. TARGETS ${TARGET_NAME}
  68. APPEND
  69. FILE "${TARGETS_EXPORT_NAME}.cmake")
  70. # installed package config
  71. install(EXPORT ${TARGETS_EXPORT_NAME} DESTINATION "${CONFIG_INSTALL_DIR}")
  72. endforeach()
  73. # installed package config
  74. set(PROJECT_CONFIG_FILE
  75. "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake")
  76. set(PROJECT_VERSION_FILE
  77. "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake")
  78. configure_package_config_file(
  79. ${PROJECT_SOURCE_DIR}/cmake/config.cmake.in ${PROJECT_CONFIG_FILE}
  80. INSTALL_DESTINATION "${CONFIG_INSTALL_DIR}")
  81. # generate package version file
  82. write_basic_package_version_file(
  83. ${PROJECT_VERSION_FILE}
  84. VERSION ${PROJECT_VERSION}
  85. COMPATIBILITY SameMajorVersion)
  86. # install version and config file
  87. install(FILES ${PROJECT_VERSION_FILE} ${PROJECT_CONFIG_FILE}
  88. DESTINATION ${CONFIG_INSTALL_DIR})
  89. file(
  90. GLOB
  91. FIND_MODULES
  92. "${PROJECT_SOURCE_DIR}/cmake/Find*.cmake")
  93. message(DEBUG "Find modules: ${FIND_MODULES}")
  94. install(FILES ${FIND_MODULES} DESTINATION ${CONFIG_INSTALL_DIR})
  95. # make available in build directory for user package registry dependants
  96. file(COPY ${FIND_MODULES} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
  97. # add to CMake registry
  98. export(PACKAGE ${PROJECT_NAME})
  99. # generate pc-file
  100. configure_file(
  101. ${CMAKE_CURRENT_SOURCE_DIR}/cmake/pc.in
  102. ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
  103. @ONLY)
  104. # install pc-file
  105. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
  106. DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
  107. if(BUILD_TESTING)
  108. enable_testing()
  109. add_subdirectory(test)
  110. endif()
  111. option(BUILD_EXAMPLES "Build and install examples")
  112. if(BUILD_EXAMPLES)
  113. add_executable(iniexample ${CMAKE_CURRENT_SOURCE_DIR}/example/iniexample.c)
  114. add_executable(iniwrite ${CMAKE_CURRENT_SOURCE_DIR}/example/iniwrite.c)
  115. add_executable(parse ${CMAKE_CURRENT_SOURCE_DIR}/example/parse.c)
  116. foreach(TARGET_TYPE ${TARGET_TYPES})
  117. # if BUILD_STATIC_LIBS=ON shared takes precedence
  118. target_link_libraries(iniexample ${PROJECT_NAME}-${TARGET_TYPE})
  119. target_link_libraries(iniwrite ${PROJECT_NAME}-${TARGET_TYPE})
  120. target_link_libraries(parse ${PROJECT_NAME}-${TARGET_TYPE})
  121. endforeach()
  122. install(
  123. TARGETS iniexample
  124. iniwrite
  125. parse
  126. DESTINATION ${CMAKE_INSTALL_DOCDIR}/examples/)
  127. install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/example/twisted.ini
  128. DESTINATION ${CMAKE_INSTALL_DOCDIR}/examples/)
  129. endif()
  130. option(
  131. BUILD_DOCS
  132. "Build and install docs"
  133. ON)
  134. if(BUILD_DOCS)
  135. find_package(Doxygen REQUIRED)
  136. set(DOXYGEN_STRIP_FROM_PATH ${CMAKE_CURRENT_SOURCE_DIR})
  137. doxygen_add_docs(
  138. docs
  139. ${CMAKE_CURRENT_SOURCE_DIR}/doc/iniparser.txt
  140. ${CMAKE_CURRENT_SOURCE_DIR}/src/iniparser.h
  141. ALL
  142. WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/doc)
  143. install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html
  144. DESTINATION ${CMAKE_INSTALL_DOCDIR})
  145. endif()