CMakeLists.txt 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. cmake_minimum_required(VERSION 2.8.12)
  2. project(libogg)
  3. # Required modules
  4. include(GNUInstallDirs)
  5. include(CheckIncludeFiles)
  6. include(CMakePackageConfigHelpers)
  7. include(CTest)
  8. # Build options
  9. option(BUILD_SHARED_LIBS "Build shared library" OFF)
  10. if(APPLE)
  11. option(BUILD_FRAMEWORK "Build Framework bundle for OSX" OFF)
  12. endif()
  13. # Install options
  14. option(INSTALL_DOCS "Install documentation" ON)
  15. option(INSTALL_PKG_CONFIG_MODULE "Install ogg.pc file" ON)
  16. option(INSTALL_CMAKE_PACKAGE_MODULE "Install CMake package configuration module" ON)
  17. # Extract project version from configure.ac
  18. file(READ configure.ac CONFIGURE_AC_CONTENTS)
  19. string(REGEX MATCH "AC_INIT\\(\\[libogg\\],\\[([0-9]*).([0-9]*).([0-9]*)" DUMMY ${CONFIGURE_AC_CONTENTS})
  20. set(PROJECT_VERSION_MAJOR ${CMAKE_MATCH_1})
  21. set(PROJECT_VERSION_MINOR ${CMAKE_MATCH_2})
  22. set(PROJECT_VERSION_PATCH ${CMAKE_MATCH_3})
  23. set(PROJECT_VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH})
  24. # Extract library version from configure.ac
  25. string(REGEX MATCH "LIB_CURRENT=([0-9]*)" DUMMY ${CONFIGURE_AC_CONTENTS})
  26. set(LIB_CURRENT ${CMAKE_MATCH_1})
  27. string(REGEX MATCH "LIB_AGE=([0-9]*)" DUMMY ${CONFIGURE_AC_CONTENTS})
  28. set(LIB_AGE ${CMAKE_MATCH_1})
  29. string(REGEX MATCH "LIB_REVISION=([0-9]*)" DUMMY ${CONFIGURE_AC_CONTENTS})
  30. set(LIB_REVISION ${CMAKE_MATCH_1})
  31. math(EXPR LIB_SOVERSION "${LIB_CURRENT} - ${LIB_AGE}")
  32. set(LIB_VERSION "${LIB_SOVERSION}.${LIB_AGE}.${LIB_REVISION}")
  33. # Helper function to configure pkg-config files
  34. function(configure_pkg_config_file pkg_config_file_in)
  35. set(prefix ${CMAKE_INSTALL_PREFIX})
  36. set(exec_prefix ${CMAKE_INSTALL_FULL_BINDIR})
  37. set(libdir ${CMAKE_INSTALL_FULL_LIBDIR})
  38. set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR})
  39. set(VERSION ${PROJECT_VERSION})
  40. string(REPLACE ".in" "" pkg_config_file ${pkg_config_file_in})
  41. configure_file(${pkg_config_file_in} ${pkg_config_file} @ONLY)
  42. endfunction()
  43. message(STATUS "Configuring ${PROJECT_NAME} ${PROJECT_VERSION}")
  44. # Configure config_type.h
  45. check_include_files(inttypes.h INCLUDE_INTTYPES_H)
  46. check_include_files(stdint.h INCLUDE_STDINT_H)
  47. check_include_files(sys/types.h INCLUDE_SYS_TYPES_H)
  48. list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
  49. set(SIZE16 int16_t)
  50. set(USIZE16 uint16_t)
  51. set(SIZE32 int32_t)
  52. set(USIZE32 uint32_t)
  53. set(SIZE64 int64_t)
  54. set(USIZE64 uint64_t)
  55. include(CheckSizes)
  56. configure_file(include/ogg/config_types.h.in include/ogg/config_types.h @ONLY)
  57. set(OGG_HEADERS
  58. ${CMAKE_CURRENT_BINARY_DIR}/include/ogg/config_types.h
  59. include/ogg/ogg.h
  60. include/ogg/os_types.h
  61. )
  62. set(OGG_SOURCES
  63. src/bitwise.c
  64. src/framing.c
  65. src/crctable.h
  66. )
  67. if(WIN32 AND BUILD_SHARED_LIBS)
  68. list(APPEND OGG_SOURCES win32/ogg.def)
  69. endif()
  70. if(BUILD_FRAMEWORK)
  71. set(BUILD_SHARED_LIBS TRUE)
  72. endif()
  73. add_library(ogg ${OGG_HEADERS} ${OGG_SOURCES})
  74. add_library(Ogg::ogg ALIAS ogg)
  75. target_include_directories(ogg PUBLIC
  76. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  77. $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
  78. $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
  79. )
  80. set_target_properties(
  81. ogg PROPERTIES
  82. SOVERSION ${LIB_SOVERSION}
  83. VERSION ${LIB_VERSION}
  84. PUBLIC_HEADER "${OGG_HEADERS}"
  85. )
  86. if(BUILD_FRAMEWORK)
  87. set_target_properties(ogg PROPERTIES
  88. FRAMEWORK TRUE
  89. FRAMEWORK_VERSION ${PROJECT_VERSION}
  90. MACOSX_FRAMEWORK_IDENTIFIER org.xiph.ogg
  91. MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${PROJECT_VERSION}
  92. MACOSX_FRAMEWORK_BUNDLE_VERSION ${PROJECT_VERSION}
  93. XCODE_ATTRIBUTE_INSTALL_PATH "@rpath"
  94. OUTPUT_NAME Ogg
  95. )
  96. endif()
  97. configure_pkg_config_file(ogg.pc.in)
  98. install(TARGETS ogg
  99. EXPORT OggTargets
  100. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  101. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  102. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  103. FRAMEWORK DESTINATION ${CMAKE_INSTALL_PREFIX}
  104. PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ogg
  105. )
  106. export(EXPORT OggTargets NAMESPACE Ogg:: FILE OggTargets.cmake)
  107. if(INSTALL_CMAKE_PACKAGE_MODULE)
  108. set(CMAKE_INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/Ogg)
  109. install(EXPORT OggTargets
  110. DESTINATION ${CMAKE_INSTALL_CONFIGDIR}
  111. NAMESPACE Ogg::
  112. )
  113. include(CMakePackageConfigHelpers)
  114. configure_package_config_file(${PROJECT_SOURCE_DIR}/cmake/OggConfig.cmake.in ${PROJECT_BINARY_DIR}/OggConfig.cmake
  115. INSTALL_DESTINATION ${CMAKE_INSTALL_CONFIGDIR}
  116. PATH_VARS CMAKE_INSTALL_FULL_INCLUDEDIR
  117. )
  118. write_basic_package_version_file(${PROJECT_BINARY_DIR}/OggConfigVersion.cmake
  119. VERSION ${PROJECT_VERSION}
  120. COMPATIBILITY SameMajorVersion
  121. )
  122. install(FILES ${PROJECT_BINARY_DIR}/OggConfig.cmake ${PROJECT_BINARY_DIR}/OggConfigVersion.cmake
  123. DESTINATION ${CMAKE_INSTALL_CONFIGDIR}
  124. )
  125. endif()
  126. if(INSTALL_PKG_CONFIG_MODULE)
  127. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ogg.pc
  128. DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
  129. )
  130. endif()
  131. if(INSTALL_DOCS)
  132. set(OGG_DOCS
  133. doc/framing.html
  134. doc/index.html
  135. doc/oggstream.html
  136. doc/ogg-multiplex.html
  137. doc/fish_xiph_org.png
  138. doc/multiplex1.png
  139. doc/packets.png
  140. doc/pages.png
  141. doc/stream.png
  142. doc/vorbisword2.png
  143. doc/white-ogg.png
  144. doc/white-xifish.png
  145. doc/rfc3533.txt
  146. doc/rfc5334.txt
  147. doc/skeleton.html
  148. )
  149. install(FILES ${OGG_DOCS} DESTINATION ${CMAKE_INSTALL_DOCDIR}/html)
  150. install(DIRECTORY doc/libogg DESTINATION ${CMAKE_INSTALL_DOCDIR}/html)
  151. endif()
  152. if(BUILD_TESTING)
  153. add_executable(test_bitwise src/bitwise.c ${OGG_HEADERS})
  154. target_compile_definitions(test_bitwise PRIVATE _V_SELFTEST)
  155. target_include_directories(test_bitwise PRIVATE
  156. include
  157. ${CMAKE_CURRENT_BINARY_DIR}/include
  158. )
  159. add_test(NAME test_bitwise COMMAND $<TARGET_FILE:test_bitwise>)
  160. add_executable(test_framing src/framing.c ${OGG_HEADERS})
  161. target_compile_definitions(test_framing PRIVATE _V_SELFTEST)
  162. target_include_directories(test_framing PRIVATE
  163. include
  164. ${CMAKE_CURRENT_BINARY_DIR}/include
  165. )
  166. add_test(NAME test_framing COMMAND $<TARGET_FILE:test_framing>)
  167. endif()