CMakeLists.txt 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. cmake_minimum_required(VERSION 3.8.2)
  2. project(cglm VERSION 0.8.3 LANGUAGES C)
  3. set(CMAKE_C_STANDARD 11)
  4. set(CMAKE_C_STANDARD_REQUIRED YES)
  5. set(DEFAULT_BUILD_TYPE "Release")
  6. set(CGLM_BUILD)
  7. option(CGLM_SHARED "Shared build" ON)
  8. option(CGLM_STATIC "Static build" OFF)
  9. option(CGLM_USE_C99 "" OFF)
  10. option(CGLM_USE_TEST "Enable Tests" OFF)
  11. if(NOT CGLM_STATIC AND CGLM_SHARED)
  12. set(CGLM_BUILD SHARED)
  13. else(CGLM_STATIC)
  14. set(CGLM_BUILD STATIC)
  15. endif()
  16. if(CGLM_USE_C99)
  17. set(CMAKE_C_STANDARD 99)
  18. endif()
  19. if(MSVC)
  20. add_definitions(-DNDEBUG -D_WINDOWS -D_USRDLL)
  21. add_compile_options(/W3 /Ox /Gy /Oi /TC)
  22. # Ref: https://skia.googlesource.com/third_party/sdl/+/refs/heads/master/CMakeLists.txt#225
  23. # Make sure /RTC1 is disabled, otherwise it will use functions from the CRT
  24. foreach(flag_var
  25. CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
  26. CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
  27. string(REGEX REPLACE "/RTC(su|[1su])" "" ${flag_var} "${${flag_var}}")
  28. endforeach(flag_var)
  29. else()
  30. add_compile_options(-Wall -Werror -O3)
  31. endif()
  32. if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  33. message(STATUS "Setting build type to '${DEFAULT_BUILD_TYPE}' as none was specified.")
  34. set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the type of build." FORCE)
  35. # Set the possible values of build type for cmake-gui
  36. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo")
  37. endif()
  38. include(GNUInstallDirs)
  39. set(CPACK_PROJECT_NAME ${PROJECT_NAME})
  40. set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
  41. include(CPack)
  42. # Target Start
  43. add_library(${PROJECT_NAME}
  44. ${CGLM_BUILD}
  45. src/euler.c
  46. src/affine.c
  47. src/io.c
  48. src/quat.c
  49. src/cam.c
  50. src/vec2.c
  51. src/vec3.c
  52. src/vec4.c
  53. src/mat2.c
  54. src/mat3.c
  55. src/mat4.c
  56. src/plane.c
  57. src/frustum.c
  58. src/box.c
  59. src/project.c
  60. src/sphere.c
  61. src/ease.c
  62. src/curve.c
  63. src/bezier.c
  64. src/ray.c
  65. src/affine2d.c
  66. )
  67. if(CGLM_SHARED)
  68. add_definitions(-DCGLM_EXPORTS)
  69. else()
  70. target_compile_definitions(${PROJECT_NAME} PUBLIC -DCGLM_STATIC)
  71. endif()
  72. set_target_properties(${PROJECT_NAME} PROPERTIES
  73. VERSION ${PROJECT_VERSION}
  74. SOVERSION ${PROJECT_VERSION_MAJOR})
  75. target_include_directories(${PROJECT_NAME}
  76. PUBLIC
  77. $<INSTALL_INTERFACE:include>
  78. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  79. PRIVATE
  80. ${CMAKE_CURRENT_SOURCE_DIR}/src
  81. )
  82. # Target for header-only usage
  83. add_library(${PROJECT_NAME}_headers INTERFACE)
  84. target_include_directories(${PROJECT_NAME}_headers INTERFACE
  85. ${CMAKE_CURRENT_SOURCE_DIR}/include)
  86. # Test Configuration
  87. if(CGLM_USE_TEST)
  88. include(CTest)
  89. enable_testing()
  90. add_subdirectory(test)
  91. endif()
  92. # Install
  93. install(TARGETS ${PROJECT_NAME}
  94. EXPORT ${PROJECT_NAME}
  95. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  96. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  97. RUNTIME DESTINATION ${CMAKE_INSTALL_LIBDIR})
  98. install(DIRECTORY include/${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
  99. PATTERN ".*" EXCLUDE)
  100. # Config
  101. export(TARGETS ${PROJECT_NAME}
  102. NAMESPACE ${PROJECT_NAME}::
  103. FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
  104. )
  105. install(EXPORT ${PROJECT_NAME}
  106. FILE "${PROJECT_NAME}Config.cmake"
  107. NAMESPACE ${PROJECT_NAME}::
  108. DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
  109. set(PACKAGE_NAME ${PROJECT_NAME})
  110. set(prefix ${CMAKE_INSTALL_PREFIX})
  111. set(exec_prefix ${CMAKE_INSTALL_PREFIX})
  112. set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
  113. set(libdir "\${prefix}/${CMAKE_INSTALL_LIBDIR}")
  114. configure_file(${CMAKE_CURRENT_LIST_DIR}/cglm.pc.in ${CMAKE_BINARY_DIR}/cglm.pc @ONLY)
  115. install(FILES ${CMAKE_BINARY_DIR}/cglm.pc
  116. DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)