# bgfx.cmake - bgfx building in cmake # Written in 2017 by Joshua Brookover # To the extent possible under law, the author(s) have dedicated all copyright # and related and neighboring rights to this software to the public domain # worldwide. This software is distributed without any warranty. # You should have received a copy of the CC0 Public Domain Dedication along with # this software. If not, see . cmake_minimum_required( VERSION 3.0 ) project(bgfx) set_property( GLOBAL PROPERTY USE_FOLDERS ON ) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # Makefile generators on apple need this flag to compile mixed objective/c++ if( APPLE AND NOT XCODE ) set( CMAKE_CXX_FLAGS "-ObjC++" ) endif() if (MSVC AND (MSVC_VERSION GREATER_EQUAL 1914)) add_compile_options("/Zc:__cplusplus") endif() option( BGFX_BUILD_TOOLS "Build bgfx tools." ON ) option( BGFX_BUILD_EXAMPLES "Build bgfx examples." OFF ) option( BGFX_INSTALL "Create installation target." ON ) option( BGFX_INSTALL_EXAMPLES "Install examples and their runtimes." OFF ) option( BGFX_CUSTOM_TARGETS "Include convenience custom targets." ON ) option( BGFX_AMALGAMATED "Amalgamated bgfx build for faster compilation" OFF ) option( BX_AMALGAMATED "Amalgamated bx build for faster compilation" OFF ) option( BGFX_CONFIG_MULTITHREADED "Build bgfx with multithreaded configuration" ON ) option( BGFX_CONFIG_RENDERER_WEBGPU "Enables the webgpu renderer" OFF ) option( BX_CONFIG_DEBUG "Log debug messages (default: on in debug)" OFF ) set( BGFX_OPENGL_VERSION "" CACHE STRING "Specify minimum opengl version" ) set( BGFX_OPENGLES_VERSION "" CACHE STRING "Specify minimum OpenGL ES version" ) set( BGFX_LIBRARY_TYPE "STATIC" CACHE STRING "Linking type for library" ) set_property( CACHE BGFX_LIBRARY_TYPE PROPERTY STRINGS STATIC SHARED ) if( BGFX_LIBRARY_TYPE MATCHES "SHARED" ) set(CMAKE_POSITION_INDEPENDENT_CODE ON) endif() if( NOT BX_DIR ) set( BX_DIR "${CMAKE_CURRENT_SOURCE_DIR}/bx" CACHE STRING "Location of bx." ) elseif( NOT IS_ABSOLUTE "${BX_DIR}") get_filename_component(BX_DIR "${BX_DIR}" REALPATH BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") endif() if( NOT BIMG_DIR ) set( BIMG_DIR "${CMAKE_CURRENT_SOURCE_DIR}/bimg" CACHE STRING "Location of bimg." ) elseif( NOT IS_ABSOLUTE "${BIMG_DIR}") get_filename_component(BIMG_DIR "${BIMG_DIR}" REALPATH BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") endif() if( NOT BGFX_DIR ) set( BGFX_DIR "${CMAKE_CURRENT_SOURCE_DIR}/bgfx" CACHE STRING "Location of bgfx." ) elseif( NOT IS_ABSOLUTE "${BGFX_DIR}") get_filename_component(BGFX_DIR "${BGFX_DIR}" REALPATH BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") endif() # sets project version from api ver / git rev include( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/version.cmake ) include( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/shared.cmake ) include( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/bx.cmake ) include( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/bimg.cmake ) include( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/bgfx.cmake ) if( BGFX_BUILD_TOOLS ) include( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/tools.cmake ) endif() if( BGFX_BUILD_TOOLS OR BGFX_BUILD_EXAMPLES ) include( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/examples.cmake ) endif() if( BGFX_INSTALL ) include(GNUInstallDirs) # Layout. This works for all platforms: # * /lib*/cmake/ # * /lib*/ # * /include/ set(config_install_dir "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated") # Configuration set(version_config "${generated_dir}/${PROJECT_NAME}ConfigVersion.cmake") set(project_config "${generated_dir}/${PROJECT_NAME}Config.cmake") set(TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets") set(namespace "${PROJECT_NAME}::") # Include module with fuction 'write_basic_package_version_file' include(CMakePackageConfigHelpers) # Configure 'ConfigVersion.cmake' # Use: # * PROJECT_VERSION if(${CMAKE_VERSION} VERSION_LESS "3.11.0") set(BGFX_COMPATIBILITY SameMajorVersion) else() set(BGFX_COMPATIBILITY SameMinorVersion) endif() write_basic_package_version_file( "${version_config}" VERSION ${PROJECT_VERSION} COMPATIBILITY ${BGFX_COMPATIBILITY} ) # Configure 'Config.cmake' # Use variables: # * TARGETS_EXPORT_NAME # * PROJECT_NAME configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Config.cmake.in" "${project_config}" INSTALL_DESTINATION "${config_install_dir}" ) install(FILES ${BGFX_DIR}/LICENSE DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/licences/${PROJECT_NAME}) install( TARGETS bgfx EXPORT "${TARGETS_EXPORT_NAME}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ) if( NOT BGFX_LIBRARY_TYPE MATCHES "SHARED" ) install( TARGETS bimg bx astc-codec astc edtaa3 etc1 etc2 iqa squish nvtt pvrtc tinyexr EXPORT "${TARGETS_EXPORT_NAME}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ) endif() if (BGFX_CONFIG_RENDERER_WEBGPU) install( TARGETS webgpu EXPORT "${TARGETS_EXPORT_NAME}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ) endif() # install headers (this should be done as a target probably... ^) install( DIRECTORY ${BX_DIR}/include/bx ${BX_DIR}/include/compat ${BX_DIR}/include/tinystl DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") install( DIRECTORY ${BIMG_DIR}/include/bimg DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") install( DIRECTORY ${BGFX_DIR}/include/bgfx DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") # header required for shader compilation install( FILES ${BGFX_DIR}/src/bgfx_shader.sh ${BGFX_DIR}/src/bgfx_compute.sh DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/bgfx" ) # install tools if( BGFX_BUILD_TOOLS ) install( TARGETS shaderc EXPORT "${TARGETS_EXPORT_NAME}" DESTINATION "${CMAKE_INSTALL_BINDIR}" ) install( TARGETS geometryc EXPORT "${TARGETS_EXPORT_NAME}" DESTINATION "${CMAKE_INSTALL_BINDIR}" ) install( TARGETS geometryv EXPORT "${TARGETS_EXPORT_NAME}" DESTINATION "${CMAKE_INSTALL_BINDIR}" ) install( TARGETS texturec EXPORT "${TARGETS_EXPORT_NAME}" DESTINATION "${CMAKE_INSTALL_BINDIR}" ) install( TARGETS texturev EXPORT "${TARGETS_EXPORT_NAME}" DESTINATION "${CMAKE_INSTALL_BINDIR}" ) endif() # install examples if( BGFX_BUILD_EXAMPLES AND BGFX_INSTALL_EXAMPLES ) install( DIRECTORY ${BGFX_DIR}/examples/runtime/ DESTINATION examples ) foreach( EXAMPLE ${BGFX_EXAMPLES} ) install( TARGETS example-${EXAMPLE} DESTINATION examples ) endforeach() endif() # Config # * /lib/cmake/bgfx/bgfxConfig.cmake # * /lib/cmake/bgfx/bgfxConfigVersion.cmake install( FILES "${project_config}" "${version_config}" DESTINATION "${config_install_dir}" ) # Config # * /lib/cmake/bgfx/bgfxTargets.cmake install( EXPORT "${TARGETS_EXPORT_NAME}" NAMESPACE "${namespace}" DESTINATION "${config_install_dir}" ) endif()