CMakeLists.txt 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. CMAKE_MINIMUM_REQUIRED( VERSION 3.8 )
  2. PROJECT( OpenDDL-Parser )
  3. # read version number from cpp file of the form: static const char *Version = "0.4.0";
  4. file ( READ code/OpenDDLParser.cpp _ver )
  5. string( REGEX MATCH "static const char [*]Version[ ]*=[ ]*\"[^\"]*\"" _ver_line "${_ver}" )
  6. string( REGEX MATCH "[0-9]+\.[0-9]+\.[0-9]+" openddlparser_VERSION "${_ver_line}" )
  7. SET ( PROJECT_VERSION "${openddlparser_VERSION}" )
  8. if ( "${PROJECT_VERSION}" STREQUAL "" )
  9. message( FATAL_ERROR "Cannot find 'static const char *Version' in 'code/OpenDDLParser.cpp'" )
  10. endif()
  11. message(STATUS "openddlparser_VERSION: ${openddlparser_VERSION}")
  12. option( DDL_DEBUG_OUTPUT "Set to ON to use output debug texts" OFF )
  13. option( DDL_STATIC_LIBRARY "Deprecated, use BUILD_SHARED_LIBS instead." ON )
  14. # for backwards compatibility use DDL_STATIC_LIBRARY as initial value for cmake variable BUILD_SHARED_LIBS
  15. # https://cmake.org/cmake/help/latest/variable/BUILD_SHARED_LIBS.html
  16. if ( DDL_STATIC_LIBRARY )
  17. message("Building shared lib.")
  18. set ( build_shared_libs_default OFF )
  19. else()
  20. message("Building static lib.")
  21. set ( build_shared_libs_default ON )
  22. endif()
  23. option( DDL_BUILD_SHARED_LIBS "Set to ON to build shared libary of OpenDDL Parser." ${build_shared_libs_default} )
  24. option( COVERALLS "Generate coveralls data" OFF )
  25. option( DDL_DOCUMENTATION "Set to ON to opt in generating API documentation with Doxygen" OFF )
  26. option( DDL_BUILD_TESTS "Set to OFF to not build tests by default" ON )
  27. option( DDL_BUILD_PARSER_DEMO "Set to OFF to opt out building parser demo" ON )
  28. if (MSVC)
  29. add_definitions(
  30. -D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING
  31. -DGTEST_HAS_TR1_TUPLE=0
  32. -D_CRT_SECURE_NO_WARNINGS
  33. )
  34. endif()
  35. add_definitions( -D_VARIADIC_MAX=10 )
  36. add_definitions( -DGTEST_HAS_PTHREAD=0 )
  37. if ( DDL_DEBUG_OUTPUT )
  38. message("Enable debug output.")
  39. add_definitions( -DDDL_DEBUG_HEADER_NAME)
  40. endif()
  41. list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
  42. SET( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib )
  43. SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib )
  44. SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin )
  45. if (MSVC)
  46. set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc" ) # Force to always compile with W4
  47. if( CMAKE_CXX_FLAGS MATCHES "/W[0-4]" )
  48. string( REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" )
  49. else()
  50. set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4" )
  51. endif()
  52. elseif( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX )
  53. # Update if necessary
  54. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic ${OPENDDL_CXXFLAGS}")
  55. elseif ( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
  56. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic ${OPENDDL_CXXFLAGS} -Wwrite-strings")
  57. endif()
  58. if (COVERALLS)
  59. include(Coveralls)
  60. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
  61. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
  62. message("Enable coveralls.")
  63. endif()
  64. # Include the doc component.
  65. if(DDL_DOCUMENTATION)
  66. message("Generate doxygen documentation.")
  67. find_package(Doxygen REQUIRED)
  68. CONFIGURE_FILE( doc/openddlparser_doc.in doc/doxygenfile @ONLY )
  69. add_custom_target(doc ALL
  70. ${DOXYGEN_EXECUTABLE} doc/doxygenfile
  71. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  72. COMMENT "Generating API documentation with Doxygen" VERBATIM )
  73. endif()
  74. SET ( openddlparser_headers
  75. include/openddlparser/OpenDDLCommon.h
  76. include/openddlparser/OpenDDLExport.h
  77. include/openddlparser/OpenDDLParser.h
  78. include/openddlparser/OpenDDLParserUtils.h
  79. include/openddlparser/OpenDDLStream.h
  80. include/openddlparser/DDLNode.h
  81. include/openddlparser/Value.h
  82. include/openddlparser/TPoolAllocator.h
  83. )
  84. SET ( openddlparser_src
  85. code/OpenDDLCommon.cpp
  86. code/OpenDDLExport.cpp
  87. code/OpenDDLParser.cpp
  88. code/OpenDDLStream.cpp
  89. code/DDLNode.cpp
  90. code/Value.cpp
  91. )
  92. SOURCE_GROUP( code FILES ${openddlparser_src} )
  93. ADD_LIBRARY( openddlparser ${openddlparser_src})
  94. target_include_directories(openddlparser PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>)
  95. target_compile_features(openddlparser PUBLIC cxx_std_11)
  96. if(DDL_BUILD_SHARED_LIBS)
  97. set_target_properties(openddlparser PROPERTIES
  98. CXX_VISIBILITY_PRESET hidden
  99. VISIBILITY_INLINES_HIDDEN TRUE
  100. )
  101. else()
  102. target_compile_definitions(openddlparser PUBLIC OPENDDL_STATIC_LIBARY)
  103. endif()
  104. set_target_properties( openddlparser PROPERTIES PUBLIC_HEADER "${openddlparser_headers}")
  105. if (DDL_BUILD_TESTS)
  106. find_package(Threads REQUIRED)
  107. SET ( GTEST_PATH contrib/gtest-1.7.0 )
  108. SET ( gtest_src
  109. ${GTEST_PATH}/src/gtest-death-test.cc
  110. ${GTEST_PATH}/src/gtest-filepath.cc
  111. ${GTEST_PATH}/src/gtest-port.cc
  112. ${GTEST_PATH}/src/gtest-printers.cc
  113. ${GTEST_PATH}/src/gtest-test-part.cc
  114. ${GTEST_PATH}/src/gtest-typed-test.cc
  115. ${GTEST_PATH}/src/gtest.cc
  116. )
  117. SET( openddlparser_unittest_src
  118. test/DDLNodeTest.cpp
  119. test/OpenDDLCommonTest.cpp
  120. test/OpenDDLExportTest.cpp
  121. test/OpenDDLParserTest.cpp
  122. test/OpenDDLParserUtilsTest.cpp
  123. test/OpenDDLStreamTest.cpp
  124. test/OpenDDLIntegrationTest.cpp
  125. test/ValueTest.cpp
  126. test/OpenDDLDefectsTest.cpp
  127. test/OssFuzzTest.cpp
  128. test/main.cpp
  129. )
  130. SOURCE_GROUP( code FILES ${openddlparser_unittest_src} )
  131. SOURCE_GROUP( gtest FILES ${gtest_src} )
  132. ADD_EXECUTABLE( openddlparser_unittest
  133. ${gtest_src}
  134. ${openddlparser_unittest_src}
  135. )
  136. target_include_directories(openddlparser_unittest
  137. PRIVATE
  138. ${GTEST_PATH}
  139. ${GTEST_PATH}/include
  140. )
  141. target_link_libraries(openddlparser_unittest openddlparser Threads::Threads)
  142. target_compile_features(openddlparser_unittest PRIVATE cxx_std_11)
  143. target_compile_definitions(openddlparser_unittest PRIVATE OPENDDL_TEST_DATA="${PROJECT_SOURCE_DIR}/test/TestData")
  144. endif ()
  145. if (DDL_BUILD_PARSER_DEMO)
  146. SET( openddlparser_demo_src
  147. demo/main.cpp
  148. )
  149. if (COVERALLS)
  150. set(COVERAGE_SRCS ${gtest_src} ${openddlparser_unittest_src} )
  151. # Create the coveralls target.
  152. coveralls_setup(
  153. "${COVERAGE_SRCS}" # The source files.
  154. ON # If we should upload.
  155. "${PROJECT_SOURCE_DIR}/cmake/") # (Optional) Alternate project cmake module path.
  156. endif()
  157. ADD_EXECUTABLE( openddlparser_demo
  158. ${openddlparser_demo_src}
  159. )
  160. target_link_libraries( openddlparser_demo openddlparser )
  161. target_compile_features(openddlparser_demo PRIVATE cxx_std_11)
  162. endif ()
  163. include(GNUInstallDirs)
  164. include(CMakePackageConfigHelpers)
  165. install(TARGETS openddlparser
  166. EXPORT openddlparser-targets
  167. RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
  168. LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
  169. ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
  170. INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
  171. PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/openddlparser")
  172. export(EXPORT openddlparser-targets
  173. FILE openddlparser-config.cmake
  174. NAMESPACE openddlparser::)
  175. install(EXPORT openddlparser-targets
  176. FILE openddlparser-config.cmake
  177. NAMESPACE openddlparser::
  178. DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/openddlparser")
  179. write_basic_package_version_file(
  180. "${CMAKE_BINARY_DIR}/openddlparser-config-version.cmake"
  181. COMPATIBILITY SameMajorVersion)
  182. install(
  183. FILES "${CMAKE_BINARY_DIR}/openddlparser-config-version.cmake"
  184. DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/openddlparser")