commit b030cbac0c27725dedff97aeb1ba49d72e0c7907 Author: Joshua Brookover Date: Mon Sep 5 18:51:13 2016 -0500 Initial commit, only tested in Visual Studio 2015. Supports building bgfx, tools, & examples. Detects shader modifications and automatically recompiles them for DirectX11. diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..dbe8d9e --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,11 @@ +# Copyright (c) 2016 Joshua Brookover + +cmake_minimum_required( VERSION 3.0 ) +project( bgfx ) + +set_property( GLOBAL PROPERTY USE_FOLDERS ON ) + +include( cmake/bx.cmake ) +include( cmake/bgfx.cmake ) +include( cmake/tools.cmake ) +include( cmake/examples.cmake ) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..34e6060 --- /dev/null +++ b/LICENSE @@ -0,0 +1,5 @@ +Copyright (C) 2016 Joshua Brookover + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/cmake/3rdparty/fcpp.cmake b/cmake/3rdparty/fcpp.cmake new file mode 100644 index 0000000..3092933 --- /dev/null +++ b/cmake/3rdparty/fcpp.cmake @@ -0,0 +1,9 @@ +# Copyright (c) 2016 Joshua Brookover + +file( GLOB FCPP_SOURCES ${BGFX_DIR}/3rdparty/fcpp/*.c ${BGFX_DIR}/3rdparty/fcpp/*.h ) + +add_library( fcpp STATIC ${FCPP_SOURCES} ) +target_include_directories( fcpp PUBLIC ${BGFX_DIR}/3rdparty/fcpp ) +set_target_properties( fcpp PROPERTIES COMPILE_FLAGS "/W0" ) +set_target_properties( fcpp PROPERTIES FOLDER "3rdparty" ) +set_source_files_properties( ${BGFX_DIR}/3rdparty/fcpp/usecpp.c PROPERTIES HEADER_FILE_ONLY ON ) diff --git a/cmake/3rdparty/glsl-optimizer.cmake b/cmake/3rdparty/glsl-optimizer.cmake new file mode 100644 index 0000000..d79136c --- /dev/null +++ b/cmake/3rdparty/glsl-optimizer.cmake @@ -0,0 +1,32 @@ +# Copyright (c) 2016 Joshua Brookover + +set( GLSL-OPTIMIZER_INCLUDES + ${BGFX_DIR}/3rdparty/glsl-optimizer/include + ${BGFX_DIR}/3rdparty/glsl-optimizer/src/mesa + ${BGFX_DIR}/3rdparty/glsl-optimizer/src/mapi + ${BGFX_DIR}/3rdparty/glsl-optimizer/src/glsl + ${BGFX_DIR}/3rdparty/glsl-optimizer/src +) + +# glcpp +file( GLOB GLCPP_SOURCES ${BGFX_DIR}/3rdparty/glsl-optimizer/src/glsl/glcpp/*.c ${BGFX_DIR}/3rdparty/glsl-optimizer/src/util/*.c ) +add_library( glcpp ${GLCPP_SOURCES} ) +target_include_directories( glcpp PUBLIC ${GLSL-OPTIMIZER_INCLUDES} ) +set_target_properties( glcpp PROPERTIES COMPILE_FLAGS "/W0" ) +set_target_properties( glcpp PROPERTIES FOLDER "3rdparty" ) + +# mesa +file( GLOB MESA_SOURCES ${BGFX_DIR}/3rdparty/glsl-optimizer/src/mesa/program/*.c ${BGFX_DIR}/3rdparty/glsl-optimizer/src/mesa/main/*.c ) +add_library( mesa ${MESA_SOURCES} ) +target_include_directories( mesa PUBLIC ${GLSL-OPTIMIZER_INCLUDES} ) +set_target_properties( mesa PROPERTIES COMPILE_FLAGS "/W0" ) +set_target_properties( mesa PROPERTIES FOLDER "3rdparty" ) + +# glsl_optimizer +file( GLOB GLSL-OPTIMIZER_SOURCES ${BGFX_DIR}/3rdparty/glsl-optimizer/src/glsl/*.cpp ${BGFX_DIR}/3rdparty/glsl-optimizer/src/glsl/*.c ) +file( GLOB GLSL-OPTIMIZER_SOURCES_REMOVE ${BGFX_DIR}/3rdparty/glsl-optimizer/src/glsl/main.cpp ${BGFX_DIR}/3rdparty/glsl-optimizer/src/glsl/builtin_stubs.cpp ) +list( REMOVE_ITEM GLSL-OPTIMIZER_SOURCES ${GLSL-OPTIMIZER_SOURCES_REMOVE} ) +add_library( glsl-optimizer ${GLSL-OPTIMIZER_SOURCES} ) +target_link_libraries( glsl-optimizer glcpp mesa ) +set_target_properties( glsl-optimizer PROPERTIES COMPILE_FLAGS "/W0" ) +set_target_properties( glsl-optimizer PROPERTIES FOLDER "3rdparty" ) diff --git a/cmake/3rdparty/ib-compress.cmake b/cmake/3rdparty/ib-compress.cmake new file mode 100644 index 0000000..6f70dca --- /dev/null +++ b/cmake/3rdparty/ib-compress.cmake @@ -0,0 +1,7 @@ +# Copyright (c) 2016 Joshua Brookover + +file( GLOB IB_COMPRESS_SOURCES ${BGFX_DIR}/3rdparty/ib-compress/*.cpp ${BGFX_DIR}/3rdparty/ib-compress/*.h ) + +add_library( ib-compress STATIC ${IB_COMPRESS_SOURCES} ) +target_include_directories( ib-compress PUBLIC ${BGFX_DIR}/3rdparty ) +set_target_properties( ib-compress PROPERTIES FOLDER "3rdparty" ) diff --git a/cmake/3rdparty/ocornut-imgui.cmake b/cmake/3rdparty/ocornut-imgui.cmake new file mode 100644 index 0000000..69cc153 --- /dev/null +++ b/cmake/3rdparty/ocornut-imgui.cmake @@ -0,0 +1,9 @@ +# Copyright (c) 2016 Joshua Brookover + +file( GLOB OCORNUT_IMGUI_SOURCES ${BGFX_DIR}/3rdparty/ocornut-imgui/*.cpp ${BGFX_DIR}/3rdparty/ocornut-imgui/*.h ${BGFX_DIR}/3rdparty/ocornut-imgui/*.inl ) + +add_library( ocornut-imgui STATIC ${OCORNUT_IMGUI_SOURCES} ) +target_compile_definitions( ocornut-imgui PRIVATE "-D_CRT_SECURE_NO_WARNINGS" "-D__STDC_FORMAT_MACROS" ) +target_include_directories( ocornut-imgui PUBLIC ${BGFX_DIR}/3rdparty ) +target_link_libraries( ocornut-imgui PUBLIC bx ) +set_target_properties( ocornut-imgui PROPERTIES FOLDER "3rdparty" ) diff --git a/cmake/bgfx.cmake b/cmake/bgfx.cmake new file mode 100644 index 0000000..6a719ad --- /dev/null +++ b/cmake/bgfx.cmake @@ -0,0 +1,27 @@ +# Copyright (c) 2016 Joshua Brookover + +set( BGFX_DIR "${CMAKE_CURRENT_SOURCE_DIR}/bgfx" ) + +file( GLOB BGFX_SOURCES ${BGFX_DIR}/src/*.cpp ${BGFX_DIR}/src/*.mm ${BGFX_DIR}/src/*.h ) + +add_library( bgfx STATIC ${BGFX_SOURCES} ) +if( MSVC ) + target_compile_definitions( bgfx PRIVATE "-D_CRT_SECURE_NO_WARNINGS" ) +endif() +target_include_directories( bgfx PRIVATE ${BGFX_DIR}/3rdparty ${BGFX_DIR}/3rdparty/dxsdk/include ${BGFX_DIR}/3rdparty/khronos ) +target_include_directories( bgfx PUBLIC ${BGFX_DIR}/include ) +target_link_libraries( bgfx PUBLIC bx ) +if( MSVC ) + target_link_libraries( bgfx PUBLIC psapi ) +endif() +set_source_files_properties( ${BGFX_DIR}/src/amalgamated.cpp PROPERTIES HEADER_FILE_ONLY ON ) +set_source_files_properties( ${BGFX_DIR}/src/amalgamated.mm PROPERTIES HEADER_FILE_ONLY ON ) +set_source_files_properties( ${BGFX_DIR}/src/hmd_ovr.cpp PROPERTIES HEADER_FILE_ONLY ON ) +set_source_files_properties( ${BGFX_DIR}/src/glcontext_ppapi.cpp PROPERTIES HEADER_FILE_ONLY ON ) +set_source_files_properties( ${BGFX_DIR}/src/glcontext_glx.cpp PROPERTIES HEADER_FILE_ONLY ON ) +set_source_files_properties( ${BGFX_DIR}/src/glcontext_egl.cpp PROPERTIES HEADER_FILE_ONLY ON ) +if( NOT APPLE ) + set_source_files_properties( ${BGFX_DIR}/src/glcontext_eagl.mm PROPERTIES HEADER_FILE_ONLY ON ) + set_source_files_properties( ${BGFX_DIR}/src/glcontext_nsgl.mm PROPERTIES HEADER_FILE_ONLY ON ) + set_source_files_properties( ${BGFX_DIR}/src/renderer_mtl.mm PROPERTIES HEADER_FILE_ONLY ON ) +endif() diff --git a/cmake/bx.cmake b/cmake/bx.cmake new file mode 100644 index 0000000..aa64bff --- /dev/null +++ b/cmake/bx.cmake @@ -0,0 +1,15 @@ +# Copyright (c) 2016 Joshua Brookover + +set( BX_DIR "${CMAKE_CURRENT_SOURCE_DIR}/bx" ) + +add_library( bx INTERFACE ) + +target_include_directories( bx INTERFACE ${BX_DIR}/include ) + +if( MSVC ) + target_include_directories( bx INTERFACE ${BX_DIR}/include/compat/msvc ) +elseif( MINGW ) + target_include_directories( bx INTERFACE ${BX_DIR}/include/compat/mingw ) +elseif( APPLE ) + target_include_directories( bx INTERFACE ${BX_DIR}/include/compat/osx ) +endif() diff --git a/cmake/examples.cmake b/cmake/examples.cmake new file mode 100644 index 0000000..4477cad --- /dev/null +++ b/cmake/examples.cmake @@ -0,0 +1,116 @@ +# Copyright (c) 2016 Joshua Brookover + +include( CMakeParseArguments ) + +include( cmake/util/ConfigureDebugging.cmake ) + +include( cmake/3rdparty/ib-compress.cmake ) +include( cmake/3rdparty/ocornut-imgui.cmake ) + +function( add_bgfx_shader FILE FOLDER ) + get_filename_component( FILENAME "${FILE}" NAME_WE ) + string( SUBSTRING "${FILENAME}" 0 2 TYPE ) + if( "${TYPE}" STREQUAL "fs" ) + set( TYPE "FRAGMENT" ) + set( D3D_PREFIX "ps" ) + elseif( "${TYPE}" STREQUAL "vs" ) + set( TYPE "VERTEX" ) + set( D3D_PREFIX "vs" ) + else() + set( TYPE "" ) + endif() + if( NOT "${TYPE}" STREQUAL "" ) + set( COMMON FILE ${FILE} OUTPUT ${BGFX_DIR}/examples/runtime/shaders/dx11/${FILENAME}.bin ${TYPE} INCLUDES ${BGFX_DIR}/src ) + shaderc( ${COMMON} WINDOWS PROFILE ${D3D_PREFIX}_4_0 ) + #shaderc( ${COMMON} LINUX PROFILE 120 ) + endif() +endfunction() + +function( add_example ARG_NAME ) + # Parse arguments + cmake_parse_arguments( ARG "COMMON" "" "DIRECTORIES;SOURCES" ${ARGN} ) + + # Get all source files + list( APPEND ARG_DIRECTORIES "${BGFX_DIR}/examples/${ARG_NAME}" ) + set( SOURCES "" ) + set( SHADERS "" ) + foreach( DIR ${ARG_DIRECTORIES} ) + file( GLOB GLOB_SOURCES ${DIR}/*.c ${DIR}/*.cpp ${DIR}/*.h ${DIR}/*.sc ) + list( APPEND SOURCES ${GLOB_SOURCES} ) + file( GLOB GLOB_SHADERS ${DIR}/*.sc ) + list( APPEND SHADERS ${GLOB_SHADERS} ) + endforeach() + + # Add target + if( ARG_COMMON ) + add_library( example-${ARG_NAME} STATIC ${SOURCES} ) + target_compile_definitions( example-${ARG_NAME} PRIVATE "-D_CRT_SECURE_NO_WARNINGS" "-D__STDC_FORMAT_MACROS" ) + target_include_directories( example-${ARG_NAME} PUBLIC ${BGFX_DIR}/examples/common ) + target_link_libraries( example-${ARG_NAME} PUBLIC bgfx ib-compress ocornut-imgui ) + else() + add_executable( example-${ARG_NAME} WIN32 ${SOURCES} ) + target_compile_definitions( example-${ARG_NAME} PRIVATE "-D_CRT_SECURE_NO_WARNINGS" "-D__STDC_FORMAT_MACROS" ) + target_link_libraries( example-${ARG_NAME} example-common ) + configure_debugging( example-${ARG_NAME} WORKING_DIR ${BGFX_DIR}/examples/runtime ) + if( MSVC ) + set_target_properties( example-${ARG_NAME} PROPERTIES LINK_FLAGS "/ENTRY:\"mainCRTStartup\"" ) + endif() + endif() + + # Configure shaders + if( NOT ARG_COMMON ) + foreach( SHADER ${SHADERS} ) + add_bgfx_shader( ${SHADER} ${ARG_NAME} ) + endforeach() + source_group( "Shader Files" FILES ${SHADERS}) + endif() + + # Directory name + set_target_properties( example-${ARG_NAME} PROPERTIES FOLDER "examples" ) +endfunction() + +# Add common library for examples +add_example( + common + COMMON + DIRECTORIES + ${BGFX_DIR}/examples/common/debugdraw + ${BGFX_DIR}/examples/common/entry + ${BGFX_DIR}/examples/common/font + ${BGFX_DIR}/examples/common/imgui + ${BGFX_DIR}/examples/common/nanovg +) + +# Add examples +add_example( 00-helloworld ) +add_example( 01-cubes ) +add_example( 02-metaballs ) +add_example( 03-raymarch ) +add_example( 04-mesh ) +add_example( 05-instancing ) +add_example( 06-bump ) +add_example( 07-callback ) +add_example( 08-update ) +add_example( 09-hdr ) +add_example( 10-font ) +add_example( 11-fontsdf ) +add_example( 12-lod ) +add_example( 13-stencil ) +add_example( 14-shadowvolumes ) +add_example( 15-shadowmaps-simple ) +add_example( 16-shadowmaps ) +add_example( 17-drawstress ) +add_example( 18-ibl ) +add_example( 19-oit ) +add_example( 20-nanovg ) +add_example( 21-deferred ) +add_example( 22-windows ) +add_example( 23-vectordisplay ) +add_example( 24-nbody ) +add_example( 25-c99 ) +add_example( 26-occlusion ) +add_example( 27-terrain ) +add_example( 28-wireframe ) +add_example( 29-debugdraw ) +add_example( 30-picking ) +add_example( 31-rsm ) diff --git a/cmake/tools.cmake b/cmake/tools.cmake new file mode 100644 index 0000000..42158ee --- /dev/null +++ b/cmake/tools.cmake @@ -0,0 +1,3 @@ +# Copyright (c) 2016 Joshua Brookover + +include( cmake/tools/shaderc.cmake ) diff --git a/cmake/tools/shaderc.cmake b/cmake/tools/shaderc.cmake new file mode 100644 index 0000000..971a058 --- /dev/null +++ b/cmake/tools/shaderc.cmake @@ -0,0 +1,191 @@ +# Copyright (c) 2016 Joshua Brookover + +include( CMakeParseArguments ) + +include( cmake/3rdparty/fcpp.cmake ) +include( cmake/3rdparty/glsl-optimizer.cmake ) + +add_executable( shaderc bgfx/tools/shaderc/shaderc.cpp bgfx/tools/shaderc/shaderc.h bgfx/tools/shaderc/shaderc_glsl.cpp bgfx/tools/shaderc/shaderc_hlsl.cpp ) +target_compile_definitions( shaderc PRIVATE "-D_CRT_SECURE_NO_WARNINGS" ) +set_target_properties( shaderc PROPERTIES FOLDER "tools" ) +target_link_libraries( shaderc bx bgfx fcpp glsl-optimizer ) + +# shaderc( FILE file OUTPUT file ... ) +# See shaderc_parse() below for inputs +function( shaderc ) + cmake_parse_arguments( ARG "" "FILE;OUTPUT" "" ${ARGN} ) + shaderc_parse( CLI ${ARGN} ) +#add_custom_command( OUTPUT ${ARG_OUTPUT} COMMAND "C:/Users/Josh/Downloads/bgfx-examples/shaderc" ${CLI} MAIN_DEPENDENCY ${ARG_FILE} ) + add_custom_command( OUTPUT ${ARG_OUTPUT} COMMAND "$" ${CLI} MAIN_DEPENDENCY ${ARG_FILE} COMMENT "Compiling shader ${ARG_FILE}" ) +endfunction() + +# shaderc_parse( +# FILE filename +# OUTPUT filename +# FRAGMENT|VERTEX +# ANDROID|ASM_JS|IOS|LINUX|NACL|OSX|WINDOWS +# [PROFILE profile] +# [O 0|1|2|3] +# [VARYINGDEF filename] +# [BIN2C filename] +# [INCLUDES include;include] +# [DEFINES include;include] +# [DEPENDS] +# [PREPROCESS] +# [RAW] +# [VERBOSE] +# [DEBUG] +# [DISASM] +# [WERROR] +# ) +function( shaderc_parse ARG_OUT ) + cmake_parse_arguments( ARG "DEPENDS;ANDROID;ASM_JS;IOS;LINUX;NACL;OSX;WINDOWS;PREPROCESS;RAW;FRAGMENT;VERTEX;VERBOSE;DEBUG;DISASM;WERROR" "FILE;OUTPUT;VARYINGDEF;BIN2C;PROFILE;O" "INCLUDES;DEFINES" ${ARGN} ) + set( CLI "" ) + + # -f + if( ARG_FILE ) + list( APPEND CLI "-f" "${ARG_FILE}" ) + endif() + + # -i + if( ARG_INCLUDES ) + list( APPEND CLI "-i" ) + set( INCLUDES "" ) + foreach( INCLUDE ${ARG_INCLUDES} ) + if( NOT "${INCLUDES}" STREQUAL "" ) + set( INCLUDES "${INCLUDES}\\\\;${INCLUDE}" ) + else() + set( INCLUDES "${INCLUDE}" ) + endif() + endforeach() + list( APPEND CLI "${INCLUDES}" ) + endif() + + # -o + if( ARG_OUTPUT ) + list( APPEND CLI "-o" "${ARG_OUTPUT}" ) + endif() + + # --bin2c + if( ARG_BIN2C ) + list( APPEND CLI "--bin2c" "${ARG_BIN2C}" ) + endif() + + # --depends + if( ARG_DEPENDS ) + list( APPEND CLI "--depends" ) + endif() + + # --platform + set( PLATFORM "" ) + set( PLATFORMS "ANDROID;ASM_JS;IOS;LINUX;NACL;OSX;WINDOWS" ) + foreach( P ${PLATFORMS} ) + if( ARG_${P} ) + if( PLATFORM ) + message( SEND_ERROR "Call to shaderc_parse() cannot have both flags ${PLATFORM} and ${P}." ) + return() + endif() + set( PLATFORM "${P}" ) + endif() + endforeach() + if( "${PLATFORM}" STREQUAL "" ) + message( SEND_ERROR "Call to shaderc_parse() must have a platform flag: ${PLATFORMS}" ) + return() + elseif( "${PLATFORM}" STREQUAL "ANDROID" ) + list( APPEND CLI "--platform" "android" ) + elseif( "${PLATFORM}" STREQUAL "ASM_JS" ) + list( APPEND CLI "--platform" "asm.js" ) + elseif( "${PLATFORM}" STREQUAL "IOS" ) + list( APPEND CLI "--platform" "ios" ) + elseif( "${PLATFORM}" STREQUAL "LINUX" ) + list( APPEND CLI "--platform" "linux" ) + elseif( "${PLATFORM}" STREQUAL "NACL" ) + list( APPEND CLI "--platform" "nacl" ) + elseif( "${PLATFORM}" STREQUAL "OSX" ) + list( APPEND CLI "--platform" "osx" ) + elseif( "${PLATFORM}" STREQUAL "WINDOWS" ) + list( APPEND CLI "--platform" "windows" ) + endif() + + # --preprocess + if( ARG_PREPROCESS ) + list( APPEND CLI "--preprocess" ) + endif() + + # --define + if( ARG_DEFINES ) + list( APPEND CLI "--defines" ) + set( DEFINES "" ) + foreach( DEFINE ${ARG_DEFINES} ) + if( NOT "${DEFINES}" STREQUAL "" ) + set( DEFINES "${DEFINES}\\\\;${DEFINE}" ) + else() + set( DEFINES "${DEFINE}" ) + endif() + endforeach() + list( APPEND CLI "${DEFINES}" ) + endif() + + # --raw + if( ARG_RAW ) + list( APPEND CLI "--raw" ) + endif() + + # --type + set( TYPE "" ) + set( TYPES "FRAGMENT;VERTEX" ) + foreach( T ${TYPES} ) + if( ARG_${T} ) + if( TYPE ) + message( SEND_ERROR "Call to shaderc_parse() cannot have both flags ${TYPE} and ${T}." ) + return() + endif() + set( TYPE "${T}" ) + endif() + endforeach() + if( "${TYPE}" STREQUAL "" ) + message( SEND_ERROR "Call to shaderc_parse() must have a type flag: ${TYPES}" ) + return() + elseif( "${TYPE}" STREQUAL "FRAGMENT" ) + list( APPEND CLI "--type" "fragment" ) + elseif( "${TYPE}" STREQUAL "VERTEX" ) + list( APPEND CLI "--type" "vertex" ) + endif() + + # --varyingdef + if( ARG_VARYINGDEF ) + list( APPEND CLI "--varyingdef" "${ARG_VARYINGDEF}" ) + endif() + + # --verbose + if( ARG_VERBOSE ) + list( APPEND CLI "--verbose" ) + endif() + + # --debug + if( ARG_DEBUG ) + list( APPEND CLI "--debug" ) + endif() + + # --disasm + if( ARG_DISASM ) + list( APPEND CLI "--disasm" ) + endif() + + # --profile + if( ARG_PROFILE ) + list( APPEND CLI "--profile" "${ARG_PROFILE}" ) + endif() + + # -O + if( ARG_O ) + list( APPEND CLI "-O" "${ARG_O}" ) + endif() + + # --Werror + if( ARG_WERROR ) + list( APPEND CLI "--Werror" ) + endif() + + set( ${ARG_OUT} ${CLI} PARENT_SCOPE ) +endfunction() diff --git a/cmake/util/ConfigureDebugging.cmake b/cmake/util/ConfigureDebugging.cmake new file mode 100644 index 0000000..3d85a91 --- /dev/null +++ b/cmake/util/ConfigureDebugging.cmake @@ -0,0 +1,150 @@ +# Copyright (c) 2016 Joshua Brookover +# +# configure_debugging( TARGET [OPTIONS...] ) +# +# Configures the debugging settings in visual studio. +# Results in a no-op on non visual studio builds. +# Must be called in the same cmake file as the add_executable command. +# +# See OPTIONS variable in the function for supported user settings. +# See CONFIGS variable in the function for supported cmake configurations. +# See PROCESSORS variable in the function for supported architecture configurations. +# +# All variables can be set with one of the following formats: +# +# (OPTION) +# (OPTION)_(CONFIG) +# (OPTION)_(CONFIG)_(ARCH) +# (OPTION)_(ARCH) +# +# So, some examples (variables should be all caps): +# +# WORKING_DIR +# WORKING_DIR_X64 +# WORKING_DIR_RELEASE_WIN32 +# WORKING_DIR_X64 +# +# An example of a full command: +# +# configure_debugging(target COMMAND "node.exe" COMMAND_X64 "node64.exe" WORKING_DIR ${CMAKE_SOURCE_DIR} DEBUGGER_ENV "PATH=%PATH%\\;$(ProjectDir)") + +include( CMakeParseArguments ) + +function( configure_debugging ARG_TARGET ) + if( MSVC ) + # Visual Studio Options + set( + OPTIONS + WORKING_DIR LocalDebuggerWorkingDirectory + DEBUGGER_ENV LocalDebuggerEnvironment + COMMAND LocalDebuggerCommand + COMMAND_ARGS LocalDebuggerCommandArguments + ) + + # Valid Configurations + set( + CONFIGS + Debug + Release + MinSizeRel + RelWithDebInfo + ) + + # Processors + set( + PROCESSORS + Win32 + x64 + ) + + # Begin hackery + if( ${CMAKE_SIZEOF_VOID_P} EQUAL 8 ) + set( ACTIVE_PROCESSOR "x64" ) + else() + set( ACTIVE_PROCESSOR "Win32" ) + endif() + # Fix issues with semicolons, thx cmake + foreach( ARG ${ARGN} ) + string( REPLACE ";" "\\\\\\\\\\\\\\;" RES "${ARG}" ) + list( APPEND ARGS "${RES}" ) + endforeach() + # Build options for cmake_parse_arguments, result is ONE_ARG variable + set( ODD ON ) + foreach( OPTION ${OPTIONS} ) + if( ODD ) + set( ARG ${OPTION} ) + list( APPEND ONE_ARG ${ARG} ) + foreach( CONFIG ${CONFIGS} ) + string( TOUPPER ${CONFIG} CONFIG ) + list( APPEND ONE_ARG ${ARG}_${CONFIG} ) + foreach( PROCESSOR ${PROCESSORS} ) + string( TOUPPER ${PROCESSOR} PROCESSOR ) + list( APPEND ONE_ARG ${ARG}_${CONFIG}_${PROCESSOR} ) + endforeach() + endforeach() + foreach( PROCESSOR ${PROCESSORS} ) + string( TOUPPER ${PROCESSOR} PROCESSOR ) + list( APPEND ONE_ARG ${ARG}_${PROCESSOR} ) + endforeach() + set( ODD OFF ) + else() + set( ODD ON ) + endif() + endforeach() + cmake_parse_arguments( ARG "" "${ONE_ARG}" "" ${ARGS} ) + # Parse options, fills in all variables of format ARG_(ARG)_(CONFIG)_(PROCESSOR), for example ARG_WORKING_DIR_DEBUG_X64 + set( ODD ON ) + foreach( OPTION ${OPTIONS} ) + if( ODD ) + set( ARG ${OPTION} ) + foreach( CONFIG ${CONFIGS} ) + string( TOUPPER ${CONFIG} CONFIG_CAP ) + if( "${ARG_${ARG}_${CONFIG_CAP}}" STREQUAL "" ) + set( ARG_${ARG}_${CONFIG_CAP} ${ARG_${ARG}} ) + endif() + foreach( PROCESSOR ${PROCESSORS} ) + string( TOUPPER ${PROCESSOR} PROCESSOR_CAP ) + if( "${ARG_${ARG}_${CONFIG_CAP}_${PROCESSOR_CAP}}" STREQUAL "" ) + if( "${ARG_${ARG}_${PROCESSOR_CAP}}" STREQUAL "" ) + set( ARG_${ARG}_${CONFIG_CAP}_${PROCESSOR_CAP} ${ARG_${ARG}_${CONFIG_CAP}} ) + else() + set( ARG_${ARG}_${CONFIG_CAP}_${PROCESSOR_CAP} ${ARG_${ARG}_${PROCESSOR_CAP}} ) + endif() + endif() + if( NOT "${ARG_${ARG}_${CONFIG_CAP}_${PROCESSOR_CAP}}" STREQUAL "" ) + endif() + endforeach() + endforeach() + set( ODD OFF ) + else() + set( ODD ON ) + endif() + endforeach() + # Create string to put in proj.vcxproj.user file + set( RESULT "" ) + foreach( CONFIG ${CONFIGS} ) + string( TOUPPER ${CONFIG} CONFIG_CAPS ) + foreach( PROCESSOR ${PROCESSORS} ) + if( "${PROCESSOR}" STREQUAL "${ACTIVE_PROCESSOR}" ) + string( TOUPPER ${PROCESSOR} PROCESSOR_CAPS ) + set( RESULT "${RESULT}\n " ) + set( ODD ON ) + foreach( OPTION ${OPTIONS} ) + if( ODD ) + set( ARG ${OPTION} ) + set( ODD OFF ) + else() + set( VALUE ${ARG_${ARG}_${CONFIG_CAPS}_${PROCESSOR_CAPS}} ) + if( NOT "${VALUE}" STREQUAL "" ) + set( RESULT "${RESULT}\n <${OPTION}>${VALUE}" ) + endif() + set( ODD ON ) + endif() + endforeach() + set( RESULT "${RESULT}\n " ) + endif() + endforeach() + endforeach() + configure_file( ${CMAKE_SOURCE_DIR}/cmake/util/vcxproj.user.in ${CMAKE_CURRENT_BINARY_DIR}/${ARG_TARGET}.vcxproj.user @ONLY ) + endif() +endfunction() diff --git a/cmake/util/vcxproj.user.in b/cmake/util/vcxproj.user.in new file mode 100644 index 0000000..e4610b8 --- /dev/null +++ b/cmake/util/vcxproj.user.in @@ -0,0 +1,3 @@ + +@RESULT@ + diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..0e949ba --- /dev/null +++ b/readme.md @@ -0,0 +1,24 @@ +bgfx.cmake +=================== + +This repo contains a bunch of cmake files that can be used to build bgfx with CMake. To get started, pull down the repo and run these commands from within the root directory of the repo: + +``` +git clone git@github.com:bkaradzic/bx.git +git clone git@github.com:bkaradzic/bgfx.git +mkdir build +cd build +cmake .. +``` + +Features +------------- +* No outside dependencies besides bx, bgfx, and CMake. +* Only tested in Visual Studio 2015 so far. +* Compiles bgfx, tools & examples. +* Detects shader modifications and automatically rebuilds them (DirectX11 shaders only for now). +* Uses CMake interface libraries (linking against bgfx is one line of cmake code via target_link_libraries). + +License +------------- +The license is BSD with no clauses meaning you can use this software however you want but I cannot be held liable for damages.