include(GNUInstallDirs) set(BOX2D_SOURCE_FILES aabb.c aabb.h arena_allocator.c arena_allocator.h array.c array.h atomic.h bitset.c bitset.h body.c body.h broad_phase.c broad_phase.h constants.h constraint_graph.c constraint_graph.h contact.c contact.h contact_solver.c contact_solver.h core.c core.h ctz.h distance.c distance_joint.c dynamic_tree.c geometry.c hull.c id_pool.c id_pool.h island.c island.h joint.c joint.h manifold.c math_functions.c motor_joint.c mover.c physics_world.c physics_world.h prismatic_joint.c revolute_joint.c sensor.c sensor.h shape.c shape.h solver.c solver.h solver_set.c solver_set.h table.c table.h timer.c types.c weld_joint.c wheel_joint.c ) set(BOX2D_API_FILES ../include/box2d/base.h ../include/box2d/box2d.h ../include/box2d/collision.h ../include/box2d/id.h ../include/box2d/math_functions.h ../include/box2d/types.h ) # Hide internal functions # https://gcc.gnu.org/wiki/Visibility set(CMAKE_C_VISIBILITY_PRESET hidden) set(CMAKE_VISIBILITY_INLINES_HIDDEN 1) add_library(box2d ${BOX2D_SOURCE_FILES} ${BOX2D_API_FILES}) target_include_directories(box2d PUBLIC $ $ $ PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ) set(CMAKE_DEBUG_POSTFIX "d") # Box2D uses C17 for _Static_assert and anonymous unions set_target_properties(box2d PROPERTIES C_STANDARD 17 C_STANDARD_REQUIRED YES C_EXTENSIONS YES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR} DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX} ) if (BOX2D_COMPILE_WARNING_AS_ERROR) set_target_properties(box2d PROPERTIES COMPILE_WARNING_AS_ERROR ON) endif() if (BOX2D_PROFILE) target_compile_definitions(box2d PRIVATE BOX2D_PROFILE) FetchContent_Declare( tracy GIT_REPOSITORY https://github.com/wolfpld/tracy.git GIT_TAG v0.11.1 GIT_SHALLOW TRUE GIT_PROGRESS TRUE ) FetchContent_MakeAvailable(tracy) target_link_libraries(box2d PUBLIC TracyClient) endif() if (BOX2D_VALIDATE) message(STATUS "Box2D validation ON") target_compile_definitions(box2d PRIVATE BOX2D_VALIDATE) endif() if (BOX2D_DISABLE_SIMD) message(STATUS "Box2D SIMD disabled") target_compile_definitions(box2d PRIVATE BOX2D_DISABLE_SIMD) endif() if (MSVC) message(STATUS "Box2D on MSVC") if (BUILD_SHARED_LIBS) # this is needed by DLL users to import Box2D symbols target_compile_definitions(box2d INTERFACE BOX2D_DLL) endif() # Visual Studio won't load the natvis unless it is in the project target_sources(box2d PRIVATE box2d.natvis) # Enable asserts in release with debug info target_compile_definitions(box2d PUBLIC "$<$:B2_ENABLE_ASSERT>") # Warnings # 4710 - warn about inline functions that are not inlined target_compile_options(box2d PRIVATE /Wall /wd4820 /wd5045 /wd4061 /wd4711 /wd4710) if (BOX2D_AVX2) message(STATUS "Box2D using AVX2") target_compile_definitions(box2d PRIVATE BOX2D_AVX2) target_compile_options(box2d PRIVATE /arch:AVX2) endif() if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") target_compile_options(box2d PRIVATE -Wmissing-prototypes) endif() elseif (MINGW) message(STATUS "Box2D on MinGW") if (BOX2D_AVX2) message(STATUS "Box2D using AVX2") target_compile_definitions(box2d PRIVATE BOX2D_AVX2) target_compile_options(box2d PRIVATE -mavx2) else() endif() elseif (APPLE) message(STATUS "Box2D on Apple") target_compile_options(box2d PRIVATE -Wmissing-prototypes -Wall -Wextra -pedantic) elseif (EMSCRIPTEN) message(STATUS "Box2D on Emscripten") if (NOT BOX2D_DISABLE_SIMD) target_compile_options(box2d PRIVATE -msimd128 -msse2) endif() elseif (UNIX) message(STATUS "Box2D using Unix") target_compile_options(box2d PRIVATE -Wmissing-prototypes -Wall -Wextra -pedantic -Wno-unused-value) if ("${CMAKE_HOST_SYSTEM_PROCESSOR}" STREQUAL "aarch64") # raspberry pi # -mfpu=neon # target_compile_options(box2d PRIVATE) else() if (BOX2D_AVX2) message(STATUS "Box2D using AVX2") target_compile_definitions(box2d PRIVATE BOX2D_AVX2) target_compile_options(box2d PRIVATE -mavx2) else() endif() endif() endif() source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}" PREFIX "src" FILES ${BOX2D_SOURCE_FILES}) source_group(TREE "${CMAKE_CURRENT_SOURCE_DIR}/../include" PREFIX "include" FILES ${BOX2D_API_FILES}) add_library(box2d::box2d ALIAS box2d) install( TARGETS box2d EXPORT box2dConfig LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) install( EXPORT box2dConfig NAMESPACE box2d:: DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/box2d" ) install( FILES ${BOX2D_API_FILES} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/box2d ) include(CMakePackageConfigHelpers) write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/box2dConfigVersion.cmake" VERSION ${BOX2D_VERSION} COMPATIBILITY SameMajorVersion ) install( FILES "${CMAKE_CURRENT_BINARY_DIR}/box2dConfigVersion.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/box2d" )