From 522a6d8c30082725de73d6af310004726b307f93 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Thu, 26 Mar 2015 08:14:29 +0100 Subject: [PATCH] updated to latest 3rdparty --- .../bgfx/3rdparty/ocornut-imgui/imgui.cpp | 4 +- 3rdparty/bgfx/README.md | 12 + .../bgfx/examples/common/entry/entry_glfw.cpp | 139 +++++++++++ .../bgfx/examples/common/entry/entry_osx.mm | 16 +- 3rdparty/bgfx/examples/common/entry/entry_p.h | 9 +- 3rdparty/bgfx/examples/runtime/.gitignore | 1 + 3rdparty/bgfx/include/bgfxdefines.h | 12 +- 3rdparty/bgfx/include/bgfxplatform.h | 16 +- 3rdparty/bgfx/scripts/bgfx.lua | 34 ++- 3rdparty/bgfx/scripts/example-common.lua | 6 + 3rdparty/bgfx/scripts/genie.lua | 54 ++++- 3rdparty/bgfx/src/amalgamated.cpp | 20 ++ 3rdparty/bgfx/src/bgfx.cpp | 70 +++--- 3rdparty/bgfx/src/bgfx_p.h | 55 ++++- 3rdparty/bgfx/src/glcontext_eagl.h | 4 +- 3rdparty/bgfx/src/glcontext_eagl.mm | 4 +- 3rdparty/bgfx/src/glcontext_egl.cpp | 4 +- 3rdparty/bgfx/src/glcontext_egl.h | 4 +- 3rdparty/bgfx/src/glcontext_glx.cpp | 217 +++++++++--------- 3rdparty/bgfx/src/glcontext_glx.h | 4 +- 3rdparty/bgfx/src/glcontext_nsgl.h | 4 +- 3rdparty/bgfx/src/glcontext_nsgl.mm | 83 ++++--- 3rdparty/bgfx/src/glcontext_ppapi.cpp | 19 +- 3rdparty/bgfx/src/glcontext_ppapi.h | 4 +- 3rdparty/bgfx/src/glcontext_wgl.cpp | 4 +- 3rdparty/bgfx/src/glcontext_wgl.h | 4 +- 3rdparty/bgfx/src/image.cpp | 168 +++++++------- 3rdparty/bgfx/src/ovr.h | 5 + 3rdparty/bgfx/src/renderdoc.h | 5 + 3rdparty/bgfx/src/renderer.h | 5 + 3rdparty/bgfx/src/renderer_d3d11.cpp | 16 +- 3rdparty/bgfx/src/renderer_d3d11.h | 4 +- 3rdparty/bgfx/src/renderer_d3d12.cpp | 8 +- 3rdparty/bgfx/src/renderer_d3d9.cpp | 16 +- 3rdparty/bgfx/src/renderer_d3d9.h | 4 +- 3rdparty/bgfx/src/renderer_gl.cpp | 31 ++- 3rdparty/bgfx/src/renderer_gl.h | 6 +- 3rdparty/bgfx/src/renderer_null.cpp | 16 +- 3rdparty/bgfx/src/renderer_vk.cpp | 8 +- 3rdparty/bgfx/tools/geometryc/geometryc.cpp | 20 +- 3rdparty/bgfx/tools/shaderc/shaderc.cpp | 20 +- 3rdparty/bx/include/bx/handlealloc.h | 4 +- 3rdparty/bx/tests/unordered_map_nonpod.cpp | 5 +- 3rdparty/bx/tools/bin/darwin/genie | Bin 389488 -> 389568 bytes 3rdparty/bx/tools/bin/linux/genie | Bin 372064 -> 372064 bytes 3rdparty/bx/tools/bin/windows/genie.exe | Bin 355328 -> 355328 bytes 3rdparty/genie/.gitignore | 8 - 3rdparty/genie/README.md | 7 +- 3rdparty/genie/scripts/genie.lua | 2 +- 3rdparty/genie/src/actions/make/make_cpp.lua | 35 +-- .../src/actions/vstudio/vs2010_vcxproj.lua | 84 ++----- 3rdparty/genie/src/base/api.lua | 15 +- 3rdparty/genie/src/base/bake.lua | 17 +- 3rdparty/genie/src/base/inspect.lua | 8 +- 3rdparty/genie/src/base/table.lua | 35 +-- 3rdparty/genie/src/host/scripts.c | 77 +++---- 56 files changed, 872 insertions(+), 560 deletions(-) create mode 100644 3rdparty/bgfx/examples/common/entry/entry_glfw.cpp create mode 100644 3rdparty/bgfx/src/amalgamated.cpp diff --git a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp index 866bec93420..8a26d9cffb4 100644 --- a/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp +++ b/3rdparty/bgfx/3rdparty/ocornut-imgui/imgui.cpp @@ -350,8 +350,8 @@ #pragma clang diagnostic ignored "-Wexit-time-destructors" // warning : declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals. #pragma clang diagnostic ignored "-Wglobal-constructors" // warning : declaration requires a global destructor // similar to above, not sure what the exact difference it. #pragma clang diagnostic ignored "-Wsign-conversion" // warning : implicit conversion changes signedness // -#endif -#ifdef __GNUC__ +#pragma clang diagnostic ignored "-Wunused-parameter" // warning: unused parameter ‘xxxx’ +#elif defined(__GNUC__) #pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used #pragma GCC diagnostic ignored "-Wunused-parameter" // warning: unused parameter ‘xxxx’ #pragma GCC diagnostic ignored "-Wtype-limits" // warning: comparison is always true due to limited range of data type diff --git a/3rdparty/bgfx/README.md b/3rdparty/bgfx/README.md index e0fd614bb36..91fd26ba496 100644 --- a/3rdparty/bgfx/README.md +++ b/3rdparty/bgfx/README.md @@ -432,6 +432,13 @@ Configuration is `-[32/64]`. For example: linux-release32, nacl-debug64, nacl-arm-debug, pnacl-release, android-release, etc. +Amalgamated build +----------------- + +For ease of integration to other build system bgfx library can be built with +single .cpp file. It's only necessary to build [src/amalgamated.cpp](https://github.com/bkaradzic/bgfx/blob/master/src/amalgamated.cpp) +inside different build system. + OculusVR integration -------------------- @@ -568,6 +575,11 @@ with examples: genie --with-sdl vs2012 +**NOTE** Special care is necessary to make custom windowing to work with +multithreaded renderer. Each platform has rules about where renderer can be and +how multithreading interacts with context/device. To disable multithreaded +render use `BGFX_CONFIG_MULTITHREDED=0` preprocessor define. + Tools ----- diff --git a/3rdparty/bgfx/examples/common/entry/entry_glfw.cpp b/3rdparty/bgfx/examples/common/entry/entry_glfw.cpp new file mode 100644 index 00000000000..42a7bc6f047 --- /dev/null +++ b/3rdparty/bgfx/examples/common/entry/entry_glfw.cpp @@ -0,0 +1,139 @@ +/* + * Copyright 2011-2015 Branimir Karadzic. All rights reserved. + * License: http://www.opensource.org/licenses/BSD-2-Clause + */ + +#include "entry_p.h" + +#if ENTRY_CONFIG_USE_GLFW + +#define GLFW_DLL +#include +#include +#include "dbg.h" + +// This is just trivial implementation of GLFW3 integration. +// It's here just for testing purpose. + +namespace entry +{ + static void errorCb(int _error, const char* _description) + { + DBG("GLFW error %d: %s", _error, _description); + } + + struct Context + { + Context() + { + } + + int run(int _argc, char** _argv) + { + glfwSetErrorCallback(errorCb); + + glfwInit(); + m_window = glfwCreateWindow(1280, 720, "bgfx", NULL, NULL); + glfwMakeContextCurrent(m_window); + + glfwSetKeyCallback(m_window, keyCb); + + bgfx::glfwSetWindow(m_window); + int result = main(_argc, _argv); + + glfwDestroyWindow(m_window); + glfwTerminate(); + return result; + } + + static void keyCb(GLFWwindow* _window, int _key, int _scancode, int _action, int _mods); + + EventQueue m_eventQueue; + + GLFWwindow* m_window; + }; + + Context s_ctx; + + void Context::keyCb(GLFWwindow* _window, int _key, int _scancode, int _action, int _mods) + { + BX_UNUSED(_window, _scancode, _mods); + if (_key == GLFW_KEY_Q + && _action == GLFW_PRESS + && _mods == GLFW_MOD_CONTROL) + { + s_ctx.m_eventQueue.postExitEvent(); + } + } + + const Event* poll() + { + glfwPollEvents(); + + if (glfwWindowShouldClose(s_ctx.m_window) ) + { + s_ctx.m_eventQueue.postExitEvent(); + } + return s_ctx.m_eventQueue.poll(); + } + + const Event* poll(WindowHandle _handle) + { + return s_ctx.m_eventQueue.poll(_handle); + } + + void release(const Event* _event) + { + s_ctx.m_eventQueue.release(_event); + } + + WindowHandle createWindow(int32_t _x, int32_t _y, uint32_t _width, uint32_t _height, uint32_t _flags, const char* _title) + { + BX_UNUSED(_x, _y, _width, _height, _flags, _title); + WindowHandle handle = { UINT16_MAX }; + return handle; + } + + void destroyWindow(WindowHandle _handle) + { + BX_UNUSED(_handle); + } + + void setWindowPos(WindowHandle _handle, int32_t _x, int32_t _y) + { + BX_UNUSED(_handle, _x, _y); + } + + void setWindowSize(WindowHandle _handle, uint32_t _width, uint32_t _height) + { + BX_UNUSED(_handle, _width, _height); + } + + void setWindowTitle(WindowHandle _handle, const char* _title) + { + BX_UNUSED(_handle, _title); + } + + void toggleWindowFrame(WindowHandle _handle) + { + BX_UNUSED(_handle); + } + + void toggleFullscreen(WindowHandle _handle) + { + BX_UNUSED(_handle); + } + + void setMouseLock(WindowHandle _handle, bool _lock) + { + BX_UNUSED(_handle, _lock); + } +} + +int main(int _argc, char** _argv) +{ + using namespace entry; + return s_ctx.run(_argc, _argv); +} + +#endif // ENTRY_CONFIG_USE_GLFW diff --git a/3rdparty/bgfx/examples/common/entry/entry_osx.mm b/3rdparty/bgfx/examples/common/entry/entry_osx.mm index 14a4930128a..89e7c4814d1 100644 --- a/3rdparty/bgfx/examples/common/entry/entry_osx.mm +++ b/3rdparty/bgfx/examples/common/entry/entry_osx.mm @@ -311,19 +311,9 @@ namespace entry else { enum { ShiftMask = Modifier::LeftShift|Modifier::RightShift }; - const bool nonShiftModifiers = (0 != (modifiers&(~ShiftMask) ) ); - const bool isCharPressed = (Key::Key0 <= key && key <= Key::KeyZ) || (Key::Esc <= key && key <= Key::Minus); - const bool isText = isCharPressed && !nonShiftModifiers; - if (isText) - { - m_eventQueue.postCharEvent(s_defaultWindow, 1, pressedChar); - return false; - } - else - { - m_eventQueue.postKeyEvent(s_defaultWindow, key, modifiers, true); - return false; - } + m_eventQueue.postCharEvent(s_defaultWindow, 1, pressedChar); + m_eventQueue.postKeyEvent(s_defaultWindow, key, modifiers, true); + return false; } } diff --git a/3rdparty/bgfx/examples/common/entry/entry_p.h b/3rdparty/bgfx/examples/common/entry/entry_p.h index 74d4756b5cb..d41ab56804b 100644 --- a/3rdparty/bgfx/examples/common/entry/entry_p.h +++ b/3rdparty/bgfx/examples/common/entry/entry_p.h @@ -17,8 +17,13 @@ # define ENTRY_CONFIG_USE_SDL 0 #endif // ENTRY_CONFIG_USE_SDL -#if !ENTRY_CONFIG_USE_SDL && \ - !defined(ENTRY_CONFIG_USE_NATIVE) +#ifndef ENTRY_CONFIG_USE_GLFW +# define ENTRY_CONFIG_USE_GLFW 0 +#endif // ENTRY_CONFIG_USE_GLFW + +#if !defined(ENTRY_CONFIG_USE_NATIVE) \ + && !ENTRY_CONFIG_USE_SDL \ + && !ENTRY_CONFIG_USE_GLFW # define ENTRY_CONFIG_USE_NATIVE 1 #else # define ENTRY_CONFIG_USE_NATIVE 0 diff --git a/3rdparty/bgfx/examples/runtime/.gitignore b/3rdparty/bgfx/examples/runtime/.gitignore index babe9f7d0c3..5394aa127bf 100644 --- a/3rdparty/bgfx/examples/runtime/.gitignore +++ b/3rdparty/bgfx/examples/runtime/.gitignore @@ -1,3 +1,4 @@ *.dll +*.so *.pdb imgui* diff --git a/3rdparty/bgfx/include/bgfxdefines.h b/3rdparty/bgfx/include/bgfxdefines.h index eb57fdba47c..d7bfd62768a 100644 --- a/3rdparty/bgfx/include/bgfxdefines.h +++ b/3rdparty/bgfx/include/bgfxdefines.h @@ -81,16 +81,16 @@ | BGFX_STATE_MSAA \ ) -#define BGFX_STATE_ALPHA_REF(_ref) ( (uint64_t(_ref)<setUniform(_handle, _value, _num); } void setIndexBuffer(IndexBufferHandle _handle, uint32_t _firstIndex, uint32_t _numIndices) { BGFX_CHECK_MAIN_THREAD(); - BGFX_CHECK_HANDLE(_handle, BGFX_CONFIG_MAX_INDEX_BUFFERS); s_ctx->setIndexBuffer(_handle, _firstIndex, _numIndices); } void setIndexBuffer(DynamicIndexBufferHandle _handle, uint32_t _firstIndex, uint32_t _numIndices) { BGFX_CHECK_MAIN_THREAD(); - BGFX_CHECK_HANDLE(_handle, BGFX_CONFIG_MAX_DYNAMIC_INDEX_BUFFERS); s_ctx->setIndexBuffer(_handle, _firstIndex, _numIndices); } @@ -2809,14 +2800,12 @@ again: void setVertexBuffer(VertexBufferHandle _handle, uint32_t _startVertex, uint32_t _numVertices) { BGFX_CHECK_MAIN_THREAD(); - BGFX_CHECK_HANDLE(_handle, BGFX_CONFIG_MAX_VERTEX_BUFFERS); s_ctx->setVertexBuffer(_handle, _startVertex, _numVertices); } void setVertexBuffer(DynamicVertexBufferHandle _handle, uint32_t _numVertices) { BGFX_CHECK_MAIN_THREAD(); - BGFX_CHECK_HANDLE(_handle, BGFX_CONFIG_MAX_DYNAMIC_VERTEX_BUFFERS); s_ctx->setVertexBuffer(_handle, _numVertices); } @@ -2842,21 +2831,18 @@ again: void setInstanceDataBuffer(VertexBufferHandle _handle, uint32_t _startVertex, uint32_t _num) { BGFX_CHECK_MAIN_THREAD(); - BGFX_CHECK_HANDLE(_handle, BGFX_CONFIG_MAX_VERTEX_BUFFERS); s_ctx->setInstanceDataBuffer(_handle, _startVertex, _num); } void setInstanceDataBuffer(DynamicVertexBufferHandle _handle, uint32_t _startVertex, uint32_t _num) { BGFX_CHECK_MAIN_THREAD(); - BGFX_CHECK_HANDLE(_handle, BGFX_CONFIG_MAX_DYNAMIC_VERTEX_BUFFERS); s_ctx->setInstanceDataBuffer(_handle, _startVertex, _num); } void setProgram(ProgramHandle _handle) { BGFX_CHECK_MAIN_THREAD(); - BGFX_CHECK_HANDLE(_handle, BGFX_CONFIG_MAX_PROGRAMS); s_ctx->setProgram(_handle); } @@ -2881,28 +2867,24 @@ again: void setBuffer(uint8_t _stage, IndexBufferHandle _handle, Access::Enum _access) { BGFX_CHECK_MAIN_THREAD(); - BGFX_CHECK_HANDLE(_handle, BGFX_CONFIG_MAX_INDEX_BUFFERS); s_ctx->setBuffer(_stage, _handle, _access); } void setBuffer(uint8_t _stage, VertexBufferHandle _handle, Access::Enum _access) { BGFX_CHECK_MAIN_THREAD(); - BGFX_CHECK_HANDLE(_handle, BGFX_CONFIG_MAX_VERTEX_BUFFERS); s_ctx->setBuffer(_stage, _handle, _access); } void setBuffer(uint8_t _stage, DynamicIndexBufferHandle _handle, Access::Enum _access) { BGFX_CHECK_MAIN_THREAD(); - BGFX_CHECK_HANDLE(_handle, BGFX_CONFIG_MAX_DYNAMIC_INDEX_BUFFERS); s_ctx->setBuffer(_stage, _handle, _access); } void setBuffer(uint8_t _stage, DynamicVertexBufferHandle _handle, Access::Enum _access) { BGFX_CHECK_MAIN_THREAD(); - BGFX_CHECK_HANDLE(_handle, BGFX_CONFIG_MAX_DYNAMIC_VERTEX_BUFFERS); s_ctx->setBuffer(_stage, _handle, _access); } diff --git a/3rdparty/bgfx/src/bgfx_p.h b/3rdparty/bgfx/src/bgfx_p.h index 11ccfa7b85c..b17b7b312d8 100644 --- a/3rdparty/bgfx/src/bgfx_p.h +++ b/3rdparty/bgfx/src/bgfx_p.h @@ -29,6 +29,15 @@ #include #include +#define BGFX_CHECK_HANDLE(_desc, _handleAlloc, _handle) \ + BX_CHECK(isValid(_handle) \ + && _handleAlloc.isValid(_handle.idx) \ + , "Invalid handle. %s handle: %d (max %d)" \ + , _desc \ + , _handle.idx \ + , _handleAlloc.getMaxHandles() \ + ); + namespace bgfx { #if BX_COMPILER_CLANG_ANALYZER @@ -204,8 +213,10 @@ namespace bgfx #elif BX_PLATFORM_LINUX extern void* g_bgfxX11Display; extern uint32_t g_bgfxX11Window; + extern void* g_bgfxGLX; #elif BX_PLATFORM_OSX extern void* g_bgfxNSWindow; + extern void* g_bgfxNSGL; #elif BX_PLATFORM_WINDOWS extern ::HWND g_bgfxHwnd; #elif BX_PLATFORM_WINRT @@ -1418,7 +1429,10 @@ namespace bgfx { Binding& sampler = m_draw.m_bind[_stage]; sampler.m_idx = _handle.idx; - sampler.m_un.m_draw.m_flags = (_flags&BGFX_SAMPLER_DEFAULT_FLAGS) ? BGFX_SAMPLER_DEFAULT_FLAGS : _flags; + sampler.m_un.m_draw.m_flags = (_flags&BGFX_SAMPLER_DEFAULT_FLAGS) + ? BGFX_SAMPLER_DEFAULT_FLAGS + : _flags + ; if (isValid(_sampler) && (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) || BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES) ) ) @@ -1989,6 +2003,8 @@ namespace bgfx BGFX_API_FUNC(void destroyIndexBuffer(IndexBufferHandle _handle) ) { + BGFX_CHECK_HANDLE("destroyIndexBuffer", m_indexBufferHandle, _handle); + CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyIndexBuffer); cmdbuf.write(_handle); m_submit->free(_handle); @@ -2034,6 +2050,8 @@ namespace bgfx BGFX_API_FUNC(void destroyVertexBuffer(VertexBufferHandle _handle) ) { + BGFX_CHECK_HANDLE("destroyVertexBuffer", m_vertexBufferHandle, _handle); + CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyVertexBuffer); cmdbuf.write(_handle); m_submit->free(_handle); @@ -2135,6 +2153,8 @@ namespace bgfx BGFX_API_FUNC(void updateDynamicIndexBuffer(DynamicIndexBufferHandle _handle, const Memory* _mem) ) { + BGFX_CHECK_HANDLE("updateDynamicIndexBuffer", m_dynamicIndexBufferHandle, _handle); + DynamicIndexBuffer& dib = m_dynamicIndexBuffers[_handle.idx]; BX_CHECK(0 == (dib.m_flags & BGFX_BUFFER_COMPUTE_READ_WRITE), "Can't update GPU buffer from CPU."); @@ -2166,6 +2186,8 @@ namespace bgfx BGFX_API_FUNC(void destroyDynamicIndexBuffer(DynamicIndexBufferHandle _handle) ) { + BGFX_CHECK_HANDLE("destroyDynamicIndexBuffer", m_dynamicIndexBufferHandle, _handle); + m_freeDynamicIndexBufferHandle[m_numFreeDynamicIndexBufferHandles++] = _handle; } @@ -2279,6 +2301,8 @@ namespace bgfx BGFX_API_FUNC(void updateDynamicVertexBuffer(DynamicVertexBufferHandle _handle, const Memory* _mem) ) { + BGFX_CHECK_HANDLE("updateDynamicVertexBuffer", m_dynamicVertexBufferHandle, _handle); + DynamicVertexBuffer& dvb = m_dynamicVertexBuffers[_handle.idx]; BX_CHECK(0 == (dvb.m_flags & BGFX_BUFFER_COMPUTE_READ_WRITE), "Can't update GPU buffer from CPU."); @@ -2311,6 +2335,8 @@ namespace bgfx BGFX_API_FUNC(void destroyDynamicVertexBuffer(DynamicVertexBufferHandle _handle) ) { + BGFX_CHECK_HANDLE("destroyDynamicVertexBuffer", m_dynamicVertexBufferHandle, _handle); + m_freeDynamicVertexBufferHandle[m_numFreeDynamicVertexBufferHandles++] = _handle; } @@ -2593,6 +2619,8 @@ namespace bgfx BGFX_API_FUNC(void destroyShader(ShaderHandle _handle) ) { + BGFX_CHECK_HANDLE("destroyShader", m_shaderHandle, _handle); + if (!isValid(_handle) ) { BX_WARN(false, "Passing invalid shader handle to bgfx::destroyShader."); @@ -2704,6 +2732,8 @@ namespace bgfx BGFX_API_FUNC(void destroyProgram(ProgramHandle _handle) ) { + BGFX_CHECK_HANDLE("destroyProgram", m_programHandle, _handle); + CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyProgram); cmdbuf.write(_handle); m_submit->free(_handle); @@ -2769,6 +2799,8 @@ namespace bgfx BGFX_API_FUNC(void destroyTexture(TextureHandle _handle) ) { + BGFX_CHECK_HANDLE("destroyTexture", m_textureHandle, _handle); + if (!isValid(_handle) ) { BX_WARN(false, "Passing invalid texture handle to bgfx::destroyTexture"); @@ -2832,6 +2864,7 @@ namespace bgfx for (uint32_t ii = 0; ii < _num; ++ii) { TextureHandle texHandle = _handles[ii]; + BGFX_CHECK_HANDLE("createFrameBuffer texture handle", m_textureHandle, texHandle); cmdbuf.write(texHandle); @@ -2868,6 +2901,8 @@ namespace bgfx BGFX_API_FUNC(void destroyFrameBuffer(FrameBufferHandle _handle) ) { + BGFX_CHECK_HANDLE("destroyFrameBuffer", m_frameBufferHandle, _handle); + CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyFrameBuffer); cmdbuf.write(_handle); m_submit->free(_handle); @@ -2951,6 +2986,8 @@ namespace bgfx BGFX_API_FUNC(void destroyUniform(UniformHandle _handle) ) { + BGFX_CHECK_HANDLE("destroyUniform", m_uniformHandle, _handle); + UniformRef& uniform = m_uniformRef[_handle.idx]; BX_CHECK(uniform.m_refCount > 0, "Destroying already destroyed uniform %d.", _handle.idx); int32_t refs = --uniform.m_refCount; @@ -3054,6 +3091,7 @@ namespace bgfx BGFX_API_FUNC(void setViewFrameBuffer(uint8_t _id, FrameBufferHandle _handle) ) { + BGFX_CHECK_HANDLE("setViewFrameBuffer", m_frameBufferHandle, _handle); m_fb[_id] = _handle; } @@ -3091,7 +3129,7 @@ namespace bgfx BGFX_API_FUNC(void setViewRemap(uint8_t _id, uint8_t _num, const void* _remap) ) { - const uint32_t num = bx::uint32_min( (BGFX_CONFIG_MAX_VIEWS - _id) + _num, BGFX_CONFIG_MAX_VIEWS) - _id; + const uint32_t num = bx::uint32_min(_id + _num, BGFX_CONFIG_MAX_VIEWS) - _id; if (NULL == _remap) { for (uint32_t ii = 0; ii < num; ++ii) @@ -3148,6 +3186,7 @@ namespace bgfx BGFX_API_FUNC(void setUniform(UniformHandle _handle, const void* _value, uint16_t _num) ) { + BGFX_CHECK_HANDLE("setUniform", m_uniformHandle, _handle); UniformRef& uniform = m_uniformRef[_handle.idx]; BX_CHECK(uniform.m_num >= _num, "Truncated uniform update. %d (max: %d)", _num, uniform.m_num); m_submit->writeUniform(uniform.m_type, _handle, _value, bx::uint16_min(uniform.m_num, _num) ); @@ -3155,11 +3194,13 @@ namespace bgfx BGFX_API_FUNC(void setIndexBuffer(IndexBufferHandle _handle, uint32_t _firstIndex, uint32_t _numIndices) ) { + BGFX_CHECK_HANDLE("setIndexBuffer", m_indexBufferHandle, _handle); m_submit->setIndexBuffer(_handle, _firstIndex, _numIndices); } BGFX_API_FUNC(void setIndexBuffer(DynamicIndexBufferHandle _handle, uint32_t _firstIndex, uint32_t _numIndices) ) { + BGFX_CHECK_HANDLE("setIndexBuffer", m_dynamicIndexBufferHandle, _handle); m_submit->setIndexBuffer(m_dynamicIndexBuffers[_handle.idx], _firstIndex, _numIndices); } @@ -3170,11 +3211,13 @@ namespace bgfx BGFX_API_FUNC(void setVertexBuffer(VertexBufferHandle _handle, uint32_t _startVertex, uint32_t _numVertices) ) { + BGFX_CHECK_HANDLE("setVertexBuffer", m_vertexBufferHandle, _handle); m_submit->setVertexBuffer(_handle, _startVertex, _numVertices); } BGFX_API_FUNC(void setVertexBuffer(DynamicVertexBufferHandle _handle, uint32_t _numVertices) ) { + BGFX_CHECK_HANDLE("setVertexBuffer", m_dynamicVertexBufferHandle, _handle); m_submit->setVertexBuffer(m_dynamicVertexBuffers[_handle.idx], _numVertices); } @@ -3192,12 +3235,14 @@ namespace bgfx BGFX_API_FUNC(void setInstanceDataBuffer(VertexBufferHandle _handle, uint32_t _startVertex, uint32_t _num) ) { + BGFX_CHECK_HANDLE("setInstanceDataBuffer", m_vertexBufferHandle, _handle); const VertexBuffer& vb = m_vertexBuffers[_handle.idx]; m_submit->setInstanceDataBuffer(_handle, _startVertex, _num, vb.m_stride); } BGFX_API_FUNC(void setInstanceDataBuffer(DynamicVertexBufferHandle _handle, uint32_t _startVertex, uint32_t _num) ) { + BGFX_CHECK_HANDLE("setInstanceDataBuffer", m_dynamicVertexBufferHandle, _handle); const DynamicVertexBuffer& dvb = m_dynamicVertexBuffers[_handle.idx]; m_submit->setInstanceDataBuffer(dvb.m_handle , dvb.m_startVertex + _startVertex @@ -3208,11 +3253,13 @@ namespace bgfx BGFX_API_FUNC(void setProgram(ProgramHandle _handle) ) { + BGFX_CHECK_HANDLE("setProgram", m_programHandle, _handle); m_submit->setProgram(_handle); } BGFX_API_FUNC(void setTexture(uint8_t _stage, UniformHandle _sampler, TextureHandle _handle, uint32_t _flags) ) { + BGFX_CHECK_HANDLE("setTexture", m_textureHandle, _handle); m_submit->setTexture(_stage, _sampler, _handle, _flags); } @@ -3238,22 +3285,26 @@ namespace bgfx BGFX_API_FUNC(void setBuffer(uint8_t _stage, IndexBufferHandle _handle, Access::Enum _access) ) { + BGFX_CHECK_HANDLE("setBuffer", m_indexBufferHandle, _handle); m_submit->setBuffer(_stage, _handle, _access); } BGFX_API_FUNC(void setBuffer(uint8_t _stage, VertexBufferHandle _handle, Access::Enum _access) ) { + BGFX_CHECK_HANDLE("setBuffer", m_vertexBufferHandle, _handle); m_submit->setBuffer(_stage, _handle, _access); } BGFX_API_FUNC(void setBuffer(uint8_t _stage, DynamicIndexBufferHandle _handle, Access::Enum _access) ) { + BGFX_CHECK_HANDLE("setBuffer", m_dynamicIndexBufferHandle, _handle); const DynamicIndexBuffer& dib = m_dynamicIndexBuffers[_handle.idx]; m_submit->setBuffer(_stage, dib.m_handle, _access); } BGFX_API_FUNC(void setBuffer(uint8_t _stage, DynamicVertexBufferHandle _handle, Access::Enum _access) ) { + BGFX_CHECK_HANDLE("setBuffer", m_dynamicVertexBufferHandle, _handle); const DynamicVertexBuffer& dvb = m_dynamicVertexBuffers[_handle.idx]; m_submit->setBuffer(_stage, dvb.m_handle, _access); } diff --git a/3rdparty/bgfx/src/glcontext_eagl.h b/3rdparty/bgfx/src/glcontext_eagl.h index 9c6775d8df2..5c26a71f2a4 100644 --- a/3rdparty/bgfx/src/glcontext_eagl.h +++ b/3rdparty/bgfx/src/glcontext_eagl.h @@ -8,7 +8,7 @@ #if BX_PLATFORM_IOS -namespace bgfx +namespace bgfx { namespace gl { struct SwapChainGL; @@ -48,7 +48,7 @@ namespace bgfx GLuint m_colorRbo; GLuint m_depthStencilRbo; }; -} // namespace bgfx +} /* namespace gl */ } // namespace bgfx #endif // BX_PLATFORM_IOS diff --git a/3rdparty/bgfx/src/glcontext_eagl.mm b/3rdparty/bgfx/src/glcontext_eagl.mm index 4a10d43fd92..4348eb65178 100644 --- a/3rdparty/bgfx/src/glcontext_eagl.mm +++ b/3rdparty/bgfx/src/glcontext_eagl.mm @@ -10,7 +10,7 @@ # include # include "renderer_gl.h" -namespace bgfx +namespace bgfx { namespace gl { # define GL_IMPORT(_optional, _proto, _func, _import) _proto _func = NULL # include "glimports.h" @@ -123,6 +123,6 @@ namespace bgfx { } -} // namespace bgfx +} /* namespace gl */ } // namespace bgfx #endif // BX_PLATFORM_IOS && (BGFX_CONFIG_RENDERER_OPENGLES2|BGFX_CONFIG_RENDERER_OPENGLES3|BGFX_CONFIG_RENDERER_OPENGL) diff --git a/3rdparty/bgfx/src/glcontext_egl.cpp b/3rdparty/bgfx/src/glcontext_egl.cpp index 1a70e37b720..a3fe4e77c80 100644 --- a/3rdparty/bgfx/src/glcontext_egl.cpp +++ b/3rdparty/bgfx/src/glcontext_egl.cpp @@ -22,7 +22,7 @@ # define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB #endif // EGL_CONTEXT_MINOR_VERSION_KHR -namespace bgfx +namespace bgfx { namespace gl { #if BGFX_USE_GL_DYNAMIC_LIB @@ -369,7 +369,7 @@ EGL_IMPORT # include "glimports.h" } -} // namespace bgfx +} /* namespace gl */ } // namespace bgfx # endif // BGFX_USE_EGL #endif // (BGFX_CONFIG_RENDERER_OPENGLES || BGFX_CONFIG_RENDERER_OPENGL) diff --git a/3rdparty/bgfx/src/glcontext_egl.h b/3rdparty/bgfx/src/glcontext_egl.h index 98fd63f7928..122591ca832 100644 --- a/3rdparty/bgfx/src/glcontext_egl.h +++ b/3rdparty/bgfx/src/glcontext_egl.h @@ -10,7 +10,7 @@ #include -namespace bgfx +namespace bgfx { namespace gl { struct SwapChainGL; @@ -48,7 +48,7 @@ namespace bgfx EGLDisplay m_display; EGLSurface m_surface; }; -} // namespace bgfx +} /* namespace gl */ } // namespace bgfx #endif // BGFX_USE_EGL diff --git a/3rdparty/bgfx/src/glcontext_glx.cpp b/3rdparty/bgfx/src/glcontext_glx.cpp index af40d2d9413..13a91de7daf 100644 --- a/3rdparty/bgfx/src/glcontext_glx.cpp +++ b/3rdparty/bgfx/src/glcontext_glx.cpp @@ -12,7 +12,7 @@ # define GLX_GLXEXT_PROTOTYPES # include -namespace bgfx +namespace bgfx { namespace gl { typedef int (*PFNGLXSWAPINTERVALMESAPROC)(uint32_t _interval); @@ -55,122 +55,128 @@ namespace bgfx void GlContext::create(uint32_t _width, uint32_t _height) { BX_UNUSED(_width, _height); - XLockDisplay( (::Display*)g_bgfxX11Display); - int major, minor; - bool version = glXQueryVersion( (::Display*)g_bgfxX11Display, &major, &minor); - BGFX_FATAL(version, Fatal::UnableToInitialize, "Failed to query GLX version"); - BGFX_FATAL( (major == 1 && minor >= 2) || major > 1 - , Fatal::UnableToInitialize - , "GLX version is not >=1.2 (%d.%d)." - , major - , minor - ); + m_context = (GLXContext)g_bgfxGLX; - int32_t screen = DefaultScreen( (::Display*)g_bgfxX11Display); - - const char* extensions = glXQueryExtensionsString( (::Display*)g_bgfxX11Display, screen); - BX_TRACE("GLX extensions:"); - dumpExtensions(extensions); - - const int attrsGlx[] = + if (NULL == g_bgfxGLX) { - GLX_RENDER_TYPE, GLX_RGBA_BIT, - GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, - GLX_DOUBLEBUFFER, true, - GLX_RED_SIZE, 8, - GLX_BLUE_SIZE, 8, - GLX_GREEN_SIZE, 8, -// GLX_ALPHA_SIZE, 8, - GLX_DEPTH_SIZE, 24, - GLX_STENCIL_SIZE, 8, - 0, - }; + XLockDisplay( (::Display*)g_bgfxX11Display); - // Find suitable config - GLXFBConfig bestConfig = NULL; + int major, minor; + bool version = glXQueryVersion( (::Display*)g_bgfxX11Display, &major, &minor); + BGFX_FATAL(version, Fatal::UnableToInitialize, "Failed to query GLX version"); + BGFX_FATAL( (major == 1 && minor >= 2) || major > 1 + , Fatal::UnableToInitialize + , "GLX version is not >=1.2 (%d.%d)." + , major + , minor + ); - int numConfigs; - GLXFBConfig* configs = glXChooseFBConfig( (::Display*)g_bgfxX11Display, screen, attrsGlx, &numConfigs); + int32_t screen = DefaultScreen( (::Display*)g_bgfxX11Display); - BX_TRACE("glX num configs %d", numConfigs); + const char* extensions = glXQueryExtensionsString( (::Display*)g_bgfxX11Display, screen); + BX_TRACE("GLX extensions:"); + dumpExtensions(extensions); - for (int ii = 0; ii < numConfigs; ++ii) - { - m_visualInfo = glXGetVisualFromFBConfig( (::Display*)g_bgfxX11Display, configs[ii]); - if (NULL != m_visualInfo) + const int attrsGlx[] = { - BX_TRACE("---"); - bool valid = true; - for (uint32_t attr = 6; attr < BX_COUNTOF(attrsGlx)-1 && attrsGlx[attr] != None; attr += 2) - { - int value; - glXGetFBConfigAttrib( (::Display*)g_bgfxX11Display, configs[ii], attrsGlx[attr], &value); - BX_TRACE("glX %d/%d %2d: %4x, %8x (%8x%s)" - , ii - , numConfigs - , attr/2 - , attrsGlx[attr] - , value - , attrsGlx[attr + 1] - , value < attrsGlx[attr + 1] ? " *" : "" - ); - - if (value < attrsGlx[attr + 1]) - { - valid = false; -#if !BGFX_CONFIG_DEBUG - break; -#endif // BGFX_CONFIG_DEBUG - } - } - - if (valid) - { - bestConfig = configs[ii]; - BX_TRACE("Best config %d.", ii); - break; - } - } - - XFree(m_visualInfo); - m_visualInfo = NULL; - } - - XFree(configs); - BGFX_FATAL(m_visualInfo, Fatal::UnableToInitialize, "Failed to find a suitable X11 display configuration."); - - BX_TRACE("Create GL 2.1 context."); - m_context = glXCreateContext( (::Display*)g_bgfxX11Display, m_visualInfo, 0, GL_TRUE); - BGFX_FATAL(NULL != m_context, Fatal::UnableToInitialize, "Failed to create GL 2.1 context."); - -#if BGFX_CONFIG_RENDERER_OPENGL >= 31 - glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)glXGetProcAddress( (const GLubyte*)"glXCreateContextAttribsARB"); - - if (NULL != glXCreateContextAttribsARB) - { - BX_TRACE("Create GL 3.1 context."); - const int contextAttrs[] = - { - GLX_CONTEXT_MAJOR_VERSION_ARB, 3, - GLX_CONTEXT_MINOR_VERSION_ARB, 1, - GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, + GLX_RENDER_TYPE, GLX_RGBA_BIT, + GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT, + GLX_DOUBLEBUFFER, true, + GLX_RED_SIZE, 8, + GLX_BLUE_SIZE, 8, + GLX_GREEN_SIZE, 8, + // GLX_ALPHA_SIZE, 8, + GLX_DEPTH_SIZE, 24, + GLX_STENCIL_SIZE, 8, 0, }; - GLXContext context = glXCreateContextAttribsARB( (::Display*)g_bgfxX11Display, bestConfig, 0, true, contextAttrs); + // Find suitable config + GLXFBConfig bestConfig = NULL; - if (NULL != context) + int numConfigs; + GLXFBConfig* configs = glXChooseFBConfig( (::Display*)g_bgfxX11Display, screen, attrsGlx, &numConfigs); + + BX_TRACE("glX num configs %d", numConfigs); + + for (int ii = 0; ii < numConfigs; ++ii) { - glXDestroyContext( (::Display*)g_bgfxX11Display, m_context); - m_context = context; + m_visualInfo = glXGetVisualFromFBConfig( (::Display*)g_bgfxX11Display, configs[ii]); + if (NULL != m_visualInfo) + { + BX_TRACE("---"); + bool valid = true; + for (uint32_t attr = 6; attr < BX_COUNTOF(attrsGlx)-1 && attrsGlx[attr] != None; attr += 2) + { + int value; + glXGetFBConfigAttrib( (::Display*)g_bgfxX11Display, configs[ii], attrsGlx[attr], &value); + BX_TRACE("glX %d/%d %2d: %4x, %8x (%8x%s)" + , ii + , numConfigs + , attr/2 + , attrsGlx[attr] + , value + , attrsGlx[attr + 1] + , value < attrsGlx[attr + 1] ? " *" : "" + ); + + if (value < attrsGlx[attr + 1]) + { + valid = false; +#if !BGFX_CONFIG_DEBUG + break; +#endif // BGFX_CONFIG_DEBUG + } + } + + if (valid) + { + bestConfig = configs[ii]; + BX_TRACE("Best config %d.", ii); + break; + } + } + + XFree(m_visualInfo); + m_visualInfo = NULL; + } + + XFree(configs); + BGFX_FATAL(m_visualInfo, Fatal::UnableToInitialize, "Failed to find a suitable X11 display configuration."); + + BX_TRACE("Create GL 2.1 context."); + m_context = glXCreateContext( (::Display*)g_bgfxX11Display, m_visualInfo, 0, GL_TRUE); + BGFX_FATAL(NULL != m_context, Fatal::UnableToInitialize, "Failed to create GL 2.1 context."); + +#if BGFX_CONFIG_RENDERER_OPENGL >= 31 + glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC)glXGetProcAddress( (const GLubyte*)"glXCreateContextAttribsARB"); + + if (NULL != glXCreateContextAttribsARB) + { + BX_TRACE("Create GL 3.1 context."); + const int contextAttrs[] = + { + GLX_CONTEXT_MAJOR_VERSION_ARB, 3, + GLX_CONTEXT_MINOR_VERSION_ARB, 1, + GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, + 0, + }; + + GLXContext context = glXCreateContextAttribsARB( (::Display*)g_bgfxX11Display, bestConfig, 0, true, contextAttrs); + + if (NULL != context) + { + glXDestroyContext( (::Display*)g_bgfxX11Display, m_context); + m_context = context; + } } - } #else - BX_UNUSED(bestConfig); + BX_UNUSED(bestConfig); #endif // BGFX_CONFIG_RENDERER_OPENGL >= 31 - XUnlockDisplay( (::Display*)g_bgfxX11Display); + XUnlockDisplay( (::Display*)g_bgfxX11Display); + } import(); @@ -210,8 +216,13 @@ namespace bgfx void GlContext::destroy() { glXMakeCurrent( (::Display*)g_bgfxX11Display, 0, 0); - glXDestroyContext( (::Display*)g_bgfxX11Display, m_context); - XFree(m_visualInfo); + if (NULL == g_bgfxGLX) + { + glXDestroyContext( (::Display*)g_bgfxX11Display, m_context); + XFree(m_visualInfo); + } + m_context = NULL; + m_visualInfo = NULL; } void GlContext::resize(uint32_t /*_width*/, uint32_t /*_height*/, bool _vsync) @@ -292,7 +303,7 @@ namespace bgfx # include "glimports.h" } -} // namespace bgfx +} /* namespace gl */ } // namespace bgfx # endif // BGFX_USE_GLX diff --git a/3rdparty/bgfx/src/glcontext_glx.h b/3rdparty/bgfx/src/glcontext_glx.h index 3fa7dbf2a64..cff6faa16a6 100644 --- a/3rdparty/bgfx/src/glcontext_glx.h +++ b/3rdparty/bgfx/src/glcontext_glx.h @@ -11,7 +11,7 @@ # include # include -namespace bgfx +namespace bgfx { namespace gl { struct SwapChainGL; @@ -45,7 +45,7 @@ namespace bgfx GLXContext m_context; XVisualInfo* m_visualInfo; }; -} // namespace bgfx +} /* namespace gl */ } // namespace bgfx #endif // BGFX_USE_GLX diff --git a/3rdparty/bgfx/src/glcontext_nsgl.h b/3rdparty/bgfx/src/glcontext_nsgl.h index cde844df0a6..c88673d8fe6 100644 --- a/3rdparty/bgfx/src/glcontext_nsgl.h +++ b/3rdparty/bgfx/src/glcontext_nsgl.h @@ -8,7 +8,7 @@ #if BX_PLATFORM_OSX -namespace bgfx +namespace bgfx { namespace gl { struct SwapChainGL; @@ -39,7 +39,7 @@ namespace bgfx void* m_view; void* m_context; }; -} // namespace bgfx +} /* namespace gl */ } // namespace bgfx #endif // BX_PLATFORM_OSX diff --git a/3rdparty/bgfx/src/glcontext_nsgl.mm b/3rdparty/bgfx/src/glcontext_nsgl.mm index 70630a08456..667fdf4f0b3 100644 --- a/3rdparty/bgfx/src/glcontext_nsgl.mm +++ b/3rdparty/bgfx/src/glcontext_nsgl.mm @@ -10,7 +10,7 @@ # include # include -namespace bgfx +namespace bgfx { namespace gl { # define GL_IMPORT(_optional, _proto, _func, _import) _proto _func @@ -35,7 +35,7 @@ namespace bgfx { } }; - + static void* s_opengl = NULL; void GlContext::create(uint32_t _width, uint32_t _height) @@ -46,56 +46,63 @@ namespace bgfx BX_CHECK(NULL != s_opengl, "OpenGL dynamic library is not found!"); NSWindow* nsWindow = (NSWindow*)g_bgfxNSWindow; + m_context = g_bgfxNSGL; - NSOpenGLPixelFormatAttribute profile = + if (NULL == g_bgfxNSGL) + { + NSOpenGLPixelFormatAttribute profile = #if BGFX_CONFIG_RENDERER_OPENGL >= 31 - NSOpenGLProfileVersion3_2Core + NSOpenGLProfileVersion3_2Core #else - NSOpenGLProfileVersionLegacy + NSOpenGLProfileVersionLegacy #endif // BGFX_CONFIG_RENDERER_OPENGL >= 31 - ; + ; - NSOpenGLPixelFormatAttribute pixelFormatAttributes[] = { - NSOpenGLPFAOpenGLProfile, profile, - NSOpenGLPFAColorSize, 24, - NSOpenGLPFAAlphaSize, 8, - NSOpenGLPFADepthSize, 24, - NSOpenGLPFAStencilSize, 8, - NSOpenGLPFADoubleBuffer, true, - NSOpenGLPFAAccelerated, true, - NSOpenGLPFANoRecovery, true, - 0, 0, - }; + NSOpenGLPixelFormatAttribute pixelFormatAttributes[] = { + NSOpenGLPFAOpenGLProfile, profile, + NSOpenGLPFAColorSize, 24, + NSOpenGLPFAAlphaSize, 8, + NSOpenGLPFADepthSize, 24, + NSOpenGLPFAStencilSize, 8, + NSOpenGLPFADoubleBuffer, true, + NSOpenGLPFAAccelerated, true, + NSOpenGLPFANoRecovery, true, + 0, 0, + }; - NSOpenGLPixelFormat* pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:pixelFormatAttributes]; - BGFX_FATAL(NULL != pixelFormat, Fatal::UnableToInitialize, "Failed to initialize pixel format."); + NSOpenGLPixelFormat* pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:pixelFormatAttributes]; + BGFX_FATAL(NULL != pixelFormat, Fatal::UnableToInitialize, "Failed to initialize pixel format."); - NSRect glViewRect = [[nsWindow contentView] bounds]; - NSOpenGLView* glView = [[NSOpenGLView alloc] initWithFrame:glViewRect pixelFormat:pixelFormat]; - - [pixelFormat release]; - [nsWindow setContentView:glView]; - - NSOpenGLContext* glContext = [glView openGLContext]; - BGFX_FATAL(NULL != glContext, Fatal::UnableToInitialize, "Failed to initialize GL context."); + NSRect glViewRect = [[nsWindow contentView] bounds]; + NSOpenGLView* glView = [[NSOpenGLView alloc] initWithFrame:glViewRect pixelFormat:pixelFormat]; - [glContext makeCurrentContext]; - GLint interval = 0; - [glContext setValues:&interval forParameter:NSOpenGLCPSwapInterval]; - - m_view = glView; - m_context = glContext; + [pixelFormat release]; + [nsWindow setContentView:glView]; + + NSOpenGLContext* glContext = [glView openGLContext]; + BGFX_FATAL(NULL != glContext, Fatal::UnableToInitialize, "Failed to initialize GL context."); + + [glContext makeCurrentContext]; + GLint interval = 0; + [glContext setValues:&interval forParameter:NSOpenGLCPSwapInterval]; + + m_view = glView; + m_context = glContext; + } import(); } void GlContext::destroy() { - NSOpenGLView* glView = (NSOpenGLView*)m_view; - m_view = 0; - m_context = 0; - [glView release]; + if (NULL == g_bgfxNSGL) + { + NSOpenGLView* glView = (NSOpenGLView*)m_view; + [glView release]; + } + m_view = 0; + m_context = 0; bx::dlclose(s_opengl); } @@ -165,6 +172,6 @@ namespace bgfx # include "glimports.h" } -} // namespace bgfx +} /* namespace gl */ } // namespace bgfx #endif // BX_PLATFORM_OSX && (BGFX_CONFIG_RENDERER_OPENGLES2|BGFX_CONFIG_RENDERER_OPENGLES3|BGFX_CONFIG_RENDERER_OPENGL) diff --git a/3rdparty/bgfx/src/glcontext_ppapi.cpp b/3rdparty/bgfx/src/glcontext_ppapi.cpp index f22228e04e6..3910e7a13ee 100644 --- a/3rdparty/bgfx/src/glcontext_ppapi.cpp +++ b/3rdparty/bgfx/src/glcontext_ppapi.cpp @@ -9,14 +9,14 @@ # include # include "renderer_gl.h" -namespace bgfx +namespace bgfx { namespace gl { # define GL_IMPORT(_optional, _proto, _func, _import) _proto _func # include "glimports.h" void naclSwapCompleteCb(void* /*_data*/, int32_t /*_result*/); - PP_CompletionCallback naclSwapComplete = + PP_CompletionCallback naclSwapComplete = { naclSwapCompleteCb, NULL, @@ -62,7 +62,7 @@ namespace bgfx PostSwapBuffersFn m_postSwapBuffers; bool m_forceSwap; }; - + static Ppapi s_ppapi; void naclSwapCompleteCb(void* /*_data*/, int32_t /*_result*/) @@ -95,11 +95,6 @@ namespace bgfx s_ppapi.m_instancedArrays->DrawElementsInstancedANGLE(s_ppapi.m_context, _mode, _count, _type, _indices, _primcount); } - bool naclSetInterfaces(PP_Instance _instance, const PPB_Instance* _instInterface, const PPB_Graphics3D* _graphicsInterface, PostSwapBuffersFn _postSwapBuffers) - { - return s_ppapi.setInterfaces( _instance, _instInterface, _graphicsInterface, _postSwapBuffers); - } - bool Ppapi::setInterfaces(PP_Instance _instance, const PPB_Instance* _instInterface, const PPB_Graphics3D* _graphicsInterface, PostSwapBuffersFn _postSwapBuffers) { BX_TRACE("PPAPI Interfaces"); @@ -192,6 +187,14 @@ namespace bgfx return s_ppapi.isValid(); } +} /* namespace gl */ } // namespace bgfx + +namespace bgfx +{ + bool naclSetInterfaces(PP_Instance _instance, const PPB_Instance* _instInterface, const PPB_Graphics3D* _graphicsInterface, PostSwapBuffersFn _postSwapBuffers) + { + return gl::s_ppapi.setInterfaces( _instance, _instInterface, _graphicsInterface, _postSwapBuffers); + } } // namespace bgfx #endif // BX_PLATFORM_NACL && (BGFX_CONFIG_RENDERER_OPENGLES || BGFX_CONFIG_RENDERER_OPENGL) diff --git a/3rdparty/bgfx/src/glcontext_ppapi.h b/3rdparty/bgfx/src/glcontext_ppapi.h index e3acc876803..3142b6acdf5 100644 --- a/3rdparty/bgfx/src/glcontext_ppapi.h +++ b/3rdparty/bgfx/src/glcontext_ppapi.h @@ -13,7 +13,7 @@ # include # include -namespace bgfx +namespace bgfx { namespace gl { struct SwapChainGL; @@ -36,7 +36,7 @@ namespace bgfx void import(); bool isValid() const; }; -} // namespace bgfx +} /* namespace gl */ } // namespace bgfx #endif // BX_PLATFORM_NACL diff --git a/3rdparty/bgfx/src/glcontext_wgl.cpp b/3rdparty/bgfx/src/glcontext_wgl.cpp index 56aad127514..84c32a06633 100644 --- a/3rdparty/bgfx/src/glcontext_wgl.cpp +++ b/3rdparty/bgfx/src/glcontext_wgl.cpp @@ -10,7 +10,7 @@ # if BGFX_USE_WGL -namespace bgfx +namespace bgfx { namespace gl { PFNWGLGETPROCADDRESSPROC wglGetProcAddress; PFNWGLMAKECURRENTPROC wglMakeCurrent; @@ -376,7 +376,7 @@ namespace bgfx # include "glimports.h" } -} // namespace bgfx +} } // namespace bgfx # endif // BGFX_USE_WGL #endif // (BGFX_CONFIG_RENDERER_OPENGLES|BGFX_CONFIG_RENDERER_OPENGL) diff --git a/3rdparty/bgfx/src/glcontext_wgl.h b/3rdparty/bgfx/src/glcontext_wgl.h index 4d0f64fb281..98338f09410 100644 --- a/3rdparty/bgfx/src/glcontext_wgl.h +++ b/3rdparty/bgfx/src/glcontext_wgl.h @@ -10,7 +10,7 @@ #include -namespace bgfx +namespace bgfx { namespace gl { typedef PROC (APIENTRYP PFNWGLGETPROCADDRESSPROC) (LPCSTR lpszProc); typedef BOOL (APIENTRYP PFNWGLMAKECURRENTPROC) (HDC hdc, HGLRC hglrc); @@ -93,7 +93,7 @@ typedef void (APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum z HGLRC m_context; HDC m_hdc; }; -} // namespace bgfx +} /* namespace gl */ } // namespace bgfx #endif // BGFX_USE_WGL diff --git a/3rdparty/bgfx/src/image.cpp b/3rdparty/bgfx/src/image.cpp index c18d4e939cf..b420b2da364 100644 --- a/3rdparty/bgfx/src/image.cpp +++ b/3rdparty/bgfx/src/image.cpp @@ -1235,49 +1235,49 @@ namespace bgfx #define DDS_BC5U BX_MAKEFOURCC('B', 'C', '5', 'U') #define DDS_DX10 BX_MAKEFOURCC('D', 'X', '1', '0') -#define D3DFMT_A8R8G8B8 21 -#define D3DFMT_R5G6B5 23 -#define D3DFMT_A1R5G5B5 25 -#define D3DFMT_A4R4G4B4 26 -#define D3DFMT_A2B10G10R10 31 -#define D3DFMT_G16R16 34 -#define D3DFMT_A2R10G10B10 35 -#define D3DFMT_A16B16G16R16 36 -#define D3DFMT_A8L8 51 -#define D3DFMT_R16F 111 -#define D3DFMT_G16R16F 112 -#define D3DFMT_A16B16G16R16F 113 -#define D3DFMT_R32F 114 -#define D3DFMT_G32R32F 115 -#define D3DFMT_A32B32G32R32F 116 +#define DDS_A8R8G8B8 21 +#define DDS_R5G6B5 23 +#define DDS_A1R5G5B5 25 +#define DDS_A4R4G4B4 26 +#define DDS_A2B10G10R10 31 +#define DDS_G16R16 34 +#define DDS_A2R10G10B10 35 +#define DDS_A16B16G16R16 36 +#define DDS_A8L8 51 +#define DDS_R16F 111 +#define DDS_G16R16F 112 +#define DDS_A16B16G16R16F 113 +#define DDS_R32F 114 +#define DDS_G32R32F 115 +#define DDS_A32B32G32R32F 116 -#define DXGI_FORMAT_R32G32B32A32_FLOAT 2 -#define DXGI_FORMAT_R32G32B32A32_UINT 3 -#define DXGI_FORMAT_R16G16B16A16_FLOAT 10 -#define DXGI_FORMAT_R16G16B16A16_UNORM 11 -#define DXGI_FORMAT_R16G16B16A16_UINT 12 -#define DXGI_FORMAT_R32G32_FLOAT 16 -#define DXGI_FORMAT_R32G32_UINT 17 -#define DXGI_FORMAT_R10G10B10A2_UNORM 24 -#define DXGI_FORMAT_R16G16_FLOAT 34 -#define DXGI_FORMAT_R16G16_UNORM 35 -#define DXGI_FORMAT_R32_FLOAT 41 -#define DXGI_FORMAT_R32_UINT 42 -#define DXGI_FORMAT_R8G8_UNORM 49 -#define DXGI_FORMAT_R16_FLOAT 54 -#define DXGI_FORMAT_R16_UNORM 56 -#define DXGI_FORMAT_R8_UNORM 61 -#define DXGI_FORMAT_BC1_UNORM 71 -#define DXGI_FORMAT_BC2_UNORM 74 -#define DXGI_FORMAT_BC3_UNORM 77 -#define DXGI_FORMAT_BC4_UNORM 80 -#define DXGI_FORMAT_BC5_UNORM 83 -#define DXGI_FORMAT_B5G6R5_UNORM 85 -#define DXGI_FORMAT_B5G5R5A1_UNORM 86 -#define DXGI_FORMAT_B8G8R8A8_UNORM 87 -#define DXGI_FORMAT_BC6H_SF16 96 -#define DXGI_FORMAT_BC7_UNORM 98 -#define DXGI_FORMAT_B4G4R4A4_UNORM 115 +#define DDS_FORMAT_R32G32B32A32_FLOAT 2 +#define DDS_FORMAT_R32G32B32A32_UINT 3 +#define DDS_FORMAT_R16G16B16A16_FLOAT 10 +#define DDS_FORMAT_R16G16B16A16_UNORM 11 +#define DDS_FORMAT_R16G16B16A16_UINT 12 +#define DDS_FORMAT_R32G32_FLOAT 16 +#define DDS_FORMAT_R32G32_UINT 17 +#define DDS_FORMAT_R10G10B10A2_UNORM 24 +#define DDS_FORMAT_R16G16_FLOAT 34 +#define DDS_FORMAT_R16G16_UNORM 35 +#define DDS_FORMAT_R32_FLOAT 41 +#define DDS_FORMAT_R32_UINT 42 +#define DDS_FORMAT_R8G8_UNORM 49 +#define DDS_FORMAT_R16_FLOAT 54 +#define DDS_FORMAT_R16_UNORM 56 +#define DDS_FORMAT_R8_UNORM 61 +#define DDS_FORMAT_BC1_UNORM 71 +#define DDS_FORMAT_BC2_UNORM 74 +#define DDS_FORMAT_BC3_UNORM 77 +#define DDS_FORMAT_BC4_UNORM 80 +#define DDS_FORMAT_BC5_UNORM 83 +#define DDS_FORMAT_B5G6R5_UNORM 85 +#define DDS_FORMAT_B5G5R5A1_UNORM 86 +#define DDS_FORMAT_B8G8R8A8_UNORM 87 +#define DDS_FORMAT_BC6H_SF16 96 +#define DDS_FORMAT_BC7_UNORM 98 +#define DDS_FORMAT_B4G4R4A4_UNORM 115 #define DDSD_CAPS 0x00000001 #define DDSD_HEIGHT 0x00000002 @@ -1331,57 +1331,57 @@ namespace bgfx { DDS_BC4U, TextureFormat::BC4 }, { DDS_ATI2, TextureFormat::BC5 }, { DDS_BC5U, TextureFormat::BC5 }, - { D3DFMT_A16B16G16R16, TextureFormat::RGBA16 }, - { D3DFMT_A16B16G16R16F, TextureFormat::RGBA16F }, + { DDS_A16B16G16R16, TextureFormat::RGBA16 }, + { DDS_A16B16G16R16F, TextureFormat::RGBA16F }, { DDPF_RGB|DDPF_ALPHAPIXELS, TextureFormat::BGRA8 }, { DDPF_INDEXED, TextureFormat::R8 }, { DDPF_LUMINANCE, TextureFormat::R8 }, { DDPF_ALPHA, TextureFormat::R8 }, - { D3DFMT_R16F, TextureFormat::R16F }, - { D3DFMT_R32F, TextureFormat::R32F }, - { D3DFMT_A8L8, TextureFormat::RG8 }, - { D3DFMT_G16R16, TextureFormat::RG16 }, - { D3DFMT_G16R16F, TextureFormat::RG16F }, - { D3DFMT_G32R32F, TextureFormat::RG32F }, - { D3DFMT_A8R8G8B8, TextureFormat::BGRA8 }, - { D3DFMT_A16B16G16R16, TextureFormat::RGBA16 }, - { D3DFMT_A16B16G16R16F, TextureFormat::RGBA16F }, - { D3DFMT_A32B32G32R32F, TextureFormat::RGBA32F }, - { D3DFMT_R5G6B5, TextureFormat::R5G6B5 }, - { D3DFMT_A4R4G4B4, TextureFormat::RGBA4 }, - { D3DFMT_A1R5G5B5, TextureFormat::RGB5A1 }, - { D3DFMT_A2B10G10R10, TextureFormat::RGB10A2 }, + { DDS_R16F, TextureFormat::R16F }, + { DDS_R32F, TextureFormat::R32F }, + { DDS_A8L8, TextureFormat::RG8 }, + { DDS_G16R16, TextureFormat::RG16 }, + { DDS_G16R16F, TextureFormat::RG16F }, + { DDS_G32R32F, TextureFormat::RG32F }, + { DDS_A8R8G8B8, TextureFormat::BGRA8 }, + { DDS_A16B16G16R16, TextureFormat::RGBA16 }, + { DDS_A16B16G16R16F, TextureFormat::RGBA16F }, + { DDS_A32B32G32R32F, TextureFormat::RGBA32F }, + { DDS_R5G6B5, TextureFormat::R5G6B5 }, + { DDS_A4R4G4B4, TextureFormat::RGBA4 }, + { DDS_A1R5G5B5, TextureFormat::RGB5A1 }, + { DDS_A2B10G10R10, TextureFormat::RGB10A2 }, }; static TranslateDdsFormat s_translateDxgiFormat[] = { - { DXGI_FORMAT_BC1_UNORM, TextureFormat::BC1 }, - { DXGI_FORMAT_BC2_UNORM, TextureFormat::BC2 }, - { DXGI_FORMAT_BC3_UNORM, TextureFormat::BC3 }, - { DXGI_FORMAT_BC4_UNORM, TextureFormat::BC4 }, - { DXGI_FORMAT_BC5_UNORM, TextureFormat::BC5 }, - { DXGI_FORMAT_BC6H_SF16, TextureFormat::BC6H }, - { DXGI_FORMAT_BC7_UNORM, TextureFormat::BC7 }, + { DDS_FORMAT_BC1_UNORM, TextureFormat::BC1 }, + { DDS_FORMAT_BC2_UNORM, TextureFormat::BC2 }, + { DDS_FORMAT_BC3_UNORM, TextureFormat::BC3 }, + { DDS_FORMAT_BC4_UNORM, TextureFormat::BC4 }, + { DDS_FORMAT_BC5_UNORM, TextureFormat::BC5 }, + { DDS_FORMAT_BC6H_SF16, TextureFormat::BC6H }, + { DDS_FORMAT_BC7_UNORM, TextureFormat::BC7 }, - { DXGI_FORMAT_R8_UNORM, TextureFormat::R8 }, - { DXGI_FORMAT_R16_UNORM, TextureFormat::R16 }, - { DXGI_FORMAT_R16_FLOAT, TextureFormat::R16F }, - { DXGI_FORMAT_R32_UINT, TextureFormat::R32 }, - { DXGI_FORMAT_R32_FLOAT, TextureFormat::R32F }, - { DXGI_FORMAT_R8G8_UNORM, TextureFormat::RG8 }, - { DXGI_FORMAT_R16G16_UNORM, TextureFormat::RG16 }, - { DXGI_FORMAT_R16G16_FLOAT, TextureFormat::RG16F }, - { DXGI_FORMAT_R32G32_UINT, TextureFormat::RG32 }, - { DXGI_FORMAT_R32G32_FLOAT, TextureFormat::RG32F }, - { DXGI_FORMAT_B8G8R8A8_UNORM, TextureFormat::BGRA8 }, - { DXGI_FORMAT_R16G16B16A16_UNORM, TextureFormat::RGBA16 }, - { DXGI_FORMAT_R16G16B16A16_FLOAT, TextureFormat::RGBA16F }, - { DXGI_FORMAT_R32G32B32A32_UINT, TextureFormat::RGBA32 }, - { DXGI_FORMAT_R32G32B32A32_FLOAT, TextureFormat::RGBA32F }, - { DXGI_FORMAT_B5G6R5_UNORM, TextureFormat::R5G6B5 }, - { DXGI_FORMAT_B4G4R4A4_UNORM, TextureFormat::RGBA4 }, - { DXGI_FORMAT_B5G5R5A1_UNORM, TextureFormat::RGB5A1 }, - { DXGI_FORMAT_R10G10B10A2_UNORM, TextureFormat::RGB10A2 }, + { DDS_FORMAT_R8_UNORM, TextureFormat::R8 }, + { DDS_FORMAT_R16_UNORM, TextureFormat::R16 }, + { DDS_FORMAT_R16_FLOAT, TextureFormat::R16F }, + { DDS_FORMAT_R32_UINT, TextureFormat::R32 }, + { DDS_FORMAT_R32_FLOAT, TextureFormat::R32F }, + { DDS_FORMAT_R8G8_UNORM, TextureFormat::RG8 }, + { DDS_FORMAT_R16G16_UNORM, TextureFormat::RG16 }, + { DDS_FORMAT_R16G16_FLOAT, TextureFormat::RG16F }, + { DDS_FORMAT_R32G32_UINT, TextureFormat::RG32 }, + { DDS_FORMAT_R32G32_FLOAT, TextureFormat::RG32F }, + { DDS_FORMAT_B8G8R8A8_UNORM, TextureFormat::BGRA8 }, + { DDS_FORMAT_R16G16B16A16_UNORM, TextureFormat::RGBA16 }, + { DDS_FORMAT_R16G16B16A16_FLOAT, TextureFormat::RGBA16F }, + { DDS_FORMAT_R32G32B32A32_UINT, TextureFormat::RGBA32 }, + { DDS_FORMAT_R32G32B32A32_FLOAT, TextureFormat::RGBA32F }, + { DDS_FORMAT_B5G6R5_UNORM, TextureFormat::R5G6B5 }, + { DDS_FORMAT_B4G4R4A4_UNORM, TextureFormat::RGBA4 }, + { DDS_FORMAT_B5G5R5A1_UNORM, TextureFormat::RGB5A1 }, + { DDS_FORMAT_R10G10B10A2_UNORM, TextureFormat::RGB10A2 }, }; struct TranslateDdsPixelFormat diff --git a/3rdparty/bgfx/src/ovr.h b/3rdparty/bgfx/src/ovr.h index 331406e61bb..34373feb5e7 100644 --- a/3rdparty/bgfx/src/ovr.h +++ b/3rdparty/bgfx/src/ovr.h @@ -3,6 +3,9 @@ * License: http://www.opensource.org/licenses/BSD-2-Clause */ +#ifndef BGFX_OVR_H_HEADER_GUARD +#define BGFX_OVR_H_HEADER_GUARD + #include "bgfx_p.h" #if BGFX_CONFIG_USE_OVR @@ -146,3 +149,5 @@ namespace bgfx } // namespace bgfx #endif // BGFX_CONFIG_USE_OVR + +#endif // BGFX_OVR_H_HEADER_GUARD diff --git a/3rdparty/bgfx/src/renderdoc.h b/3rdparty/bgfx/src/renderdoc.h index e52a030cd8b..9a7e6eb0225 100644 --- a/3rdparty/bgfx/src/renderdoc.h +++ b/3rdparty/bgfx/src/renderdoc.h @@ -3,9 +3,14 @@ * License: http://www.opensource.org/licenses/BSD-2-Clause */ +#ifndef BGFX_RENDERDOC_H_HEADER_GUARD +#define BGFX_RENDERDOC_H_HEADER_GUARD + namespace bgfx { void* loadRenderDoc(); void unloadRenderDoc(void*); } // namespace bgfx + +#endif // BGFX_RENDERDOC_H_HEADER_GUARD diff --git a/3rdparty/bgfx/src/renderer.h b/3rdparty/bgfx/src/renderer.h index 95e0762aa83..738f5988e56 100644 --- a/3rdparty/bgfx/src/renderer.h +++ b/3rdparty/bgfx/src/renderer.h @@ -3,6 +3,9 @@ * License: http://www.opensource.org/licenses/BSD-2-Clause */ +#ifndef BGFX_RENDERER_H_HEADER_GUARD +#define BGFX_RENDERER_H_HEADER_GUARD + #include "bgfx_p.h" namespace bgfx @@ -262,3 +265,5 @@ namespace bgfx }; } // namespace bgfx + +#endif // BGFX_RENDERER_H_HEADER_GUARD diff --git a/3rdparty/bgfx/src/renderer_d3d11.cpp b/3rdparty/bgfx/src/renderer_d3d11.cpp index 1ccaeffd290..7f840dc0fd4 100644 --- a/3rdparty/bgfx/src/renderer_d3d11.cpp +++ b/3rdparty/bgfx/src/renderer_d3d11.cpp @@ -8,7 +8,7 @@ #if BGFX_CONFIG_RENDERER_DIRECT3D11 # include "renderer_d3d11.h" -namespace bgfx +namespace bgfx { namespace d3d11 { static wchar_t s_viewNameW[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME]; @@ -2299,14 +2299,14 @@ namespace bgfx static RendererContextD3D11* s_renderD3D11; - RendererContextI* rendererCreateD3D11() + RendererContextI* rendererCreate() { s_renderD3D11 = BX_NEW(g_allocator, RendererContextD3D11); s_renderD3D11->init(); return s_renderD3D11; } - void rendererDestroyD3D11() + void rendererDestroy() { s_renderD3D11->shutdown(); BX_DELETE(g_allocator, s_renderD3D11); @@ -3839,20 +3839,20 @@ namespace bgfx PIX_ENDEVENT(); } } -} // namespace bgfx +} /* namespace d3d11 */ } // namespace bgfx #else -namespace bgfx +namespace bgfx { namespace d3d11 { - RendererContextI* rendererCreateD3D11() + RendererContextI* rendererCreate() { return NULL; } - void rendererDestroyD3D11() + void rendererDestroy() { } -} // namespace bgfx +} /* namespace d3d11 */ } // namespace bgfx #endif // BGFX_CONFIG_RENDERER_DIRECT3D11 diff --git a/3rdparty/bgfx/src/renderer_d3d11.h b/3rdparty/bgfx/src/renderer_d3d11.h index 3d485e3913d..296121ce30a 100644 --- a/3rdparty/bgfx/src/renderer_d3d11.h +++ b/3rdparty/bgfx/src/renderer_d3d11.h @@ -70,7 +70,7 @@ BX_PRAGMA_DIAGNOSTIC_POP() # define D3D11_APPEND_ALIGNED_ELEMENT UINT32_MAX #endif // D3D11_APPEND_ALIGNED_ELEMENT -namespace bgfx +namespace bgfx { namespace d3d11 { struct BufferD3D11 { @@ -280,6 +280,6 @@ namespace bgfx uint8_t m_num; }; -} // namespace bgfx +} /* namespace d3d11 */ } // namespace bgfx #endif // BGFX_RENDERER_D3D11_H_HEADER_GUARD diff --git a/3rdparty/bgfx/src/renderer_d3d12.cpp b/3rdparty/bgfx/src/renderer_d3d12.cpp index 25054230866..b41207cbc31 100644 --- a/3rdparty/bgfx/src/renderer_d3d12.cpp +++ b/3rdparty/bgfx/src/renderer_d3d12.cpp @@ -9,16 +9,16 @@ # include "../../d3d12/src/renderer_d3d12.cpp" #else -namespace bgfx +namespace bgfx { namespace d3d12 { - RendererContextI* rendererCreateD3D12() + RendererContextI* rendererCreate() { return NULL; } - void rendererDestroyD3D12() + void rendererDestroy() { } -} // namespace bgfx +} /* namespace d3d12 */ } // namespace bgfx #endif // BGFX_CONFIG_RENDERER_DIRECT3D12 diff --git a/3rdparty/bgfx/src/renderer_d3d9.cpp b/3rdparty/bgfx/src/renderer_d3d9.cpp index 8d4e362176a..d1381054cb4 100644 --- a/3rdparty/bgfx/src/renderer_d3d9.cpp +++ b/3rdparty/bgfx/src/renderer_d3d9.cpp @@ -8,7 +8,7 @@ #if BGFX_CONFIG_RENDERER_DIRECT3D9 # include "renderer_d3d9.h" -namespace bgfx +namespace bgfx { namespace d3d9 { static wchar_t s_viewNameW[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME]; @@ -1731,14 +1731,14 @@ namespace bgfx static RendererContextD3D9* s_renderD3D9; - RendererContextI* rendererCreateD3D9() + RendererContextI* rendererCreate() { s_renderD3D9 = BX_NEW(g_allocator, RendererContextD3D9); s_renderD3D9->init(); return s_renderD3D9; } - void rendererDestroyD3D9() + void rendererDestroy() { s_renderD3D9->shutdown(); BX_DELETE(g_allocator, s_renderD3D9); @@ -3460,20 +3460,20 @@ namespace bgfx device->EndScene(); } -} // namespace bgfx +} /* namespace d3d9 */ } // namespace bgfx #else -namespace bgfx +namespace bgfx { namespace d3d9 { - RendererContextI* rendererCreateD3D9() + RendererContextI* rendererCreate() { return NULL; } - void rendererDestroyD3D9() + void rendererDestroy() { } -} // namespace bgfx +} /* namespace d3d9 */ } // namespace bgfx #endif // BGFX_CONFIG_RENDERER_DIRECT3D9 diff --git a/3rdparty/bgfx/src/renderer_d3d9.h b/3rdparty/bgfx/src/renderer_d3d9.h index e32a91a18d8..5ff3762581b 100644 --- a/3rdparty/bgfx/src/renderer_d3d9.h +++ b/3rdparty/bgfx/src/renderer_d3d9.h @@ -41,7 +41,7 @@ #include "renderer.h" #include "renderer_d3d.h" -namespace bgfx +namespace bgfx { namespace d3d9 { # if defined(D3D_DISABLE_9EX) # define D3DFMT_S8_LOCKABLE D3DFORMAT( 85) @@ -386,6 +386,6 @@ namespace bgfx bool m_needResolve; }; -} // namespace bgfx +} /* namespace d3d9 */ } // namespace bgfx #endif // BGFX_RENDERER_D3D9_H_HEADER_GUARD diff --git a/3rdparty/bgfx/src/renderer_gl.cpp b/3rdparty/bgfx/src/renderer_gl.cpp index 6d4dc557175..e1ed1543177 100644 --- a/3rdparty/bgfx/src/renderer_gl.cpp +++ b/3rdparty/bgfx/src/renderer_gl.cpp @@ -10,7 +10,7 @@ # include # include -namespace bgfx +namespace bgfx { namespace gl { static char s_viewName[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME]; @@ -417,6 +417,7 @@ namespace bgfx EXT_blend_color, EXT_blend_minmax, EXT_blend_subtract, + EXT_color_buffer_half_float, EXT_compressed_ETC1_RGB8_sub_texture, EXT_debug_label, EXT_debug_marker, @@ -491,10 +492,12 @@ namespace bgfx OES_vertex_half_float, OES_vertex_type_10_10_10_2, + WEBGL_color_buffer_float, WEBGL_compressed_texture_etc1, WEBGL_compressed_texture_s3tc, WEBGL_compressed_texture_pvrtc, WEBGL_depth_texture, + WEBGL_draw_buffers, WEBKIT_EXT_texture_filter_anisotropic, WEBKIT_WEBGL_compressed_texture_s3tc, @@ -578,6 +581,7 @@ namespace bgfx { "EXT_blend_color", BGFX_CONFIG_RENDERER_OPENGL >= 31, true }, { "EXT_blend_minmax", BGFX_CONFIG_RENDERER_OPENGL >= 14, true }, { "EXT_blend_subtract", BGFX_CONFIG_RENDERER_OPENGL >= 14, true }, + { "EXT_color_buffer_half_float", false, true }, // GLES2 extension. { "EXT_compressed_ETC1_RGB8_sub_texture", false, true }, // GLES2 extension. { "EXT_debug_label", false, true }, { "EXT_debug_marker", false, true }, @@ -652,10 +656,12 @@ namespace bgfx { "OES_vertex_half_float", false, true }, { "OES_vertex_type_10_10_10_2", false, true }, + { "WEBGL_color_buffer_float", false, true }, { "WEBGL_compressed_texture_etc1", false, true }, { "WEBGL_compressed_texture_s3tc", false, true }, { "WEBGL_compressed_texture_pvrtc", false, true }, { "WEBGL_depth_texture", false, true }, + { "WEBGL_draw_buffers", false, true }, { "WEBKIT_EXT_texture_filter_anisotropic", false, true }, { "WEBKIT_WEBGL_compressed_texture_s3tc", false, true }, @@ -1294,7 +1300,8 @@ namespace bgfx if (BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGL) || BX_ENABLED(BGFX_CONFIG_RENDERER_OPENGLES >= 30) - || s_extension[Extension::EXT_draw_buffers].m_supported) + || s_extension[Extension::EXT_draw_buffers ].m_supported + || s_extension[Extension::WEBGL_draw_buffers].m_supported) { g_caps.maxFBAttachments = bx::uint32_min(glGet(GL_MAX_COLOR_ATTACHMENTS), BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS); } @@ -2579,14 +2586,14 @@ namespace bgfx RendererContextGL* s_renderGL; - RendererContextI* rendererCreateGL() + RendererContextI* rendererCreate() { s_renderGL = BX_NEW(g_allocator, RendererContextGL); s_renderGL->init(); return s_renderGL; } - void rendererDestroyGL() + void rendererDestroy() { s_renderGL->shutdown(); BX_DELETE(g_allocator, s_renderGL); @@ -2662,6 +2669,7 @@ namespace bgfx GLENUM(GL_RENDERBUFFER); GLENUM(GL_INVALID_ENUM); + GLENUM(GL_INVALID_FRAMEBUFFER_OPERATION); GLENUM(GL_INVALID_VALUE); GLENUM(GL_INVALID_OPERATION); GLENUM(GL_OUT_OF_MEMORY); @@ -3794,7 +3802,10 @@ namespace bgfx if (usesFragData) { - BX_WARN(s_extension[Extension::EXT_draw_buffers].m_supported, "EXT_draw_buffers is used but not supported by GLES2 driver."); + BX_WARN(s_extension[Extension::EXT_draw_buffers ].m_supported + || s_extension[Extension::WEBGL_draw_buffers].m_supported + , "EXT_draw_buffers is used but not supported by GLES2 driver." + ); writeString(&writer , "#extension GL_EXT_draw_buffers : enable\n" ); @@ -5354,21 +5365,21 @@ namespace bgfx GL_CHECK(glFrameTerminatorGREMEDY() ); } -} // namespace bgfx +} } // namespace bgfx #else -namespace bgfx +namespace bgfx { namespace gl { - RendererContextI* rendererCreateGL() + RendererContextI* rendererCreate() { return NULL; } - void rendererDestroyGL() + void rendererDestroy() { } -} // namespace bgfx +} /* namespace gl */ } // namespace bgfx #endif // (BGFX_CONFIG_RENDERER_OPENGLES || BGFX_CONFIG_RENDERER_OPENGL) diff --git a/3rdparty/bgfx/src/renderer_gl.h b/3rdparty/bgfx/src/renderer_gl.h index 9160fbfe44f..17cbdd7a80b 100644 --- a/3rdparty/bgfx/src/renderer_gl.h +++ b/3rdparty/bgfx/src/renderer_gl.h @@ -611,6 +611,10 @@ typedef uint64_t GLuint64; namespace bgfx { class ConstantBuffer; +} // namespace bgfx + +namespace bgfx { namespace gl +{ void dumpExtensions(const char* _extensions); const char* glEnumName(GLenum _enum); @@ -1001,6 +1005,6 @@ namespace bgfx GLuint m_queries[64]; }; -} // namespace bgfx +} /* namespace gl */ } // namespace bgfx #endif // BGFX_RENDERER_GL_H_HEADER_GUARD diff --git a/3rdparty/bgfx/src/renderer_null.cpp b/3rdparty/bgfx/src/renderer_null.cpp index cde647bf979..76cd0fadb13 100644 --- a/3rdparty/bgfx/src/renderer_null.cpp +++ b/3rdparty/bgfx/src/renderer_null.cpp @@ -7,7 +7,7 @@ #if BGFX_CONFIG_RENDERER_NULL -namespace bgfx +namespace bgfx { namespace noop { struct RendererContextNULL : public RendererContextI { @@ -168,31 +168,31 @@ namespace bgfx static RendererContextNULL* s_renderNULL; - RendererContextI* rendererCreateNULL() + RendererContextI* rendererCreate() { s_renderNULL = BX_NEW(g_allocator, RendererContextNULL); return s_renderNULL; } - void rendererDestroyNULL() + void rendererDestroy() { BX_DELETE(g_allocator, s_renderNULL); s_renderNULL = NULL; } -} // namespace bgfx +} /* namespace noop */ } // namespace bgfx #else -namespace bgfx +namespace bgfx { namespace noop { - RendererContextI* rendererCreateNULL() + RendererContextI* rendererCreate() { return NULL; } - void rendererDestroyNULL() + void rendererDestroy() { } -} // namespace bgfx +} /* namespace noop */ } // namespace bgfx #endif // BGFX_CONFIG_RENDERER_NULL diff --git a/3rdparty/bgfx/src/renderer_vk.cpp b/3rdparty/bgfx/src/renderer_vk.cpp index 809a0c8ec1e..e2ff8cdfe7a 100644 --- a/3rdparty/bgfx/src/renderer_vk.cpp +++ b/3rdparty/bgfx/src/renderer_vk.cpp @@ -8,16 +8,16 @@ # include "../../vk/src/renderer_vk.cpp" #else -namespace bgfx +namespace bgfx { namespace vk { - RendererContextI* rendererCreateVK() + RendererContextI* rendererCreate() { return NULL; } - void rendererDestroyVK() + void rendererDestroy() { } -} // namespace bgfx +} /* namespace vk */ } // namespace bgfx #endif // BGFX_CONFIG_RENDERER_VULKAN diff --git a/3rdparty/bgfx/tools/geometryc/geometryc.cpp b/3rdparty/bgfx/tools/geometryc/geometryc.cpp index 23ecb1088c8..f748e5c797a 100644 --- a/3rdparty/bgfx/tools/geometryc/geometryc.cpp +++ b/3rdparty/bgfx/tools/geometryc/geometryc.cpp @@ -504,11 +504,14 @@ int main(int _argc, const char* _argv[]) Triangle triangle; memset(&triangle, 0, sizeof(Triangle) ); + const int numNormals = (int)normals.size(); + const int numTexcoords = (int)texcoords.size(); + const int numPositions = (int)positions.size(); for (uint32_t edge = 0, numEdges = argc-1; edge < numEdges; ++edge) { Index3 index; - index.m_texcoord = -1; - index.m_normal = -1; + index.m_texcoord = 0; + index.m_normal = 0; index.m_vertexIndex = -1; char* vertex = argv[edge+1]; @@ -521,13 +524,16 @@ int main(int _argc, const char* _argv[]) if (NULL != normal) { *normal++ = '\0'; - index.m_normal = atoi(normal)-1; + const int nn = atoi(normal); + index.m_normal = (nn < 0) ? nn+numNormals : nn-1; } - index.m_texcoord = atoi(texcoord)-1; + const int tex = atoi(texcoord); + index.m_texcoord = (tex < 0) ? tex+numTexcoords : tex-1; } - index.m_position = atoi(vertex)-1; + const int pos = atoi(vertex); + index.m_position = (pos < 0) ? pos+numPositions : pos-1; uint64_t hash0 = index.m_position; uint64_t hash1 = uint64_t(index.m_texcoord)<<20; @@ -710,8 +716,8 @@ int main(int _argc, const char* _argv[]) bool hasTexcoord; { Index3Map::const_iterator it = indexMap.begin(); - hasNormal = -1 != it->second.m_normal; - hasTexcoord = -1 != it->second.m_texcoord; + hasNormal = 0 != it->second.m_normal; + hasTexcoord = 0 != it->second.m_texcoord; if (!hasTexcoord && texcoords.size() == positions.size() ) diff --git a/3rdparty/bgfx/tools/shaderc/shaderc.cpp b/3rdparty/bgfx/tools/shaderc/shaderc.cpp index a4a42af5af6..f25a03823df 100644 --- a/3rdparty/bgfx/tools/shaderc/shaderc.cpp +++ b/3rdparty/bgfx/tools/shaderc/shaderc.cpp @@ -845,7 +845,7 @@ int main(int _argc, const char* _argv[]) preprocessor.setDefaultDefine("BGFX_SHADER_TYPE_VERTEX"); char glslDefine[128]; - bx::snprintf(glslDefine, BX_COUNTOF(glslDefine), "BGFX_SHADER_LANGUAGE_GLSL=%d", glsl); + bx::snprintf(glslDefine, BX_COUNTOF(glslDefine), "BGFX_SHADER_LANGUAGE_GLSL=%d", essl ? 1 : glsl); if (0 == bx::stricmp(platform, "android") ) { @@ -972,9 +972,9 @@ int main(int _argc, const char* _argv[]) const char* name = parse = bx::strws(bx::strword(parse) ); const char* column = parse = bx::strws(bx::strword(parse) ); - const char* semantics = parse = bx::strws(bx::strnws (parse) ); + const char* semantics = parse = bx::strws((*parse == ':' ? ++parse : parse)); const char* assign = parse = bx::strws(bx::strword(parse) ); - const char* init = parse = bx::strws(bx::strnws (parse) ); + const char* init = parse = bx::strws((*parse == '=' ? ++parse : parse)); if (type < eol && name < eol @@ -1155,7 +1155,8 @@ int main(int _argc, const char* _argv[]) } else { - if (0 != glsl) + if (0 != glsl + || 0 != essl) { } else @@ -1269,7 +1270,8 @@ int main(int _argc, const char* _argv[]) bx::write(writer, BGFX_CHUNK_MAGIC_CSH); bx::write(writer, outputHash); - if (0 != glsl) + if (0 != glsl + || 0 != essl) { std::string code; @@ -1338,10 +1340,11 @@ int main(int _argc, const char* _argv[]) } else { - if (0 != glsl) + if (0 != glsl + || 0 != essl) { if (120 == glsl - || essl) + || 0 != essl) { preprocessor.writef( "#define ivec2 vec2\n" @@ -1700,7 +1703,8 @@ int main(int _argc, const char* _argv[]) bx::write(writer, outputHash); } - if (0 != glsl) + if (0 != glsl + || 0 != essl) { std::string code; diff --git a/3rdparty/bx/include/bx/handlealloc.h b/3rdparty/bx/include/bx/handlealloc.h index 25e250ec135..41dbd4fd142 100644 --- a/3rdparty/bx/include/bx/handlealloc.h +++ b/3rdparty/bx/include/bx/handlealloc.h @@ -71,7 +71,9 @@ namespace bx uint16_t* sparse = &m_handles[MaxHandlesT]; uint16_t index = sparse[_handle]; - return (index < m_numHandles && m_handles[index] == _handle); + return index < m_numHandles + && m_handles[index] == _handle + ; } void free(uint16_t _handle) diff --git a/3rdparty/bx/tests/unordered_map_nonpod.cpp b/3rdparty/bx/tests/unordered_map_nonpod.cpp index c94580323fb..f9607e35e3f 100644 --- a/3rdparty/bx/tests/unordered_map_nonpod.cpp +++ b/3rdparty/bx/tests/unordered_map_nonpod.cpp @@ -29,10 +29,11 @@ #include #include +struct Foo { int bar; }; + TEST(uomap_nonpod_compiles) { - struct Foo { int bar; }; // verify this compiles typedef tinystl::unordered_map map; map m; -} \ No newline at end of file +} diff --git a/3rdparty/bx/tools/bin/darwin/genie b/3rdparty/bx/tools/bin/darwin/genie index 19f84f8eb7f43f2453c8717852cc2d1cf7fa300e..3790b49e895920e828bf790cbc52339309a4cbf7 100644 GIT binary patch delta 33215 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 S_^2LVaeB*#ngQ@7p8o>~amZc( delta 33715 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 delta 28580 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 YAx5)ItqN(eK{+v0qjT6kM$`EJ0YRg4JOBUy diff --git a/3rdparty/genie/.gitignore b/3rdparty/genie/.gitignore index aa2a77c9cc7..42624a0c146 100644 --- a/3rdparty/genie/.gitignore +++ b/3rdparty/genie/.gitignore @@ -1,10 +1,2 @@ bin build/*/obj -scripts/obj -*.sln -*.suo -*.vcxproj -*.vcxproj.filters -*.vcxproj.user -*.opensdf -*.sdf \ No newline at end of file diff --git a/3rdparty/genie/README.md b/3rdparty/genie/README.md index e5e20890119..d393255f2c4 100644 --- a/3rdparty/genie/README.md +++ b/3rdparty/genie/README.md @@ -14,7 +14,7 @@ Supported project generators: Download (stable) ----------------- - version 225 (commit 2321131cbf61d5a13df44c255b8d18d73121149d) + version 242 (commit ce8f85701187fa48521ef0a6d38ac0f13726ae7b) Linux: https://github.com/bkaradzic/bx/raw/master/tools/bin/linux/genie @@ -73,6 +73,11 @@ intention to keep it compatible with it. - Added `msgcompile`, `msgresource`, `msglinking` and `msgarchiving` as overrides for make messages. - Added `messageskip` list to disable some of compiler messages. + - Added `buildoptions_c`, `buildoptions_cpp`, `buildoptions_objc` for + configuring language specific build options. + - Split functionality of `excludes` in `removefiles` and `excludes`. With VS + `excludes` will exclude files from build but files will be added to project + file. `removefiles` removes files completely from project. ## Why fork? diff --git a/3rdparty/genie/scripts/genie.lua b/3rdparty/genie/scripts/genie.lua index fbf273030b9..73ea1d344a1 100644 --- a/3rdparty/genie/scripts/genie.lua +++ b/3rdparty/genie/scripts/genie.lua @@ -36,7 +36,7 @@ "../src/host/scripts.c", } - removefiles { + excludes { "../src/premake.lua", "../src/host/lua-5.2.3/src/lua.c", "../src/host/lua-5.2.3/src/luac.c", diff --git a/3rdparty/genie/src/actions/make/make_cpp.lua b/3rdparty/genie/src/actions/make/make_cpp.lua index cff6ddebe86..f88ab12dbc4 100644 --- a/3rdparty/genie/src/actions/make/make_cpp.lua +++ b/3rdparty/genie/src/actions/make/make_cpp.lua @@ -73,20 +73,20 @@ _p('endef') _p('') end - + -- target build rule _p('$(TARGET): $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES)') - - if prj.kind == "StaticLib" then + + if prj.kind == "StaticLib" then if prj.msgarchiving then _p('\t@echo ' .. prj.msgarchiving) else _p('\t@echo Archiving %s', prj.name) - end - if (not prj.archivesplit_size) then + end + if (not prj.archivesplit_size) then prj.archivesplit_size=200 end - if (not prj.options.ArchiveSplit) then + if (not prj.options.ArchiveSplit) then _p('\t$(SILENT) $(LINKCMD) $(OBJECTS)') else _p('\t$(call RM,$(TARGET))') @@ -98,7 +98,7 @@ _p('\t@echo ' .. prj.msglinking) else _p('\t@echo Linking %s', prj.name) - end + end _p('\t$(SILENT) $(LINKCMD)') end _p('\t$(POSTBUILDCMDS)') @@ -109,9 +109,16 @@ _p('$(TARGETDIR):') premake.make_mkdirrule("$(TARGETDIR)") - _p('$(OBJDIRS):') if (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, "SkipCreatingMessage")) then - _p('\t@echo Creating $(OBJDIR)') + _p('objdirmessage:') + _p('\t@echo Creating $(OBJDIR)') + _p('') + end + + if (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, "SkipCreatingMessage")) then + _p('$(OBJDIRS): objdirmessage') + else + _p('$(OBJDIRS):') end _p('\t-$(call MKDIR,$@)') _p('') @@ -246,14 +253,8 @@ for _, file in ipairs(prj.files) do if path.iscppfile(file) then -- check if file is excluded. - local excluded = false - for _, exclude in ipairs(cfg.excludes) do - excluded = (exclude == file) - if (excluded) then break end - end - - -- if not excluded, add it. - if excluded == false then + if not table.icontains(cfg.excludes, file) then + -- if not excluded, add it. _p('\t$(OBJDIR)/%s.o \\' , _MAKE.esc(path.trimdots(path.removeext(file))) ) diff --git a/3rdparty/genie/src/actions/vstudio/vs2010_vcxproj.lua b/3rdparty/genie/src/actions/vstudio/vs2010_vcxproj.lua index c5ee17d841c..7a0003b7a41 100644 --- a/3rdparty/genie/src/actions/vstudio/vs2010_vcxproj.lua +++ b/3rdparty/genie/src/actions/vstudio/vs2010_vcxproj.lua @@ -477,22 +477,10 @@ vc2010.link(cfg) event_hooks(cfg) _p(1,'') - - end end - - function exists(table, fine) - for _, value in ipairs(table) do - if value == find then return true end - end - - return false - end - - -- -- Retrieve a list of files for a particular build group, one of -- "ClInclude", "ClCompile", "ResourceCompile", and "None". @@ -506,7 +494,7 @@ ClInclude = {}, None = {}, ResourceCompile = {}, - AppxManifest = {} + AppxManifest = {} } local foundAppxManifest = false @@ -514,19 +502,19 @@ if path.iscppfile(file.name) then table.insert(sortedfiles.ClCompile, file) elseif path.iscppheader(file.name) then - if not exists(prj.removefiles, file) then + if not table.icontains(prj.removefiles, file) then table.insert(sortedfiles.ClInclude, file) end elseif path.isresourcefile(file.name) then table.insert(sortedfiles.ResourceCompile, file) else - local ext = path.getextension(file.name):lower() - if ext == ".appxmanifest" then + local ext = path.getextension(file.name):lower() + if ext == ".appxmanifest" then foundAppxManifest = true - table.insert(sortedfiles.AppxManifest, file) - else - table.insert(sortedfiles.None, file) - end + table.insert(sortedfiles.AppxManifest, file) + else + table.insert(sortedfiles.None, file) + end end end @@ -557,7 +545,7 @@ vc2010.compilerfilesgroup(prj) vc2010.simplefilesgroup(prj, "None") vc2010.simplefilesgroup(prj, "ResourceCompile") - vc2010.simplefilesgroup(prj, "AppxManifest") + vc2010.simplefilesgroup(prj, "AppxManifest") end @@ -566,13 +554,13 @@ if #files > 0 then _p(1,'') for _, file in ipairs(files) do - if subtype then - _p(2,'<%s Include=\"%s\">', section, path.translate(file.name, "\\")) - _p(3,'%s', subtype) - _p(2,'', section) - else - _p(2,'<%s Include=\"%s\" />', section, path.translate(file.name, "\\")) - end + if subtype then + _p(2,'<%s Include=\"%s\">', section, path.translate(file.name, "\\")) + _p(3,'%s', subtype) + _p(2,'', section) + else + _p(2,'<%s Include=\"%s\" />', section, path.translate(file.name, "\\")) + end end _p(1,'') end @@ -605,37 +593,15 @@ end end - -- Global exclude - local excluded = false - for _, exclude in ipairs(prj.excludes) do - if exclude == file.name then - for _, vsconfig in ipairs(configs) do - local cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform) - _p(3, 'true' - , premake.esc(vsconfig.name) - ) - end - excluded = true - break - end - end - - if not excluded then - -- Per configuration excludes - for _, vsconfig in ipairs(configs) do - local cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform) - for _, exclude in ipairs(cfg.excludes) do - - if exclude == file.name then - _p(3, 'true' - , premake.esc(vsconfig.name) - ) - end - end + local excluded = table.icontains(prj.excludes, file.name) + for _, vsconfig in ipairs(configs) do + local cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform) + if excluded or table.icontains(cfg.excludes, file.name) then + _p(3, 'true' + , premake.esc(vsconfig.name) + ) end end diff --git a/3rdparty/genie/src/base/api.lua b/3rdparty/genie/src/base/api.lua index 9a3a26d0c43..5b53c818284 100644 --- a/3rdparty/genie/src/base/api.lua +++ b/3rdparty/genie/src/base/api.lua @@ -810,13 +810,16 @@ end -- list value types get a remove() call too - if info.kind == "list" or - info.kind == "dirlist" or - info.kind == "filelist" or - info.kind == "absolutefilelist" + if info.kind == "list" + or info.kind == "dirlist" + or info.kind == "filelist" + or info.kind == "absolutefilelist" then - _G["remove"..name] = function(value) - premake.remove(name, value) + if name ~= "removefiles" + and name ~= "files" then + _G["remove"..name] = function(value) + premake.remove(name, value) + end end end end diff --git a/3rdparty/genie/src/base/bake.lua b/3rdparty/genie/src/base/bake.lua index 62737fa4d19..ab50612671d 100644 --- a/3rdparty/genie/src/base/bake.lua +++ b/3rdparty/genie/src/base/bake.lua @@ -253,6 +253,7 @@ -- build the configuration base by merging the solution and project level settings local cfg = {} mergeobject(cfg, basis[key]) + adjustpaths(obj.location, cfg) mergeobject(cfg, obj) @@ -376,7 +377,7 @@ local dir local start = iif(cfg.name, 2, 1) - for v = start, iif(cfg.flags.SingleOutputDir,num_variations-1,num_variations) do + for v = start, iif(cfg.flags.SingleOutputDir==true,num_variations-1,num_variations) do dir = cfg_dirs[cfg][v] if hit_counts[dir] == 1 then break end end @@ -701,15 +702,13 @@ end -- remove excluded files from the file list - local files = { } + local removefiles = cfg.removefiles + if _ACTION == 'gmake' then + removefiles = table.join(removefiles, cfg.excludes) + end + local files = {} for _, fname in ipairs(cfg.files) do - local removed = false - for _, removefname in ipairs(cfg.removefiles) do - removed = (fname == removefname) - if (removed) then break end - end - - if (not removed) then + if not table.icontains(removefiles, fname) then table.insert(files, fname) end end diff --git a/3rdparty/genie/src/base/inspect.lua b/3rdparty/genie/src/base/inspect.lua index b163a806505..b654cd76bec 100644 --- a/3rdparty/genie/src/base/inspect.lua +++ b/3rdparty/genie/src/base/inspect.lua @@ -283,7 +283,9 @@ function inspect(rootObject, options) end function printtable(name, table) - print("--- " .. name) - print(inspect(table)) - print("---") + print("table: ", name, inspect(table), "\n") +end + +function printstack() + print(debug.traceback(), "\n") end diff --git a/3rdparty/genie/src/base/table.lua b/3rdparty/genie/src/base/table.lua index 8e5c6100a90..20581c239c3 100644 --- a/3rdparty/genie/src/base/table.lua +++ b/3rdparty/genie/src/base/table.lua @@ -3,22 +3,27 @@ -- Additions to Lua's built-in table functions. -- Copyright (c) 2002-2008 Jason Perkins and the Premake project -- - + -- -- Returns true if the table contains the specified value. -- function table.contains(t, value) - for _,v in pairs(t) do - if (v == value) then - return true - end + for _, v in pairs(t) do + if v == value then return true end end return false end - - + + function table.icontains(t, value) + for _, v in ipairs(t) do + if v == value then return true end + end + return false + end + + -- -- Enumerates an array of objects and returns a new table containing -- only the value of one particular field. @@ -31,8 +36,8 @@ end return result end - - + + -- -- Flattens a hierarchy of tables into a single array containing all @@ -41,7 +46,7 @@ function table.flatten(arr) local result = { } - + local function flatten(arr) for _, v in ipairs(arr) do if type(v) == "table" then @@ -51,7 +56,7 @@ end end end - + flatten(arr) return result end @@ -75,7 +80,7 @@ -- -- Inserts a value of array of values into a table. If the value is --- itself a table, its contents are enumerated and added instead. So +-- itself a table, its contents are enumerated and added instead. So -- these inputs give these outputs: -- -- "x" -> { "x" } @@ -156,7 +161,7 @@ end return result end - + -- @@ -179,5 +184,5 @@ end return result end - - \ No newline at end of file + + diff --git a/3rdparty/genie/src/host/scripts.c b/3rdparty/genie/src/host/scripts.c index c08c2b2dc3a..71c54dd4f65 100644 --- a/3rdparty/genie/src/host/scripts.c +++ b/3rdparty/genie/src/host/scripts.c @@ -21,8 +21,8 @@ const char* builtin_scripts[] = { "function string.explode(s, pattern, plain)\nif (pattern == '') then return false end\nlocal pos = 0\nlocal arr = { }\nfor st,sp in function() return s:find(pattern, pos, plain) end do\ntable.insert(arr, s:sub(pos, st-1))\npos = sp + 1\nend\ntable.insert(arr, s:sub(pos))\nreturn arr\nend\nfunction string.findlast(s, pattern, plain)\nlocal curr = 0\nrepeat\nlocal next = s:find(pattern, curr + 1, plain)\nif (next) then curr = next end\nuntil (not next)\nif (curr > 0) then\nreturn curr\nend\nend\nfunction string.startswith(haystack, needle)\nreturn (haystack:find(needle, 1, true) == 1)\nend\n", /* base/table.lua */ - "function table.contains(t, value)\nfor _,v in pairs(t) do\nif (v == value) then\nreturn true\nend\nend\nreturn false\nend\nfunction table.extract(arr, fname)\nlocal result = { }\nfor _,v in ipairs(arr) do\ntable.insert(result, v[fname])\nend\nreturn result\nend\nfunction table.flatten(arr)\nlocal result = { }\nlocal function flatten(arr)\nfor _, v in ipairs(arr) do\nif type(v) == \"table\" then\nflatten(v)\nelse\ntable.insert(result, v)\nend\nend\nend\nflatten(arr)\nreturn result\nend\nfunction table.implode(arr, before, after, between)\nlocal result = \"\"\nfor _,v in ipairs(arr) do\nif (result ~= \"\" and between) then\nresult = result .. between\nend\nresult = result .. before .. v .. after\nend\nreturn result\nend\nfunction table.insertflat(tbl, values)\nif type(values) == \"table\" then\nfor _, value in ipairs(values) do\ntable.insertflat(tbl, value)\nend\nelse\ntable.insert(tbl, values)\nend\nend\nfunction table.isempty(t)\nreturn next(t) == nil\nend\nfunction table.join(...)\nlocal arg={...}\nlocal resu" - "lt = { }\nfor _,t in ipairs(arg) do\nif type(t) == \"table\" then\nfor _,v in ipairs(t) do\ntable.insert(result, v)\nend\nelse\ntable.insert(result, t)\nend\nend\nreturn result\nend\nfunction table.keys(tbl)\nlocal keys = {}\nfor k, _ in pairs(tbl) do\ntable.insert(keys, k)\nend\nreturn keys\nend\nfunction table.merge(...)\nlocal arg={...}\nlocal result = { }\nfor _,t in ipairs(arg) do\nif type(t) == \"table\" then\nfor k,v in pairs(t) do\nresult[k] = v\nend\nelse\nerror(\"invalid value\")\nend\nend\nreturn result\nend\nfunction table.translate(arr, translation)\nlocal result = { }\nfor _, value in ipairs(arr) do\nlocal tvalue\nif type(translation) == \"function\" then\ntvalue = translation(value)\nelse\ntvalue = translation[value]\nend\nif (tvalue) then\ntable.insert(result, tvalue)\nend\nend\nreturn result\nend\n", + "function table.contains(t, value)\nfor _, v in pairs(t) do\nif v == value then return true end\nend\nreturn false\nend\nfunction table.icontains(t, value)\nfor _, v in ipairs(t) do\nif v == value then return true end\nend\nreturn false\nend\nfunction table.extract(arr, fname)\nlocal result = { }\nfor _,v in ipairs(arr) do\ntable.insert(result, v[fname])\nend\nreturn result\nend\nfunction table.flatten(arr)\nlocal result = { }\nlocal function flatten(arr)\nfor _, v in ipairs(arr) do\nif type(v) == \"table\" then\nflatten(v)\nelse\ntable.insert(result, v)\nend\nend\nend\nflatten(arr)\nreturn result\nend\nfunction table.implode(arr, before, after, between)\nlocal result = \"\"\nfor _,v in ipairs(arr) do\nif (result ~= \"\" and between) then\nresult = result .. between\nend\nresult = result .. before .. v .. after\nend\nreturn result\nend\nfunction table.insertflat(tbl, values)\nif type(values) == \"table\" then\nfor _, value in ipairs(values) do\ntable.insertflat(tbl, value)\nend\nelse\ntable.insert(tbl, values)" + "\nend\nend\nfunction table.isempty(t)\nreturn next(t) == nil\nend\nfunction table.join(...)\nlocal arg={...}\nlocal result = { }\nfor _,t in ipairs(arg) do\nif type(t) == \"table\" then\nfor _,v in ipairs(t) do\ntable.insert(result, v)\nend\nelse\ntable.insert(result, t)\nend\nend\nreturn result\nend\nfunction table.keys(tbl)\nlocal keys = {}\nfor k, _ in pairs(tbl) do\ntable.insert(keys, k)\nend\nreturn keys\nend\nfunction table.merge(...)\nlocal arg={...}\nlocal result = { }\nfor _,t in ipairs(arg) do\nif type(t) == \"table\" then\nfor k,v in pairs(t) do\nresult[k] = v\nend\nelse\nerror(\"invalid value\")\nend\nend\nreturn result\nend\nfunction table.translate(arr, translation)\nlocal result = { }\nfor _, value in ipairs(arr) do\nlocal tvalue\nif type(translation) == \"function\" then\ntvalue = translation(value)\nelse\ntvalue = translation[value]\nend\nif (tvalue) then\ntable.insert(result, tvalue)\nend\nend\nreturn result\nend\n", /* base/io.lua */ "function io.capture()\nio.captured = ''\nend\nfunction io.endcapture()\nlocal captured = io.captured\nio.captured = nil\nreturn captured\nend\nlocal builtin_open = io.open\nfunction io.open(fname, mode)\nif (mode) then\nif (mode:find(\"w\")) then\nlocal dir = path.getdirectory(fname)\nok, err = os.mkdir(dir)\nif (not ok) then\nerror(err, 0)\nend\nend\nend\nreturn builtin_open(fname, mode)\nend\nfunction io.printf(msg, ...)\nlocal arg={...}\nif not io.eol then\nio.eol = \"\\n\"\nend\nif not io.indent then\nio.indent = \"\\t\"\nend\nif type(msg) == \"number\" then\ns = string.rep(io.indent, msg) .. string.format(table.unpack(arg))\nelse\ns = string.format(msg, table.unpack(arg))\nend\nif io.captured then\nio.captured = io.captured .. s .. io.eol\nelse\nio.write(s)\nio.write(io.eol)\nend\nend\n_p = io.printf\n", @@ -68,16 +68,16 @@ const char* builtin_scripts[] = { "n\nreturn false\nend\nif matched == \"required\" then\nhasrequired = true\nend\nend\nif terms.required and not hasrequired then\nreturn false\nelse\nreturn true\nend\nend\nlocal function adjustpaths(location, obj)\nfunction adjustpathlist(list)\nfor i, p in ipairs(list) do\nlist[i] = path.getrelative(location, p)\nend\nend\nfor name, value in pairs(obj) do\nlocal field = premake.fields[name]\nif field and value and not keeprelative[name] then\nif field.kind == \"path\" then\nobj[name] = path.getrelative(location, value)\nelseif field.kind == \"dirlist\" or field.kind == \"filelist\" then\nadjustpathlist(value)\nelseif field.kind == \"keypath\" then\nfor k,v in pairs(value) do\nadjustpathlist(v)\nend\nend\nend\nend\nend\nlocal function mergefield(kind, dest, src)\nlocal tbl = dest or { }\nif kind == \"keyvalue\" or kind == \"keypath\" then\nfor key, value in pairs(src) do\ntbl[key] = mergefield(\"list\", tbl[key], value)\nend\nelse\nfor _, item in ipairs(src) do\nif not tbl[item] then\ntable.insert(tbl, item)\n" "tbl[item] = item\nend\nend\nend\nreturn tbl\nend\nlocal function removevalues(tbl, removes)\nfor i=#tbl,1,-1 do\nfor _, pattern in ipairs(removes) do\nif pattern == tbl[i] then\ntable.remove(tbl, i)\nbreak\nend\nend\nend\nend\nlocal function mergeobject(dest, src)\nif not src then\nreturn\nend\nfor fieldname, value in pairs(src) do\nif not nocopy[fieldname] then\nlocal field = premake.fields[fieldname]\nif field then\nif type(value) == \"table\" then\ndest[fieldname] = mergefield(field.kind, dest[fieldname], value)\nif src.removes then\nremoves = src.removes[fieldname]\nif removes then\nremovevalues(dest[fieldname], removes)\nend\nend\nelse\ndest[fieldname] = value\nend\nelse\ndest[fieldname] = value\nend\nend\nend\nend\nlocal function merge(dest, obj, basis, terms, cfgname, pltname)\nlocal key = cfgname or \"\"\npltname = pltname or \"Native\"\nif pltname ~= \"Native\" then\nkey = key .. pltname\nend\nterms.config = (cfgname or \"\"):lower()\nterms.platform = pltname:lower()\nlocal cfg = {}\nmergeobject(cfg, " "basis[key])\nadjustpaths(obj.location, cfg)\nmergeobject(cfg, obj)\nif (cfg.kind) then\nterms['kind']=cfg.kind:lower()\nend\nfor _, blk in ipairs(obj.blocks) do\nif (premake.iskeywordsmatch(blk.keywords, terms))then\nmergeobject(cfg, blk)\nif (cfg.kind and not cfg.terms.kind) then\ncfg.terms['kind'] = cfg.kind:lower()\nterms['kind'] = cfg.kind:lower()\nend\nend\nend\ncfg.name = cfgname\ncfg.platform = pltname\nfor k,v in pairs(terms) do\ncfg.terms[k] =v\nend\ndest[key] = cfg\nend\nlocal function collapse(obj, basis)\nlocal result = {}\nbasis = basis or {}\nlocal sln = obj.solution or obj\nlocal terms = premake.getactiveterms()\nmerge(result, obj, basis, terms)--this adjusts terms\nfor _, cfgname in ipairs(sln.configurations) do\nlocal terms_local = {}\nfor k,v in pairs(terms)do terms_local[k]=v end\nmerge(result, obj, basis, terms_local, cfgname, \"Native\")--terms cam also be adjusted here\nfor _, pltname in ipairs(sln.platforms or {}) do\nif pltname ~= \"Native\" then\nmerge(result, obj, basis,terms_lo" - "cal, cfgname, pltname)--terms also here\nend\nend\nend\nreturn result\nend\nlocal function builduniquedirs()\nlocal num_variations = 4\nlocal cfg_dirs = {}\nlocal hit_counts = {}\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nfor _, cfg in pairs(prj.__configs) do\nlocal dirs = { }\ndirs[1] = path.getabsolute(path.join(cfg.location, cfg.objdir or cfg.project.objdir or \"obj\"))\ndirs[2] = path.join(dirs[1], iif(cfg.platform == \"Native\", \"\", cfg.platform))\ndirs[3] = path.join(dirs[2], cfg.name)\ndirs[4] = path.join(dirs[3], cfg.project.name)\ncfg_dirs[cfg] = dirs\nlocal start = iif(cfg.name, 2, 1)\nfor v = start, num_variations do\nlocal d = dirs[v]\nhit_counts[d] = (hit_counts[d] or 0) + 1\nend\nend\nend\nend\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nfor _, cfg in pairs(prj.__configs) do\nlocal dir\nlocal start = iif(cfg.name, 2, 1)\nfor v = start, iif(cfg.flags.SingleOutputDir,num_variations-1,num_variations) do\ndir = cfg_dirs[cfg][v]\n" - "if hit_counts[dir] == 1 then break end\nend\ncfg.objectsdir = path.getrelative(cfg.location, dir)\nend\nend\nend\nend\nlocal function buildtargets()\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nfor _, cfg in pairs(prj.__configs) do\nlocal pathstyle = premake.getpathstyle(cfg)\nlocal namestyle = premake.getnamestyle(cfg)\ncfg.buildtarget = premake.gettarget(cfg, \"build\", pathstyle, namestyle, cfg.system)\ncfg.linktarget = premake.gettarget(cfg, \"link\", pathstyle, namestyle, cfg.system)\nif pathstyle == \"windows\" then\ncfg.objectsdir = path.translate(cfg.objectsdir, \"\\\\\")\nend\nend\nend\nend\nend\n local function getCfgKind(cfg)\n if(cfg.kind) then\n return cfg.kind;\n end\n if(cfg.project.__configs[\"\"] and cfg.project.__configs[\"\"].kind) then\n return cfg.project.__configs[\"\"].kind;\n end\n return nil\n end\n local function getprojrec(dstArray, foundList, cfg, cfgname, searchField, bLinkage)\n if(not cfg) then return end\n local foundUsePrjs = {};" - "\n for _, useName in ipairs(cfg[searchField]) do\n local testName = useName:lower();\n if((not foundList[testName])) then\n local theProj = nil;\n local theUseProj = nil;\n for _, prj in ipairs(cfg.project.solution.projects) do\n if (prj.name:lower() == testName) then\n if(prj.usage) then\n theUseProj = prj;\n else\n theProj = prj;\n end\n end\n end\n --Must connect to a usage project.\n if(theUseProj) then\n foundList[testName] = true;\n local prjEntry = {\n name = testName,\n proj = theProj,\n usageProj = theUseProj,\n bLinkageOnly = bLinkage,\n };\n dstArray[testName] = prjEntry;\n table.insert(foundUsePrjs, theUseProj);\n end\n end\n end\n for _, usePrj in ipairs(foundUsePrjs) do\n --Links can only recurse through static libraries.\n if((searchField ~= \"links\") or\n (getCfgKind(usePrj.__configs[cfgname]) == \"StaticLib\")) then\n getprojrec(dstArray, foundList, usePrj.__configs[cfgname],\n cfgname, searchField, bLinkage);\n end\n end\n end\n --\n -- This function wi" - "ll recursively get all projects that the given configuration has in its \"uses\"\n -- field. The return values are a list of tables. Each table in that list contains the following:\n --name = The lowercase name of the project.\n --proj = The project. Can be nil if it is usage-only.\n --usageProj = The usage project. Can't be nil, as using a project that has no\n -- usage project is not put into the list.\n --bLinkageOnly = If this is true, then only the linkage information should be copied.\n -- The recursion will only look at the \"uses\" field on *usage* projects.\n -- This function will also add projects to the list that are mentioned in the \"links\"\n -- field of usage projects. These will only copy linker information, but they will recurse.\n -- through other \"links\" fields.\n --\n local function getprojectsconnections(cfg, cfgname)\n local dstArray = {};\n local foundList = {};\n foundList[cfg.project.name:lower()] = true;\n --First, follow the uses recursively.\n getprojrec(dstArray," - " foundList, cfg, cfgname, \"uses\", false);\n --Next, go through all of the usage projects and recursively get their links.\n --But only if they're not already there. Get the links as linkage-only.\n local linkArray = {};\n for prjName, prjEntry in pairs(dstArray) do\n getprojrec(linkArray, foundList, prjEntry.usageProj.__configs[cfgname], cfgname,\n \"links\", true);\n end\n --Copy from linkArray into dstArray.\n for prjName, prjEntry in pairs(linkArray) do\n dstArray[prjName] = prjEntry;\n end\n return dstArray;\n end\n local function isnameofproj(cfg, strName)\n local sln = cfg.project.solution;\n local strTest = strName:lower();\n for prjIx, prj in ipairs(sln.projects) do\n if (prj.name:lower() == strTest) then\n return true;\n end\n end\n return false;\n end\n --\n -- Copies the field from dstCfg to srcCfg.\n --\n local function copydependentfield(srcCfg, dstCfg, strSrcField)\n local srcField = premake.fields[strSrcField];\n local strDstField = strSrcField;\n if type(srcCfg[s" - "trSrcField]) == \"table\" then\n --handle paths.\n if (srcField.kind == \"dirlist\" or srcField.kind == \"filelist\") and\n (not keeprelative[strSrcField]) then\n for i,p in ipairs(srcCfg[strSrcField]) do\n table.insert(dstCfg[strDstField],\n path.rebase(p, srcCfg.project.location, dstCfg.project.location))\n end\n else\n if(strSrcField == \"links\") then\n for i,p in ipairs(srcCfg[strSrcField]) do\n if(not isnameofproj(dstCfg, p)) then\n table.insert(dstCfg[strDstField], p)\n else\n printf(\"Failed to copy '%s' from proj '%s'.\",\n p, srcCfg.project.name);\n end\n end\n else\n for i,p in ipairs(srcCfg[strSrcField]) do\n table.insert(dstCfg[strDstField], p)\n end\n end\n end\n else\n if(srcField.kind == \"path\" and (not keeprelative[strSrcField])) then\n dstCfg[strDstField] = path.rebase(srcCfg[strSrcField],\n prj.location, dstCfg.project.location);\n else\n dstCfg[strDstField] = srcCfg[strSrcField];\n end\n end\n end\n --\n -- This function will take the list of project entr" - "ies and apply their usage project data\n -- to the given configuration. It will copy compiling information for the projects that are\n -- not listed as linkage-only. It will copy the linking information for projects only if\n -- the source project is not a static library. It won't copy linking information\n -- if the project is in this solution; instead it will add that project to the configuration's\n -- links field, expecting that Premake will handle the rest.\n --\n local function copyusagedata(cfg, cfgname, linkToProjs)\n local myPrj = cfg.project;\n local bIsStaticLib = (getCfgKind(cfg) == \"StaticLib\");\n for prjName, prjEntry in pairs(linkToProjs) do\n local srcPrj = prjEntry.usageProj;\n local srcCfg = srcPrj.__configs[cfgname];\n for name, field in pairs(premake.fields) do\n if(srcCfg[name]) then\n if(field.usagecopy) then\n if(not prjEntry.bLinkageOnly) then\n copydependentfield(srcCfg, cfg, name)\n end\n elseif(field.linkagecopy) then\n --Copy the linkage data if we're building " - "a non-static thing\n --and this is a pure usage project. If it's not pure-usage, then\n --we will simply put the project's name in the links field later.\n if((not bIsStaticLib) and (not prjEntry.proj)) then\n copydependentfield(srcCfg, cfg, name)\n end\n end\n end\n end\n if((not bIsStaticLib) and prjEntry.proj) then\n table.insert(cfg.links, prjEntry.proj.name);\n end\n end\n end\nfunction premake.bake.buildconfigs()\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nprj.location = prj.location or sln.location or prj.basedir\nadjustpaths(prj.location, prj)\nfor _, blk in ipairs(prj.blocks) do\nadjustpaths(prj.location, blk)\nend\nend\nsln.location = sln.location or sln.basedir\nend\nfor sln in premake.solution.each() do\nlocal basis = collapse(sln)\nfor _, prj in ipairs(sln.projects) do\nprj.__configs = collapse(prj, basis)\nfor _, cfg in pairs(prj.__configs) do\nbake.postprocess(prj, cfg)\nend\nend\nend\nfor sln in premake.solution.each() do\nfor prjIx, prj in ipairs" - "(sln.projects) do\nif(not prj.usage) then\nfor cfgname, cfg in pairs(prj.__configs) do\nlocal usesPrjs = getprojectsconnections(cfg, cfgname);\ncopyusagedata(cfg, cfgname, usesPrjs)\nend\nend\nend\nend\nfor sln in premake.solution.each() do\nlocal removeList = {};\nfor index, prj in ipairs(sln.projects) do\nif(prj.usage) then\ntable.insert(removeList, 1, index); --Add in reverse order.\nend\nend\nfor _, index in ipairs(removeList) do\ntable.remove(sln.projects, index);\nend\nend\nbuilduniquedirs()\nbuildtargets(cfg)\nend\nfunction premake.bake.postprocess(prj, cfg)\ncfg.project = prj\ncfg.shortname = premake.getconfigname(cfg.name, cfg.platform, true)\ncfg.longname = premake.getconfigname(cfg.name, cfg.platform)\ncfg.location = cfg.location or cfg.basedir\nlocal platform = premake.platforms[cfg.platform]\nif platform.iscrosscompiler then\ncfg.system = cfg.platform\nelse\ncfg.system = os.get()\nend\nif cfg.kind == \"SharedLib\" and platform.nosharedlibs then\ncfg.kind = \"StaticLib\"\nend\nlocal files = { }" - "\nfor _, fname in ipairs(cfg.files) do\nlocal removed = false\nfor _, removefname in ipairs(cfg.removefiles) do\nremoved = (fname == removefname)\nif (removed) then break end\nend\nif (not removed) then\ntable.insert(files, fname)\nend\nend\ncfg.files = files\nfor name, field in pairs(premake.fields) do\nif field.isflags then\nlocal values = cfg[name]\nfor _, flag in ipairs(values) do values[flag] = true end\nend\nend\ncfg.__fileconfigs = { }\nfor _, fname in ipairs(cfg.files) do\ncfg.terms.required = fname:lower()\nlocal fcfg = {}\nfor _, blk in ipairs(cfg.project.blocks) do\nif (premake.iskeywordsmatch(blk.keywords, cfg.terms)) then\nmergeobject(fcfg, blk)\nend\nend\nfcfg.name = fname\ncfg.__fileconfigs[fname] = fcfg\ntable.insert(cfg.__fileconfigs, fcfg)\nend\nend\n", + "cal, cfgname, pltname)--terms also here\nend\nend\nend\nreturn result\nend\nlocal function builduniquedirs()\nlocal num_variations = 4\nlocal cfg_dirs = {}\nlocal hit_counts = {}\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nfor _, cfg in pairs(prj.__configs) do\nlocal dirs = { }\ndirs[1] = path.getabsolute(path.join(cfg.location, cfg.objdir or cfg.project.objdir or \"obj\"))\ndirs[2] = path.join(dirs[1], iif(cfg.platform == \"Native\", \"\", cfg.platform))\ndirs[3] = path.join(dirs[2], cfg.name)\ndirs[4] = path.join(dirs[3], cfg.project.name)\ncfg_dirs[cfg] = dirs\nlocal start = iif(cfg.name, 2, 1)\nfor v = start, num_variations do\nlocal d = dirs[v]\nhit_counts[d] = (hit_counts[d] or 0) + 1\nend\nend\nend\nend\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nfor _, cfg in pairs(prj.__configs) do\nlocal dir\nlocal start = iif(cfg.name, 2, 1)\nfor v = start, iif(cfg.flags.SingleOutputDir==true,num_variations-1,num_variations) do\ndir = cfg_dirs[cfg" + "][v]\nif hit_counts[dir] == 1 then break end\nend\ncfg.objectsdir = path.getrelative(cfg.location, dir)\nend\nend\nend\nend\nlocal function buildtargets()\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nfor _, cfg in pairs(prj.__configs) do\nlocal pathstyle = premake.getpathstyle(cfg)\nlocal namestyle = premake.getnamestyle(cfg)\ncfg.buildtarget = premake.gettarget(cfg, \"build\", pathstyle, namestyle, cfg.system)\ncfg.linktarget = premake.gettarget(cfg, \"link\", pathstyle, namestyle, cfg.system)\nif pathstyle == \"windows\" then\ncfg.objectsdir = path.translate(cfg.objectsdir, \"\\\\\")\nend\nend\nend\nend\nend\n local function getCfgKind(cfg)\n if(cfg.kind) then\n return cfg.kind;\n end\n if(cfg.project.__configs[\"\"] and cfg.project.__configs[\"\"].kind) then\n return cfg.project.__configs[\"\"].kind;\n end\n return nil\n end\n local function getprojrec(dstArray, foundList, cfg, cfgname, searchField, bLinkage)\n if(not cfg) then return end\n local foundUsePrjs " + "= {};\n for _, useName in ipairs(cfg[searchField]) do\n local testName = useName:lower();\n if((not foundList[testName])) then\n local theProj = nil;\n local theUseProj = nil;\n for _, prj in ipairs(cfg.project.solution.projects) do\n if (prj.name:lower() == testName) then\n if(prj.usage) then\n theUseProj = prj;\n else\n theProj = prj;\n end\n end\n end\n --Must connect to a usage project.\n if(theUseProj) then\n foundList[testName] = true;\n local prjEntry = {\n name = testName,\n proj = theProj,\n usageProj = theUseProj,\n bLinkageOnly = bLinkage,\n };\n dstArray[testName] = prjEntry;\n table.insert(foundUsePrjs, theUseProj);\n end\n end\n end\n for _, usePrj in ipairs(foundUsePrjs) do\n --Links can only recurse through static libraries.\n if((searchField ~= \"links\") or\n (getCfgKind(usePrj.__configs[cfgname]) == \"StaticLib\")) then\n getprojrec(dstArray, foundList, usePrj.__configs[cfgname],\n cfgname, searchField, bLinkage);\n end\n end\n end\n --\n -- This functi" + "on will recursively get all projects that the given configuration has in its \"uses\"\n -- field. The return values are a list of tables. Each table in that list contains the following:\n --name = The lowercase name of the project.\n --proj = The project. Can be nil if it is usage-only.\n --usageProj = The usage project. Can't be nil, as using a project that has no\n -- usage project is not put into the list.\n --bLinkageOnly = If this is true, then only the linkage information should be copied.\n -- The recursion will only look at the \"uses\" field on *usage* projects.\n -- This function will also add projects to the list that are mentioned in the \"links\"\n -- field of usage projects. These will only copy linker information, but they will recurse.\n -- through other \"links\" fields.\n --\n local function getprojectsconnections(cfg, cfgname)\n local dstArray = {};\n local foundList = {};\n foundList[cfg.project.name:lower()] = true;\n --First, follow the uses recursively.\n getprojrec(dstA" + "rray, foundList, cfg, cfgname, \"uses\", false);\n --Next, go through all of the usage projects and recursively get their links.\n --But only if they're not already there. Get the links as linkage-only.\n local linkArray = {};\n for prjName, prjEntry in pairs(dstArray) do\n getprojrec(linkArray, foundList, prjEntry.usageProj.__configs[cfgname], cfgname,\n \"links\", true);\n end\n --Copy from linkArray into dstArray.\n for prjName, prjEntry in pairs(linkArray) do\n dstArray[prjName] = prjEntry;\n end\n return dstArray;\n end\n local function isnameofproj(cfg, strName)\n local sln = cfg.project.solution;\n local strTest = strName:lower();\n for prjIx, prj in ipairs(sln.projects) do\n if (prj.name:lower() == strTest) then\n return true;\n end\n end\n return false;\n end\n --\n -- Copies the field from dstCfg to srcCfg.\n --\n local function copydependentfield(srcCfg, dstCfg, strSrcField)\n local srcField = premake.fields[strSrcField];\n local strDstField = strSrcField;\n if type(src" + "Cfg[strSrcField]) == \"table\" then\n --handle paths.\n if (srcField.kind == \"dirlist\" or srcField.kind == \"filelist\") and\n (not keeprelative[strSrcField]) then\n for i,p in ipairs(srcCfg[strSrcField]) do\n table.insert(dstCfg[strDstField],\n path.rebase(p, srcCfg.project.location, dstCfg.project.location))\n end\n else\n if(strSrcField == \"links\") then\n for i,p in ipairs(srcCfg[strSrcField]) do\n if(not isnameofproj(dstCfg, p)) then\n table.insert(dstCfg[strDstField], p)\n else\n printf(\"Failed to copy '%s' from proj '%s'.\",\n p, srcCfg.project.name);\n end\n end\n else\n for i,p in ipairs(srcCfg[strSrcField]) do\n table.insert(dstCfg[strDstField], p)\n end\n end\n end\n else\n if(srcField.kind == \"path\" and (not keeprelative[strSrcField])) then\n dstCfg[strDstField] = path.rebase(srcCfg[strSrcField],\n prj.location, dstCfg.project.location);\n else\n dstCfg[strDstField] = srcCfg[strSrcField];\n end\n end\n end\n --\n -- This function will take the list of project" + " entries and apply their usage project data\n -- to the given configuration. It will copy compiling information for the projects that are\n -- not listed as linkage-only. It will copy the linking information for projects only if\n -- the source project is not a static library. It won't copy linking information\n -- if the project is in this solution; instead it will add that project to the configuration's\n -- links field, expecting that Premake will handle the rest.\n --\n local function copyusagedata(cfg, cfgname, linkToProjs)\n local myPrj = cfg.project;\n local bIsStaticLib = (getCfgKind(cfg) == \"StaticLib\");\n for prjName, prjEntry in pairs(linkToProjs) do\n local srcPrj = prjEntry.usageProj;\n local srcCfg = srcPrj.__configs[cfgname];\n for name, field in pairs(premake.fields) do\n if(srcCfg[name]) then\n if(field.usagecopy) then\n if(not prjEntry.bLinkageOnly) then\n copydependentfield(srcCfg, cfg, name)\n end\n elseif(field.linkagecopy) then\n --Copy the linkage data if we're buil" + "ding a non-static thing\n --and this is a pure usage project. If it's not pure-usage, then\n --we will simply put the project's name in the links field later.\n if((not bIsStaticLib) and (not prjEntry.proj)) then\n copydependentfield(srcCfg, cfg, name)\n end\n end\n end\n end\n if((not bIsStaticLib) and prjEntry.proj) then\n table.insert(cfg.links, prjEntry.proj.name);\n end\n end\n end\nfunction premake.bake.buildconfigs()\nfor sln in premake.solution.each() do\nfor _, prj in ipairs(sln.projects) do\nprj.location = prj.location or sln.location or prj.basedir\nadjustpaths(prj.location, prj)\nfor _, blk in ipairs(prj.blocks) do\nadjustpaths(prj.location, blk)\nend\nend\nsln.location = sln.location or sln.basedir\nend\nfor sln in premake.solution.each() do\nlocal basis = collapse(sln)\nfor _, prj in ipairs(sln.projects) do\nprj.__configs = collapse(prj, basis)\nfor _, cfg in pairs(prj.__configs) do\nbake.postprocess(prj, cfg)\nend\nend\nend\nfor sln in premake.solution.each() do\nfor prjIx, prj in i" + "pairs(sln.projects) do\nif(not prj.usage) then\nfor cfgname, cfg in pairs(prj.__configs) do\nlocal usesPrjs = getprojectsconnections(cfg, cfgname);\ncopyusagedata(cfg, cfgname, usesPrjs)\nend\nend\nend\nend\nfor sln in premake.solution.each() do\nlocal removeList = {};\nfor index, prj in ipairs(sln.projects) do\nif(prj.usage) then\ntable.insert(removeList, 1, index); --Add in reverse order.\nend\nend\nfor _, index in ipairs(removeList) do\ntable.remove(sln.projects, index);\nend\nend\nbuilduniquedirs()\nbuildtargets(cfg)\nend\nfunction premake.bake.postprocess(prj, cfg)\ncfg.project = prj\ncfg.shortname = premake.getconfigname(cfg.name, cfg.platform, true)\ncfg.longname = premake.getconfigname(cfg.name, cfg.platform)\ncfg.location = cfg.location or cfg.basedir\nlocal platform = premake.platforms[cfg.platform]\nif platform.iscrosscompiler then\ncfg.system = cfg.platform\nelse\ncfg.system = os.get()\nend\nif cfg.kind == \"SharedLib\" and platform.nosharedlibs then\ncfg.kind = \"StaticLib\"\nend\nlocal removef" + "iles = cfg.removefiles\nif _ACTION == 'gmake' then\nremovefiles = table.join(removefiles, cfg.excludes)\nend\nlocal files = {}\nfor _, fname in ipairs(cfg.files) do\nif not table.icontains(removefiles, fname) then\ntable.insert(files, fname)\nend\nend\ncfg.files = files\nfor name, field in pairs(premake.fields) do\nif field.isflags then\nlocal values = cfg[name]\nfor _, flag in ipairs(values) do values[flag] = true end\nend\nend\ncfg.__fileconfigs = { }\nfor _, fname in ipairs(cfg.files) do\ncfg.terms.required = fname:lower()\nlocal fcfg = {}\nfor _, blk in ipairs(cfg.project.blocks) do\nif (premake.iskeywordsmatch(blk.keywords, cfg.terms)) then\nmergeobject(fcfg, blk)\nend\nend\nfcfg.name = fname\ncfg.__fileconfigs[fname] = fcfg\ntable.insert(cfg.__fileconfigs, fcfg)\nend\nend\n", /* base/api.lua */ "premake.fields =\n{\narchivesplit_size =\n{\nkind = \"string\",\nscope = \"config\",\n},\nbasedir =\n{\nkind = \"path\",\nscope = \"container\",\n},\nbuildaction =\n{\nkind = \"string\",\nscope = \"config\",\nallowed = {\n\"Compile\",\n\"Copy\",\n\"Embed\",\n\"None\"\n}\n},\nbuildoptions =\n{\nkind = \"list\",\nscope = \"config\",\n},\nbuildoptions_c =\n{\nkind = \"list\",\nscope = \"config\",\n},\nbuildoptions_cpp =\n{\nkind = \"list\",\nscope = \"config\",\n},\nbuildoptions_objc =\n{\nkind = \"list\",\nscope = \"config\",\n},\nconfigurations =\n{\nkind = \"list\",\nscope = \"solution\",\n},\ndebugargs =\n{\nkind = \"list\",\nscope = \"config\",\n},\ndebugdir =\n{\nkind = \"path\",\nscope = \"config\",\n},\ndebugenvs =\n{\nkind = \"list\",\nscope = \"config\",\n},\ndefines =\n{\nkind = \"list\",\nscope = \"config\",\n},\ndeploymentoptions =\n{\nkind = \"list\",\nscope = \"config\",\nusagecopy = true,\n},\nexcludes =\n{\nkind = \"filelist\",\nscope = \"config\",\n},\nfiles =\n{\nkind = \"filelist" @@ -90,12 +90,12 @@ const char* builtin_scripts[] = { " premake.CurrentConfiguration\nend\nif t == \"solution\" then\nif type(container) == \"project\" then\ncontainer = container.solution\nend\nif type(container) ~= \"solution\" then\ncontainer = nil\nend\nend\nlocal msg\nif (not container) then\nif (t == \"container\") then\nmsg = \"no active solution or project\"\nelseif (t == \"solution\") then\nmsg = \"no active solution\"\nelse\nmsg = \"no active solution, project, or configuration\"\nend\nend\nreturn container, msg\nend\nfunction premake.setarray(obj, fieldname, value, allowed)\nobj[fieldname] = obj[fieldname] or {}\nlocal function add(value, depth)\nif type(value) == \"table\" then\nfor _,v in ipairs(value) do\nadd(v, depth + 1)\nend\nelse\nvalue, err = premake.checkvalue(value, allowed)\nif not value then\nerror(err, depth)\nend\ntable.insert(obj[fieldname], value)\nend\nend\nif value then\nadd(value, 5)\nend\nreturn obj[fieldname]\nend\nlocal function domatchedarray(ctype, fieldname, value, matchfunc)\nlocal result = { }\nfunction makeabsolute(value, dep" "th)\nif (type(value) == \"table\") then\nfor _, item in ipairs(value) do\nmakeabsolute(item, depth + 1)\nend\nelseif type(value) == \"string\" then\nif value:find(\"*\") then\nlocal arr = matchfunc(value);\nif (premake.check_paths) and (#arr == 0) then\nerror(\"Can't find matching files for pattern :\" .. value)\nend\nmakeabsolute(arr, depth + 1)\nelse\ntable.insert(result, path.getabsolute(value))\nend\nelse\nerror(\"Invalid value in list: expected string, got \" .. type(value), depth)\nend\nend\nmakeabsolute(value, 3)\nreturn premake.setarray(ctype, fieldname, result)\nend\nfunction premake.setdirarray(ctype, fieldname, value)\nreturn domatchedarray(ctype, fieldname, value, os.matchdirs)\nend\nfunction premake.setfilearray(ctype, fieldname, value)\nreturn domatchedarray(ctype, fieldname, value, os.matchfiles)\nend\nfunction premake.setkeyvalue(ctype, fieldname, values)\nlocal container, err = premake.getobject(ctype)\nif not container then\nerror(err, 4)\nend\nif not container[fieldname] then\ncontainer[fiel" "dname] = {}\nend\nif type(values) ~= \"table\" then\nerror(\"invalid value; table expected\", 4)\nend\nlocal field = container[fieldname]\nfor key,value in pairs(values) do\nif not field[key] then\nfield[key] = {}\nend\ntable.insertflat(field[key], value)\nend\nreturn field\nend\nfunction premake.setstring(ctype, fieldname, value, allowed)\nlocal container, err = premake.getobject(ctype)\nif (not container) then\nerror(err, 4)\nend\nif (value) then\nvalue, err = premake.checkvalue(value, allowed)\nif (not value) then\nerror(err, 4)\nend\ncontainer[fieldname] = value\nend\nreturn container[fieldname]\nend\nfunction premake.remove(fieldname, value)\nlocal cfg = premake.CurrentConfiguration\ncfg.removes = cfg.removes or {}\ncfg.removes[fieldname] = premake.setarray(cfg.removes, fieldname, value)\nend\nlocal function accessor(name, value)\nlocal kind = premake.fields[name].kind\nlocal scope = premake.fields[name].scope\nlocal allowed = premake.fields[name].allowed\nif (kind == \"string\" or kind == \"path\") " - "and value then\nif type(value) ~= \"string\" then\nerror(\"string value expected\", 3)\nend\nend\nlocal container, err = premake.getobject(scope)\nif (not container) then\nerror(err, 3)\nend\nif kind == \"string\" then\nreturn premake.setstring(scope, name, value, allowed)\nelseif kind == \"path\" then\nif value then value = path.getabsolute(value) end\nreturn premake.setstring(scope, name, value)\nelseif kind == \"list\" then\nreturn premake.setarray(container, name, value, allowed)\nelseif kind == \"dirlist\" then\nreturn premake.setdirarray(container, name, value)\nelseif kind == \"filelist\" or kind == \"absolutefilelist\" then\nreturn premake.setfilearray(container, name, value)\nelseif kind == \"keyvalue\" or kind == \"keypath\" then\nreturn premake.setkeyvalue(scope, name, value)\nend\nend\nfor name, info in pairs(premake.fields) do\n_G[name] = function(value)\nreturn accessor(name, value)\nend\nif info.kind == \"list\" or\n info.kind == \"dirlist\" or\n info.kind == \"filelist\" or\n info.kind ==" - " \"absolutefilelist\"\nthen\n_G[\"remove\"..name] = function(value)\npremake.remove(name, value)\nend\nend\nend\nfunction configuration(terms)\nif not terms then\nreturn premake.CurrentConfiguration\nend\nlocal container, err = premake.getobject(\"container\")\nif (not container) then\nerror(err, 2)\nend\nlocal cfg = { }\ncfg.terms = table.flatten({terms})\ntable.insert(container.blocks, cfg)\npremake.CurrentConfiguration = cfg\ncfg.keywords = { }\nfor _, word in ipairs(cfg.terms) do\ntable.insert(cfg.keywords, path.wildcards(word):lower())\nend\nfor name, field in pairs(premake.fields) do\nif (field.kind ~= \"string\" and field.kind ~= \"path\") then\ncfg[name] = { }\nend\nend\nreturn cfg\nend\nlocal function creategroup(name, sln, parent, inpath)\nlocal group = {}\nsetmetatable(group, {\n__type = \"group\"\n})\ntable.insert(sln.groups, group)\nsln.groups[inpath] = group\ngroup.solution = sln\ngroup.name = name\ngroup.uuid = os.uuid(group.name)\ngroup.parent = parent\nreturn group\nend\nlocal function createg" - "roupsfrompath(inpath, sln)\nif inpath == nil then return nil end\ninpath = path.translate(inpath, \"/\")\nlocal groups = string.explode(inpath, \"/\")\nlocal curpath = \"\"\nlocal lastgroup = nil\nfor i, v in ipairs(groups) do\ncurpath = curpath .. \"/\" .. v:lower()\nlocal group = sln.groups[curpath]\nif group == nil then\ngroup = creategroup(v, sln, lastgroup, curpath)\nend\nlastgroup = group\nend\nreturn lastgroup\nend\nlocal function createproject(name, sln, isUsage)\nlocal prj = {}\nsetmetatable(prj, {\n__type = \"project\",\n})\ntable.insert(sln.projects, prj)\nif(isUsage) then\nif(sln.projects[name]) then\nsln.projects[name].usageProj = prj;\nelse\nsln.projects[name] = prj\nend\nelse\nif(sln.projects[name]) then\nprj.usageProj = sln.projects[name];\nend\nsln.projects[name] = prj\nend\nlocal group = creategroupsfrompath(premake.CurrentGroup, sln)\nprj.solution = sln\nprj.name = name\nprj.basedir = os.getcwd()\nprj.uuid = os.uuid(prj.name)\nprj.blocks = { }\nprj.us" - "age = isUsage\nprj.group = group\nreturn prj;\nend\nfunction usage(name)\nif (not name) then\nif(type(premake.CurrentContainer) ~= \"project\") then return nil end\nif(not premake.CurrentContainer.usage) then return nil end\nreturn premake.CurrentContainer\nend\nlocal sln\nif (type(premake.CurrentContainer) == \"project\") then\nsln = premake.CurrentContainer.solution\nelse\nsln = premake.CurrentContainer\nend\nif (type(sln) ~= \"solution\") then\nerror(\"no active solution\", 2)\nend\nif((not sln.projects[name]) or\n((not sln.projects[name].usage) and (not sln.projects[name].usageProj))) then\npremake.CurrentContainer = createproject(name, sln, true)\nelse\npremake.CurrentContainer = iff(sln.projects[name].usage,\nsln.projects[name], sln.projects[name].usageProj)\nend\nconfiguration { }\nreturn premake.CurrentContainer\nend\nfunction project(name)\nif (not name) then\nif(type(premake.CurrentContainer) ~= \"project\") then return nil end\nif(premake.CurrentContainer.usage) then return nil end" - "\nreturn premake.CurrentContainer\nend\nlocal sln\nif (type(premake.CurrentContainer) == \"project\") then\nsln = premake.CurrentContainer.solution\nelse\nsln = premake.CurrentContainer\nend\nif (type(sln) ~= \"solution\") then\nerror(\"no active solution\", 2)\nend\nif((not sln.projects[name]) or sln.projects[name].usage) then\npremake.CurrentContainer = createproject(name, sln)\nelse\npremake.CurrentContainer = sln.projects[name];\nend\nconfiguration { }\nreturn premake.CurrentContainer\nend\nfunction solution(name)\nif not name then\nif type(premake.CurrentContainer) == \"project\" then\nreturn premake.CurrentContainer.solution\nelse\nreturn premake.CurrentContainer\nend\nend\npremake.CurrentContainer = premake.solution.get(name)\nif (not premake.CurrentContainer) then\npremake.CurrentContainer = premake.solution.new(name)\nend\nconfiguration { }\nreturn premake.CurrentContainer\nend\nfunction group(name)\nif not name then\nreturn premake.CurrentGroup\nend\npremake.CurrentGroup = name\nreturn premake.Curren" - "tGroup\nend\nfunction newaction(a)\npremake.action.add(a)\nend\nfunction newoption(opt)\npremake.option.add(opt)\nend\n", + "and value then\nif type(value) ~= \"string\" then\nerror(\"string value expected\", 3)\nend\nend\nlocal container, err = premake.getobject(scope)\nif (not container) then\nerror(err, 3)\nend\nif kind == \"string\" then\nreturn premake.setstring(scope, name, value, allowed)\nelseif kind == \"path\" then\nif value then value = path.getabsolute(value) end\nreturn premake.setstring(scope, name, value)\nelseif kind == \"list\" then\nreturn premake.setarray(container, name, value, allowed)\nelseif kind == \"dirlist\" then\nreturn premake.setdirarray(container, name, value)\nelseif kind == \"filelist\" or kind == \"absolutefilelist\" then\nreturn premake.setfilearray(container, name, value)\nelseif kind == \"keyvalue\" or kind == \"keypath\" then\nreturn premake.setkeyvalue(scope, name, value)\nend\nend\nfor name, info in pairs(premake.fields) do\n_G[name] = function(value)\nreturn accessor(name, value)\nend\nif info.kind == \"list\"\nor info.kind == \"dirlist\"\nor info.kind == \"filelist\"\nor info.kind == \"absolu" + "tefilelist\"\nthen\nif name ~= \"removefiles\"\nand name ~= \"files\" then\n_G[\"remove\"..name] = function(value)\npremake.remove(name, value)\nend\nend\nend\nend\nfunction configuration(terms)\nif not terms then\nreturn premake.CurrentConfiguration\nend\nlocal container, err = premake.getobject(\"container\")\nif (not container) then\nerror(err, 2)\nend\nlocal cfg = { }\ncfg.terms = table.flatten({terms})\ntable.insert(container.blocks, cfg)\npremake.CurrentConfiguration = cfg\ncfg.keywords = { }\nfor _, word in ipairs(cfg.terms) do\ntable.insert(cfg.keywords, path.wildcards(word):lower())\nend\nfor name, field in pairs(premake.fields) do\nif (field.kind ~= \"string\" and field.kind ~= \"path\") then\ncfg[name] = { }\nend\nend\nreturn cfg\nend\nlocal function creategroup(name, sln, parent, inpath)\nlocal group = {}\nsetmetatable(group, {\n__type = \"group\"\n})\ntable.insert(sln.groups, group)\nsln.groups[inpath] = group\ngroup.solution = sln\ngroup.name = name\ngroup.uuid = os.uuid(group.name)\ngroup.paren" + "t = parent\nreturn group\nend\nlocal function creategroupsfrompath(inpath, sln)\nif inpath == nil then return nil end\ninpath = path.translate(inpath, \"/\")\nlocal groups = string.explode(inpath, \"/\")\nlocal curpath = \"\"\nlocal lastgroup = nil\nfor i, v in ipairs(groups) do\ncurpath = curpath .. \"/\" .. v:lower()\nlocal group = sln.groups[curpath]\nif group == nil then\ngroup = creategroup(v, sln, lastgroup, curpath)\nend\nlastgroup = group\nend\nreturn lastgroup\nend\nlocal function createproject(name, sln, isUsage)\nlocal prj = {}\nsetmetatable(prj, {\n__type = \"project\",\n})\ntable.insert(sln.projects, prj)\nif(isUsage) then\nif(sln.projects[name]) then\nsln.projects[name].usageProj = prj;\nelse\nsln.projects[name] = prj\nend\nelse\nif(sln.projects[name]) then\nprj.usageProj = sln.projects[name];\nend\nsln.projects[name] = prj\nend\nlocal group = creategroupsfrompath(premake.CurrentGroup, sln)\nprj.solution = sln\nprj.name = name\nprj.basedir = os.getcwd()\nprj.uuid " + "= os.uuid(prj.name)\nprj.blocks = { }\nprj.usage = isUsage\nprj.group = group\nreturn prj;\nend\nfunction usage(name)\nif (not name) then\nif(type(premake.CurrentContainer) ~= \"project\") then return nil end\nif(not premake.CurrentContainer.usage) then return nil end\nreturn premake.CurrentContainer\nend\nlocal sln\nif (type(premake.CurrentContainer) == \"project\") then\nsln = premake.CurrentContainer.solution\nelse\nsln = premake.CurrentContainer\nend\nif (type(sln) ~= \"solution\") then\nerror(\"no active solution\", 2)\nend\nif((not sln.projects[name]) or\n((not sln.projects[name].usage) and (not sln.projects[name].usageProj))) then\npremake.CurrentContainer = createproject(name, sln, true)\nelse\npremake.CurrentContainer = iff(sln.projects[name].usage,\nsln.projects[name], sln.projects[name].usageProj)\nend\nconfiguration { }\nreturn premake.CurrentContainer\nend\nfunction project(name)\nif (not name) then\nif(type(premake.CurrentContainer) ~= \"project\") then return nil end\ni" + "f(premake.CurrentContainer.usage) then return nil end\nreturn premake.CurrentContainer\nend\nlocal sln\nif (type(premake.CurrentContainer) == \"project\") then\nsln = premake.CurrentContainer.solution\nelse\nsln = premake.CurrentContainer\nend\nif (type(sln) ~= \"solution\") then\nerror(\"no active solution\", 2)\nend\nif((not sln.projects[name]) or sln.projects[name].usage) then\npremake.CurrentContainer = createproject(name, sln)\nelse\npremake.CurrentContainer = sln.projects[name];\nend\nconfiguration { }\nreturn premake.CurrentContainer\nend\nfunction solution(name)\nif not name then\nif type(premake.CurrentContainer) == \"project\" then\nreturn premake.CurrentContainer.solution\nelse\nreturn premake.CurrentContainer\nend\nend\npremake.CurrentContainer = premake.solution.get(name)\nif (not premake.CurrentContainer) then\npremake.CurrentContainer = premake.solution.new(name)\nend\nconfiguration { }\nreturn premake.CurrentContainer\nend\nfunction group(name)\nif not name then\nreturn premake.CurrentGroup\nen" + "d\npremake.CurrentGroup = name\nreturn premake.CurrentGroup\nend\nfunction newaction(a)\npremake.action.add(a)\nend\nfunction newoption(opt)\npremake.option.add(opt)\nend\n", /* base/cmdline.lua */ "newoption \n{\ntrigger = \"cc\",\nvalue = \"VALUE\",\ndescription = \"Choose a C/C++ compiler set\",\nallowed = {\n{ \"gcc\", \"GNU GCC (gcc/g++)\" },\n{ \"ow\", \"OpenWatcom\" },\n}\n}\nnewoption\n{\ntrigger = \"dotnet\",\nvalue = \"VALUE\",\ndescription = \"Choose a .NET compiler set\",\nallowed = {\n{ \"msnet\", \"Microsoft .NET (csc)\" },\n{ \"mono\", \"Novell Mono (mcs)\" },\n{ \"pnet\", \"Portable.NET (cscc)\" },\n}\n}\nnewoption\n{\ntrigger = \"file\",\nvalue = \"FILE\",\ndescription = \"Read FILE as a Premake script; default is 'premake4.lua'\"\n}\nnewoption\n{\ntrigger = \"help\",\ndescription = \"Display this information\"\n}\nnewoption\n{\ntrigger = \"os\",\nvalue = \"VALUE\",\ndescription = \"Generate files for a different operating system\",\nallowed = {\n{ \"bsd\", \"OpenBSD, NetBSD, or FreeBSD\" },\n{ \"linux\", \"Linux\" },\n{ \"macosx\", \"Apple Mac OS X\" },\n{ \"windows\", \"Microsoft Windows\" },\n}\n}\nnewoption\n{" @@ -108,7 +108,7 @@ const char* builtin_scripts[] = { " 1\n end\n end\n return tableAppearances\nend\nlocal function parse_filter(filter)\n if type(filter) == 'function' then return filter end\n -- not a function, so it must be a table or table-like\n filter = type(filter) == 'table' and filter or {filter}\n local dictionary = {}\n for _,v in pairs(filter) do dictionary[v] = true end\n return function(x) return dictionary[x] end\nend\nlocal function makePath(path, key)\n local newPath, len = {}, #path\n for i=1, len do newPath[i] = path[i] end\n newPath[len+1] = key\n return newPath\nend\nfunction inspect(rootObject, options)\n options = options or {}\n local depth = options.depth or math.huge\n local filter = parse_filter(options.filter or {})\n local tableAppearances = countTableAppearances(rootObject)\n local buffer = {}\n local maxIds = setmetatable({}, maxIdsMetaTable)\n local ids = setmetatable({}, idsMetaTable)\n local level = 0\n local blen = 0 -- buffer length\n local function puts(...)\n local args = {...}\n " "for i=1, #args do\n blen = blen + 1\n buffer[blen] = tostring(args[i])\n end\n end\n local function down(f)\n level = level + 1\n f()\n level = level - 1\n end\n local function tabify()\n puts(\"\\n\", string.rep(\" \", level))\n end\n local function commaControl(needsComma)\n if needsComma then puts(',') end\n return true\n end\n local function alreadyVisited(v)\n return ids[type(v)][v] ~= nil\n end\n local function getId(v)\n local tv = type(v)\n local id = ids[tv][v]\n if not id then\n id = maxIds[tv] + 1\n maxIds[tv] = id\n ids[tv][v] = id\n end\n return id\n end\n local putValue -- forward declaration that needs to go before putTable & putKey\n local function putKey(k)\n if isIdentifier(k) then return puts(k) end\n puts( \"[\" )\n putValue(k, {})\n puts(\"]\")\n end\n local function putTable(t, path)\n if alreadyVisited(t) then\n puts('')\n elseif level >= depth then\n " "puts('{...}')\n else\n if tableAppearances[t] > 1 then puts('<', getId(t), '>') end\n local dictKeys = getDictionaryKeys(t)\n local length = #t\n local mt = getmetatable(t)\n local to_string_result = getToStringResultSafely(t, mt)\n puts('{')\n down(function()\n if to_string_result then\n puts(' -- ', escape(to_string_result))\n if length >= 1 then tabify() end -- tabify the array values\n end\n local needsComma = false\n for i=1, length do\n needsComma = commaControl(needsComma)\n puts(' ')\n putValue(t[i], makePath(path, i))\n end\n for _,k in ipairs(dictKeys) do\n needsComma = commaControl(needsComma)\n tabify()\n putKey(k)\n puts(' = ')\n putValue(t[k], makePath(path, k))\n end\n if mt then\n needsComma = commaControl(needsComma)\n tabify()\n puts(' = '" - ")\n putValue(mt, makePath(path, ''))\n end\n end)\n if #dictKeys > 0 or mt then -- dictionary table. Justify closing }\n tabify()\n elseif length > 0 then -- array tables have one extra space before closing }\n puts(' ')\n end\n puts('}')\n end\n end\n -- putvalue is forward-declared before putTable & putKey\n putValue = function(v, path)\n if filter(v, path) then\n puts('')\n else\n local tv = type(v)\n if tv == 'string' then\n puts(smartQuote(escape(v)))\n elseif tv == 'number' or tv == 'boolean' or tv == 'nil' then\n puts(tostring(v))\n elseif tv == 'table' then\n putTable(v, path)\n else\n puts('<',tv,' ',getId(v),'>')\n end\n end\n end\n putValue(rootObject, {})\n return table.concat(buffer)\nend\nfunction printtable(name, table)\nprint(\"--- \" .. name)\nprint(inspect(table))\nprint(\"---\")\nend\n", + ")\n putValue(mt, makePath(path, ''))\n end\n end)\n if #dictKeys > 0 or mt then -- dictionary table. Justify closing }\n tabify()\n elseif length > 0 then -- array tables have one extra space before closing }\n puts(' ')\n end\n puts('}')\n end\n end\n -- putvalue is forward-declared before putTable & putKey\n putValue = function(v, path)\n if filter(v, path) then\n puts('')\n else\n local tv = type(v)\n if tv == 'string' then\n puts(smartQuote(escape(v)))\n elseif tv == 'number' or tv == 'boolean' or tv == 'nil' then\n puts(tostring(v))\n elseif tv == 'table' then\n putTable(v, path)\n else\n puts('<',tv,' ',getId(v),'>')\n end\n end\n end\n putValue(rootObject, {})\n return table.concat(buffer)\nend\nfunction printtable(name, table)\nprint(\"table: \", name, inspect(table), \"\\n\")\nend\nfunction printstack()\nprint(debug.traceback(), \"\\n\")\nend\n", /* tools/dotnet.lua */ "premake.dotnet = { }\npremake.dotnet.namestyle = \"windows\"\nlocal flags =\n{\nFatalWarning = \"/warnaserror\",\nOptimize = \"/optimize\",\nOptimizeSize = \"/optimize\",\nOptimizeSpeed = \"/optimize\",\nSymbols = \"/debug\",\nUnsafe = \"/unsafe\"\n}\nfunction premake.dotnet.getbuildaction(fcfg)\nlocal ext = path.getextension(fcfg.name):lower()\nif fcfg.buildaction == \"Compile\" or ext == \".cs\" then\nreturn \"Compile\"\nelseif fcfg.buildaction == \"Embed\" or ext == \".resx\" then\nreturn \"EmbeddedResource\"\nelseif fcfg.buildaction == \"Copy\" or ext == \".asax\" or ext == \".aspx\" then\nreturn \"Content\"\nelse\nreturn \"None\"\nend\nend\nfunction premake.dotnet.getcompilervar(cfg)\nif (_OPTIONS.dotnet == \"msnet\") then\nreturn \"csc\"\nelseif (_OPTIONS.dotnet == \"mono\") then\nif (cfg.framework <= \"1.1\") then\nreturn \"mcs\"\nelseif (cfg.framework >= \"4.0\") then\nreturn \"dmcs\"\nelse \nreturn \"gmcs\"\nend\nelse\nreturn \"cscc\"\nend\nend\nfunction premake.dotnet.getfla" @@ -180,16 +180,16 @@ const char* builtin_scripts[] = { /* actions/make/make_cpp.lua */ "premake.make.cpp = { }\npremake.make.override = { }\nlocal cpp = premake.make.cpp\nlocal make = premake.make\nfunction premake.make_cpp(prj)\nlocal cc = premake.gettool(prj)\nlocal platforms = premake.filterplatforms(prj.solution, cc.platforms, \"Native\")\npremake.gmake_cpp_header(prj, cc, platforms)\nfor _, platform in ipairs(platforms) do\nfor cfg in premake.eachconfig(prj, platform) do\npremake.gmake_cpp_config(prj, cfg, cc)\nend\nend\nlocal objdirs = {}\nfor _, file in ipairs(prj.files) do\nif path.iscppfile(file) then\nobjdirs[_MAKE.esc(path.getdirectory(path.trimdots(file)))] = 1\nend\nend\n_p('OBJDIRS := \\\\')\n_p('\\t$(OBJDIR) \\\\')\nfor dir, _ in pairs(objdirs) do\n_p('\\t$(OBJDIR)/%s \\\\', dir)\nend\n_p('')\n_p('RESOURCES := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.isresourcefile(file) then\n_p('\\t$(OBJDIR)/%s.res \\\\', _MAKE.esc(path.getbasename(file)))\nend\nend\n_p('')\n_p('.PHONY: clean prebuild prelink')\n_p('')\nif os.is(\"MacOSX\") and prj.kind == \"WindowedApp\" then\n_p('al" - "l: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET) $(dir $(TARGETDIR))PkgInfo $(dir $(TARGETDIR))Info.plist')\nelse\n_p('all: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET)')\nend\n_p('\\t@:')\n_p('')\nif (prj.kind == \"StaticLib\" and prj.options.ArchiveSplit) then\n_p('define max_args')\n_p('\\t$(eval _args:=)')\n_p('\\t$(foreach obj,$3,$(eval _args+=$(obj))$(if $(word $2,$(_args)),$1$(_args)$(EOL)$(eval _args:=)))')\n_p('\\t$(if $(_args),$1$(_args))')\n_p('endef')\n_p('')\n_p('define EOL')\n_p('')\n_p('')\n_p('endef')\n_p('')\nend\n_p('$(TARGET): $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES)')\nif prj.kind == \"StaticLib\" then\nif prj.msgarchiving then\n_p('\\t@echo ' .. prj.msgarchiving)\nelse\n_p('\\t@echo Archiving %s', prj.name)\nend\nif (not prj.archivesplit_size) then \nprj.archivesplit_size=200\nend\nif (not prj.options.ArchiveSplit) then\n_p('\\t$(SILENT) $(LINKCMD) $(OBJECTS)')\nelse\n_p('\\t$(call RM,$(TARGET))')\n_p('\\t@$(call max_args,$(LINKCMD),'.. prj.archivesplit_size ..',$(OBJECTS))')\n_" - "p('\\t$(SILENT) $(LINKCMD_NDX)')\nend\nelse\nif prj.msglinking then\n_p('\\t@echo ' .. prj.msglinking)\nelse\n_p('\\t@echo Linking %s', prj.name)\nend\n_p('\\t$(SILENT) $(LINKCMD)')\nend\n_p('\\t$(POSTBUILDCMDS)')\n_p('')\n_p('$(TARGETDIR):')\npremake.make_mkdirrule(\"$(TARGETDIR)\")\n_p('$(OBJDIRS):')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCreatingMessage\")) then\n_p('\\t@echo Creating $(OBJDIR)')\nend\n_p('\\t-$(call MKDIR,$@)')\n_p('')\nif os.is(\"MacOSX\") and prj.kind == \"WindowedApp\" then\n_p('$(dir $(TARGETDIR))PkgInfo:')\n_p('$(dir $(TARGETDIR))Info.plist:')\n_p('')\nend\n_p('clean:')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCleaningMessage\")) then\n_p('\\t@echo Cleaning %s', prj.name)\nend\n_p('ifeq (posix,$(SHELLTYPE))')\n_p('\\t$(SILENT) rm -f $(TARGET)')\n_p('\\t$(SILENT) rm -rf $(OBJDIR)')\n_p('else')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(TARGET)) del $(subst /,\\\\\\\\,$(TARGET))')\n" - "_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(OBJDIR)) rmdir /s /q $(subst /,\\\\\\\\,$(OBJDIR))')\n_p('endif')\n_p('')\n_p('prebuild:')\n_p('\\t$(PREBUILDCMDS)')\n_p('')\n_p('prelink:')\n_p('\\t$(PRELINKCMDS)')\n_p('')\ncpp.pchrules(prj)\ncpp.fileRules(prj)\n_p('-include $(OBJECTS:%%.o=%%.d)')\n_p('ifneq (,$(PCH))')\n_p(' -include $(OBJDIR)/$(notdir $(PCH)).d')\n_p('endif')\nend\nfunction premake.gmake_cpp_header(prj, cc, platforms)\n_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))\n_p('endif')\n_p('')\n_p('ifndef verbose')\n_p(' SILENT = @')\n_p('endif')\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('ifeq (posix,$(SHELLTYPE))')\n_p(' MKDIR = $(SILENT) mkdir -p \"$(1)\"')\n_p(' COP" - "Y = $(SILENT) cp -fR \"$(1)\" \"$(2)\"')\n_p(' RM= $(SILENT) rm -f \"$(1)\"')\n_p('else')\n_p(' MKDIR = $(SILENT) mkdir \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p(' COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')\n_p(' RM = $(SILENT) del /F \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p('endif')\n_p('')\n_p('CC = %s', cc.cc)\n_p('CXX = %s', cc.cxx)\n_p('AR = %s', cc.ar)\n_p('')\n_p('ifndef RESCOMP')\n_p(' ifdef WINDRES')\n_p(' RESCOMP = $(WINDRES)')\n_p(' else')\n_p(' RESCOMP = windres')\n_p(' endif')\n_p('endif')\n_p('')\nend\nfunction premake.gmake_cpp_config(prj, cfg, cc)\n_p('ifeq ($(config),%s)', _MAKE.esc(cfg.shortname))\ncpp.platformtools(cfg, cc)\n_p(' ' .. (table.contains(premake.make.override,\"OBJDIR\") and \"override \" or \"\") .. 'OBJDIR = %s', _MAKE.esc(cfg.objectsdir))\n_p(' ' .. (table.contains(premake.make.override,\"TARGETDIR\") and \"override \" or \"\") .. 'TARGETDIR = %s', _MAKE.esc(cfg.buildtarget.directory)" - ")\n_p(' ' .. (table.contains(premake.make.override,\"TARGET\") and \"override \" or \"\") .. 'TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name))\n_p(' DEFINES +=%s', make.list(cc.getdefines(cfg.defines)))\n_p(' INCLUDES +=%s', make.list(cc.getincludedirs(cfg.includedirs)))\ncpp.pchconfig(cfg)\ncpp.flags(cfg, cc)\ncpp.linker(prj, cfg, cc)\n_p(' OBJECTS := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.iscppfile(file) then\nlocal excluded = false\nfor _, exclude in ipairs(cfg.excludes) do\nexcluded = (exclude == file)\nif (excluded) then break end\nend\nif excluded == false then\n_p('\\t$(OBJDIR)/%s.o \\\\'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n)\nend\nend\nend\n_p('')\n_p(' define PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define PRELINKCMDS')\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link commands')\n_" - "p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-build commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\nmake.settings(cfg, cc)\n_p('endif')\n_p('')\nend\nfunction cpp.platformtools(cfg, cc)\nlocal platform = cc.platforms[cfg.platform]\nif platform.cc then\n_p(' CC = %s', platform.cc)\nend\nif platform.cxx then\n_p(' CXX = %s', platform.cxx)\nend\nif platform.ar then\n_p(' AR = %s', platform.ar)\nend\nend\nfunction cpp.flags(cfg, cc)\nif cfg.pchheader and not cfg.flags.NoPCH then\n_p(' FORCE_INCLUDE += -include $(OBJDIR)/$(notdir $(PCH))')\nend\nif #cfg.forcedincludes > 0 then\n_p(' FORCE_INCLUDE += -include %s'\n,premake.esc(table.concat(cfg.forcedincludes, \";\")))\nend\n_p(' ALL_CPPFLAGS += $(CPPFLAGS) %s $(DEFINES) $(INCLUDES)', table.concat(cc.getcppflags(cfg), \" \"))\n_p(' ALL_CFLAGS " - " += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c)))\n_p(' ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp)))\n_p(' ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_objc)))\n_p(' ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)%s',\n make.list(table.join(cc.getdefines(cfg.resdefines),\n cc.getincludedirs(cfg.resincludedirs), cfg.resoptions)))\nend\nfunction cpp.linker(prj, cfg, cc)\n_p(' ALL_LDFLAGS += $(LDFLAGS)%s', make.list(table.join(cc.getlibdirflags(cfg), cc.getldflags(cfg), cfg.linkoptions)))\n_p(' LDDEPS +=%s', make.list(_MAKE.esc(premake.getlinks(cfg, \"siblings\", \"fullpath\"))))\n_p(' LIBS += $(LDDEPS)%s', make.list(cc.getlinkflags(cfg)))\nif c" - "fg.kind == \"StaticLib\" then\nif cfg.platform:startswith(\"Universal\") then\n_p(' LINKCMD = libtool -o $(TARGET)')\nelse\nif (not prj.options.ArchiveSplit) then\nif cc.llvm then\n_p(' LINKCMD = $(AR) rcs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -rcs $(TARGET)')\nend\nelse\nif cc.llvm then\n_p(' LINKCMD = $(AR) qc $(TARGET)')\n_p(' LINKCMD_NDX= $(AR) cs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -qc $(TARGET)')\n_p(' LINKCMD_NDX= $(AR) -cs $(TARGET)')\nend\nend\nend\nelse\nlocal tool = iif(cfg.language == \"C\", \"CC\", \"CXX\")\n_p(' LINKCMD = $(%s) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)', tool)\nend\nend\nfunction cpp.pchconfig(cfg)\nif not cfg.pchheader or cfg.flags.NoPCH then\nreturn\nend\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbrea" - "k\nend\nend\n_p(' PCH = %s', _MAKE.esc(pch))\n_p(' GCH = $(OBJDIR)/$(notdir $(PCH)).gch')\nend\nfunction cpp.pchrules(prj)\n_p('ifneq (,$(PCH))')\n_p('$(GCH): $(PCH)')\n_p('\\t@echo $(notdir $<)')\nlocal cmd = iif(prj.language == \"C\", \"$(CC) -x c-header $(ALL_CFLAGS)\", \"$(CXX) -x c++-header $(ALL_CXXFLAGS)\")\n_p('\\t$(SILENT) %s -MMD -MP $(DEFINES) $(INCLUDES) -o \"$@\" -MF \"$(@:%%.gch=%%.d)\" -c \"$<\"', cmd)\n_p('endif')\n_p('')\nend\nfunction cpp.fileRules(prj)\nfor _, file in ipairs(prj.files or {}) do\nif path.iscppfile(file) then\n_p('$(OBJDIR)/%s.o: %s'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n)\nif (path.isobjcfile(file) and prj.msgcompile_objc) then\n_p('\\t@echo ' .. prj.msgcompile_objc)\nelseif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nif (path.isobjcfile(file)) then\n_p('\\t$(SILENT) $(CXX) $(ALL_OBJCFLAGS) $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.o=%%.d) -c \"$<\"')\nelse\ncpp.buildcommand(path.i" - "scfile(file) and not prj.options.ForceCPP, \"o\")\nend\n_p('')\nelseif (path.getextension(file) == \".rc\") then\n_p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file))\nif prj.msgresource then\n_p('\\t@echo ' .. prj.msgresource)\nelse\n_p('\\t@echo $(notdir $<)')\nend\n_p('\\t$(SILENT) $(RESCOMP) $< -O coff -o \"$@\" $(ALL_RESFLAGS)')\n_p('')\nend\nend\nend\nfunction cpp.buildcommand(iscfile, objext)\nlocal flags = iif(iscfile, '$(CC) $(ALL_CFLAGS)', '$(CXX) $(ALL_CXXFLAGS)')\n_p('\\t$(SILENT) %s $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.%s=%%.d) -c \"$<\"', flags, objext)\nend\n", + "l: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET) $(dir $(TARGETDIR))PkgInfo $(dir $(TARGETDIR))Info.plist')\nelse\n_p('all: $(TARGETDIR) $(OBJDIRS) prebuild prelink $(TARGET)')\nend\n_p('\\t@:')\n_p('')\nif (prj.kind == \"StaticLib\" and prj.options.ArchiveSplit) then\n_p('define max_args')\n_p('\\t$(eval _args:=)')\n_p('\\t$(foreach obj,$3,$(eval _args+=$(obj))$(if $(word $2,$(_args)),$1$(_args)$(EOL)$(eval _args:=)))')\n_p('\\t$(if $(_args),$1$(_args))')\n_p('endef')\n_p('')\n_p('define EOL')\n_p('')\n_p('')\n_p('endef')\n_p('')\nend\n_p('$(TARGET): $(GCH) $(OBJECTS) $(LDDEPS) $(RESOURCES)')\nif prj.kind == \"StaticLib\" then\nif prj.msgarchiving then\n_p('\\t@echo ' .. prj.msgarchiving)\nelse\n_p('\\t@echo Archiving %s', prj.name)\nend\nif (not prj.archivesplit_size) then\nprj.archivesplit_size=200\nend\nif (not prj.options.ArchiveSplit) then\n_p('\\t$(SILENT) $(LINKCMD) $(OBJECTS)')\nelse\n_p('\\t$(call RM,$(TARGET))')\n_p('\\t@$(call max_args,$(LINKCMD),'.. prj.archivesplit_size ..',$(OBJECTS))')\n_p" + "('\\t$(SILENT) $(LINKCMD_NDX)')\nend\nelse\nif prj.msglinking then\n_p('\\t@echo ' .. prj.msglinking)\nelse\n_p('\\t@echo Linking %s', prj.name)\nend\n_p('\\t$(SILENT) $(LINKCMD)')\nend\n_p('\\t$(POSTBUILDCMDS)')\n_p('')\n_p('$(TARGETDIR):')\npremake.make_mkdirrule(\"$(TARGETDIR)\")\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCreatingMessage\")) then\n_p('objdirmessage:')\n_p('\\t@echo Creating $(OBJDIR)')\n_p('')\nend\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCreatingMessage\")) then\n_p('$(OBJDIRS): objdirmessage')\nelse\n_p('$(OBJDIRS):')\nend\n_p('\\t-$(call MKDIR,$@)')\n_p('')\nif os.is(\"MacOSX\") and prj.kind == \"WindowedApp\" then\n_p('$(dir $(TARGETDIR))PkgInfo:')\n_p('$(dir $(TARGETDIR))Info.plist:')\n_p('')\nend\n_p('clean:')\nif (not prj.solution.messageskip) or (not table.contains(prj.solution.messageskip, \"SkipCleaningMessage\")) then\n_p('\\t@echo Cleaning %s', prj.name)\nend\n_p('ifeq (posix,$(SHELLT" + "YPE))')\n_p('\\t$(SILENT) rm -f $(TARGET)')\n_p('\\t$(SILENT) rm -rf $(OBJDIR)')\n_p('else')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(TARGET)) del $(subst /,\\\\\\\\,$(TARGET))')\n_p('\\t$(SILENT) if exist $(subst /,\\\\\\\\,$(OBJDIR)) rmdir /s /q $(subst /,\\\\\\\\,$(OBJDIR))')\n_p('endif')\n_p('')\n_p('prebuild:')\n_p('\\t$(PREBUILDCMDS)')\n_p('')\n_p('prelink:')\n_p('\\t$(PRELINKCMDS)')\n_p('')\ncpp.pchrules(prj)\ncpp.fileRules(prj)\n_p('-include $(OBJECTS:%%.o=%%.d)')\n_p('ifneq (,$(PCH))')\n_p(' -include $(OBJDIR)/$(notdir $(PCH)).d')\n_p('endif')\nend\nfunction premake.gmake_cpp_header(prj, cc, platforms)\n_p('# %s project makefile autogenerated by GENie', premake.action.current().shortname)\n_p('ifndef config')\n_p(' config=%s', _MAKE.esc(premake.getconfigname(prj.solution.configurations[1], platforms[1], true)))\n_p('endif')\n_p('')\n_p('ifndef verbose')\n_p(' SILENT = @')\n_p('endif')\n_p('')\n_p('SHELLTYPE := msdos')\n_p('ifeq (,$(ComSpec)$(COMSPEC))')\n_p(' SHELLTYPE := posix')\n_p('endi" + "f')\n_p('ifeq (/bin,$(findstring /bin,$(SHELL)))')\n_p(' SHELLTYPE := posix')\n_p('endif')\n_p('')\n_p('ifeq (posix,$(SHELLTYPE))')\n_p(' MKDIR = $(SILENT) mkdir -p \"$(1)\"')\n_p(' COPY = $(SILENT) cp -fR \"$(1)\" \"$(2)\"')\n_p(' RM= $(SILENT) rm -f \"$(1)\"')\n_p('else')\n_p(' MKDIR = $(SILENT) mkdir \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p(' COPY = $(SILENT) copy /Y \"$(subst /,\\\\\\\\,$(1))\" \"$(subst /,\\\\\\\\,$(2))\"')\n_p(' RM = $(SILENT) del /F \"$(subst /,\\\\\\\\,$(1))\" 2> nul || exit 0')\n_p('endif')\n_p('')\n_p('CC = %s', cc.cc)\n_p('CXX = %s', cc.cxx)\n_p('AR = %s', cc.ar)\n_p('')\n_p('ifndef RESCOMP')\n_p(' ifdef WINDRES')\n_p(' RESCOMP = $(WINDRES)')\n_p(' else')\n_p(' RESCOMP = windres')\n_p(' endif')\n_p('endif')\n_p('')\nend\nfunction premake.gmake_cpp_config(prj, cfg, cc)\n_p('ifeq ($(config),%s)', _MAKE.esc(cfg.shortname))\ncpp.platformtools(cfg, cc)\n_p(' ' .. (table.contains(premake.make.override,\"OBJDIR\") and \"override \" or \"\") .. 'OBJDIR " + " = %s', _MAKE.esc(cfg.objectsdir))\n_p(' ' .. (table.contains(premake.make.override,\"TARGETDIR\") and \"override \" or \"\") .. 'TARGETDIR = %s', _MAKE.esc(cfg.buildtarget.directory))\n_p(' ' .. (table.contains(premake.make.override,\"TARGET\") and \"override \" or \"\") .. 'TARGET = $(TARGETDIR)/%s', _MAKE.esc(cfg.buildtarget.name))\n_p(' DEFINES +=%s', make.list(cc.getdefines(cfg.defines)))\n_p(' INCLUDES +=%s', make.list(cc.getincludedirs(cfg.includedirs)))\ncpp.pchconfig(cfg)\ncpp.flags(cfg, cc)\ncpp.linker(prj, cfg, cc)\n_p(' OBJECTS := \\\\')\nfor _, file in ipairs(prj.files) do\nif path.iscppfile(file) then\nif not table.icontains(cfg.excludes, file) then\n_p('\\t$(OBJDIR)/%s.o \\\\'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n)\nend\nend\nend\n_p('')\n_p(' define PREBUILDCMDS')\nif #cfg.prebuildcommands > 0 then\n_p('\\t@echo Running pre-build commands')\n_p('\\t%s', table.implode(cfg.prebuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define PRELINKCMDS')" + "\nif #cfg.prelinkcommands > 0 then\n_p('\\t@echo Running pre-link commands')\n_p('\\t%s', table.implode(cfg.prelinkcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\n_p(' define POSTBUILDCMDS')\nif #cfg.postbuildcommands > 0 then\n_p('\\t@echo Running post-build commands')\n_p('\\t%s', table.implode(cfg.postbuildcommands, \"\", \"\", \"\\n\\t\"))\nend\n_p(' endef')\nmake.settings(cfg, cc)\n_p('endif')\n_p('')\nend\nfunction cpp.platformtools(cfg, cc)\nlocal platform = cc.platforms[cfg.platform]\nif platform.cc then\n_p(' CC = %s', platform.cc)\nend\nif platform.cxx then\n_p(' CXX = %s', platform.cxx)\nend\nif platform.ar then\n_p(' AR = %s', platform.ar)\nend\nend\nfunction cpp.flags(cfg, cc)\nif cfg.pchheader and not cfg.flags.NoPCH then\n_p(' FORCE_INCLUDE += -include $(OBJDIR)/$(notdir $(PCH))')\nend\nif #cfg.forcedincludes > 0 then\n_p(' FORCE_INCLUDE += -include %s'\n,premake.esc(table.concat(cfg.forcedincludes, \";\")))\nend\n_p(' ALL_CPPFLAGS += $(CPPFLAGS) %s $(DEFI" + "NES) $(INCLUDES)', table.concat(cc.getcppflags(cfg), \" \"))\n_p(' ALL_CFLAGS += $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cfg.buildoptions, cfg.buildoptions_c)))\n_p(' ALL_CXXFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_cpp)))\n_p(' ALL_OBJCFLAGS += $(CXXFLAGS) $(CFLAGS) $(ALL_CPPFLAGS) $(ARCH)%s', make.list(table.join(cc.getcflags(cfg), cc.getcxxflags(cfg), cfg.buildoptions, cfg.buildoptions_objc)))\n_p(' ALL_RESFLAGS += $(RESFLAGS) $(DEFINES) $(INCLUDES)%s',\n make.list(table.join(cc.getdefines(cfg.resdefines),\n cc.getincludedirs(cfg.resincludedirs), cfg.resoptions)))\nend\nfunction cpp.linker(prj, cfg, cc)\n_p(' ALL_LDFLAGS += $(LDFLAGS)%s', make.list(table.join(cc.getlibdirflags(cfg), cc.getldflags(cfg), cfg.linkoptions)))\n_p(' LDDEPS +=%s', make.list(_MAKE.esc(premake.getlinks(cfg, \"siblings\", \"fullpath" + "\"))))\n_p(' LIBS += $(LDDEPS)%s', make.list(cc.getlinkflags(cfg)))\nif cfg.kind == \"StaticLib\" then\nif cfg.platform:startswith(\"Universal\") then\n_p(' LINKCMD = libtool -o $(TARGET)')\nelse\nif (not prj.options.ArchiveSplit) then\nif cc.llvm then\n_p(' LINKCMD = $(AR) rcs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -rcs $(TARGET)')\nend\nelse\nif cc.llvm then\n_p(' LINKCMD = $(AR) qc $(TARGET)')\n_p(' LINKCMD_NDX= $(AR) cs $(TARGET)')\nelse\n_p(' LINKCMD = $(AR) -qc $(TARGET)')\n_p(' LINKCMD_NDX= $(AR) -cs $(TARGET)')\nend\nend\nend\nelse\nlocal tool = iif(cfg.language == \"C\", \"CC\", \"CXX\")\n_p(' LINKCMD = $(%s) -o $(TARGET) $(OBJECTS) $(RESOURCES) $(ARCH) $(ALL_LDFLAGS) $(LIBS)', tool)\nend\nend\nfunction cpp.pchconfig(cfg)\nif not cfg.pchheader or cfg.flags.NoPCH then\nreturn\nend\nlocal pch = cfg.pchheader\nfor _, incdir in ipairs(cfg.includedirs) do\nlocal abspath = path.getabsolute(path.join(cfg.project.location, incdir))\nlocal testname = path.join(abspath, pch)\nif" + " os.isfile(testname) then\npch = path.getrelative(cfg.location, testname)\nbreak\nend\nend\n_p(' PCH = %s', _MAKE.esc(pch))\n_p(' GCH = $(OBJDIR)/$(notdir $(PCH)).gch')\nend\nfunction cpp.pchrules(prj)\n_p('ifneq (,$(PCH))')\n_p('$(GCH): $(PCH)')\n_p('\\t@echo $(notdir $<)')\nlocal cmd = iif(prj.language == \"C\", \"$(CC) -x c-header $(ALL_CFLAGS)\", \"$(CXX) -x c++-header $(ALL_CXXFLAGS)\")\n_p('\\t$(SILENT) %s -MMD -MP $(DEFINES) $(INCLUDES) -o \"$@\" -MF \"$(@:%%.gch=%%.d)\" -c \"$<\"', cmd)\n_p('endif')\n_p('')\nend\nfunction cpp.fileRules(prj)\nfor _, file in ipairs(prj.files or {}) do\nif path.iscppfile(file) then\n_p('$(OBJDIR)/%s.o: %s'\n, _MAKE.esc(path.trimdots(path.removeext(file)))\n, _MAKE.esc(file)\n)\nif (path.isobjcfile(file) and prj.msgcompile_objc) then\n_p('\\t@echo ' .. prj.msgcompile_objc)\nelseif prj.msgcompile then\n_p('\\t@echo ' .. prj.msgcompile)\nelse\n_p('\\t@echo $(notdir $<)')\nend\nif (path.isobjcfile(file)) then\n_p('\\t$(SILENT) $(CXX) $(ALL_OBJCFLAGS) $(FORCE_I" + "NCLUDE) -o \"$@\" -MF $(@:%%.o=%%.d) -c \"$<\"')\nelse\ncpp.buildcommand(path.iscfile(file) and not prj.options.ForceCPP, \"o\")\nend\n_p('')\nelseif (path.getextension(file) == \".rc\") then\n_p('$(OBJDIR)/%s.res: %s', _MAKE.esc(path.getbasename(file)), _MAKE.esc(file))\nif prj.msgresource then\n_p('\\t@echo ' .. prj.msgresource)\nelse\n_p('\\t@echo $(notdir $<)')\nend\n_p('\\t$(SILENT) $(RESCOMP) $< -O coff -o \"$@\" $(ALL_RESFLAGS)')\n_p('')\nend\nend\nend\nfunction cpp.buildcommand(iscfile, objext)\nlocal flags = iif(iscfile, '$(CC) $(ALL_CFLAGS)', '$(CXX) $(ALL_CXXFLAGS)')\n_p('\\t$(SILENT) %s $(FORCE_INCLUDE) -o \"$@\" -MF $(@:%%.%s=%%.d) -c \"$<\"', flags, objext)\nend\n", /* actions/make/make_csharp.lua */ "local function getresourcefilename(cfg, fname)\nif path.getextension(fname) == \".resx\" then\n local name = cfg.buildtarget.basename .. \".\"\n local dir = path.getdirectory(fname)\n if dir ~= \".\" then \nname = name .. path.translate(dir, \".\") .. \".\"\nend\nreturn \"$(OBJDIR)/\" .. _MAKE.esc(name .. path.getbasename(fname)) .. \".resources\"\nelse\nreturn fname\nend\nend\nfunction premake.make_csharp(prj)\nlocal csc = premake.dotnet\nlocal cfglibs = { }\nlocal cfgpairs = { }\nlocal anycfg\nfor cfg in premake.eachconfig(prj) do\nanycfg = cfg\ncfglibs[cfg] = premake.getlinks(cfg, \"siblings\", \"fullpath\")\ncfgpairs[cfg] = { }\nfor _, fname in ipairs(cfglibs[cfg]) do\nif path.getdirectory(fname) ~= cfg.buildtarget.directory then\ncfgpairs[cfg][\"$(TARGETDIR)/\" .. _MAKE.esc(path.getname(fname))] = _MAKE.esc(fname)\nend\nend\nend\nlocal sources = {}\nlocal embedded = { }\nlocal copypairs = { }\nfor fcfg in premake.project.eachfile(prj) do\nlocal action = csc.getbuildaction(fcfg)\nif action == \"Co" @@ -263,16 +263,15 @@ const char* builtin_scripts[] = { "seFileName>'\n, path.getbasename(cfg.buildtarget.name))\nend\nif cfg.flags.NoFramePointer then\n_p(3,'true')\nend\ncompile_language(cfg)\nforcedinclude_files(3,cfg);\n_p(2,'')\nend\nlocal function event_hooks(cfg)\nif #cfg.postbuildcommands> 0 then\n _p(2,'')\n_p(3,'%s',premake.esc(table.implode(cfg.postbuildcommands, \"\", \"\", \"\\r\\n\")))\n_p(2,'')\nend\nif #cfg.prebuildcommands> 0 then\n _p(2,'')\n_p(3,'%s',premake.esc(table.implode(cfg.prebuildcommands, \"\", \"\", \"\\r\\n\")))\n_p(2,'')\nend\nif #cfg.prelinkcommands> 0 then\n _p(2,'')\n_p(3,'%s',premake.esc(table.implode(cfg.prelinkcommands, \"\", \"\", \"\\r\\n\")))\n_p(2,'')\nend\nend\nlocal function additional_options(indent,cfg)\nif #cfg.linkoptions > 0 then\n_p(indent,'%s %%(AdditionalOptions)',\ntable" ".concat(premake.esc(cfg.linkoptions), \" \"))\nend\nend\nlocal function link_target_machine(index,cfg)\nlocal platforms = {x32 = 'MachineX86', x64 = 'MachineX64'}\nif platforms[cfg.platform] then\n_p(index,'%s', platforms[cfg.platform])\nend\nend\nlocal function item_def_lib(cfg)\n -- The Xbox360 project files are stored in another place in the project file.\nif cfg.kind == 'StaticLib' and cfg.platform ~= \"Xbox360\" then\n_p(1,'')\n_p(2,'$(OutDir)%s',cfg.buildtarget.name)\nadditional_options(2,cfg)\nlink_target_machine(2,cfg)\n_p(1,'')\nend\nend\nlocal function import_lib(cfg)\nif cfg.kind == \"SharedLib\" then\nlocal implibname = cfg.linktarget.fullpath\n_p(3,'%s',iif(cfg.flags.NoImportLib, cfg.objectsdir .. \"\\\\\" .. path.getname(implibname), implibname))\nend\nend\nfunction vc2010.link(cfg)\n_p(2,'')\n_p(3,'%s', iif(cfg.kind == \"ConsoleApp\", \"Console\", \"Windows\"))\n_p" "(3,'%s', tostring(cfg.flags.Symbols ~= nil))\nif premake.config.isoptimizedbuild(cfg.flags) then\n_p(3,'true')\n_p(3,'true')\nend\nif cfg.kind ~= 'StaticLib' then\nvc2010.additionalDependencies(cfg)\n_p(3,'$(OutDir)%s', cfg.buildtarget.name)\nif #cfg.libdirs > 0 then\n_p(3,'%s;%%(AdditionalLibraryDirectories)',\npremake.esc(path.translate(table.concat(cfg.libdirs, ';'), '\\\\')))\nend\nif vc2010.config_type(cfg) == 'Application' and not cfg.flags.WinMain and not cfg.flags.Managed then\nif cfg.flags.Unicode then\n_p(3,'wmainCRTStartup')\nelse\n_p(3,'mainCRTStartup')\nend\nend\nimport_lib(cfg)\nlocal deffile = premake.findfile(cfg, \".def\")\nif deffile then\n_p(3,'%s', deffil" - "e)\nend\nlink_target_machine(3,cfg)\nadditional_options(3,cfg)\nend\n_p(2,'')\nend\nfunction vc2010.additionalDependencies(cfg)\nlocal links = premake.getlinks(cfg, \"system\", \"fullpath\")\nif #links > 0 then\n_p(3,'%s;%%(AdditionalDependencies)',\ntable.concat(links, \";\"))\nend\nend\nlocal function item_definitions(prj)\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\n_p(1,''\n,premake.esc(cfginfo.name))\nvs10_clcompile(cfg)\nresource_compile(cfg)\nitem_def_lib(cfg)\nvc2010.link(cfg)\nevent_hooks(cfg)\n_p(1,'')\nend\nend\nfunction exists(table, fine)\nfor _, value in ipairs(table) do\nif value == find then return true end\nend\nreturn false\nend\nfunction vc2010.getfilegroup(prj, group)\nlocal sortedfiles = prj.vc2010sortedfiles\nif not sortedfiles then\nsortedfiles = {\nClCompile = {}," - "\nClInclude = {},\nNone = {},\nResourceCompile = {},\n AppxManifest = {}\n}\nlocal foundAppxManifest = false\nfor file in premake.project.eachfile(prj) do\nif path.iscppfile(file.name) then\ntable.insert(sortedfiles.ClCompile, file)\nelseif path.iscppheader(file.name) then\nif not exists(prj.removefiles, file) then\ntable.insert(sortedfiles.ClInclude, file)\nend\nelseif path.isresourcefile(file.name) then\ntable.insert(sortedfiles.ResourceCompile, file)\nelse\n local ext = path.getextension(file.name):lower()\n if ext == \".appxmanifest\" then\nfoundAppxManifest = true\n table.insert(sortedfiles.AppxManifest, file)\n else\n table.insert(sortedfiles.None, file)\n end\nend\nend\nif vstudio.toolset == \"v120_wp81\" and prj.kind == \"WindowedApp\" and not foundAppxManifest then\nvstudio.needAppxManifest = true\nlocal fcfg = {}\nfcfg.name = prj.name .. \".appxmanifest\"\nfcfg.vpath = premake.project." - "getvpath(prj, fcfg.name)\ntable.insert(sortedfiles.AppxManifest, fcfg)\nend\nprj.vc2010sortedfiles = sortedfiles\nend\nreturn sortedfiles[group]\nend\nfunction vc2010.files(prj)\nvc2010.simplefilesgroup(prj, \"ClInclude\")\nvc2010.compilerfilesgroup(prj)\nvc2010.simplefilesgroup(prj, \"None\")\nvc2010.simplefilesgroup(prj, \"ResourceCompile\")\n vc2010.simplefilesgroup(prj, \"AppxManifest\")\nend\nfunction vc2010.simplefilesgroup(prj, section, subtype)\nlocal files = vc2010.getfilegroup(prj, section)\nif #files > 0 then\n_p(1,'')\nfor _, file in ipairs(files) do\n if subtype then\n _p(2,'<%s Include=\\\"%s\\\">', section, path.translate(file.name, \"\\\\\"))\n _p(3,'%s', subtype)\n _p(2,'', section)\n else\n _p(2,'<%s Include=\\\"%s\\\" />', section, path.translate(file.name, \"\\\\\"))\n end\nend\n_p(1,'')\nend\nend\nfunction vc2010.compilerfilesgroup(" - "prj)\nlocal configs = prj.solution.vstudio_configs\nlocal files = vc2010.getfilegroup(prj, \"ClCompile\")\nif #files > 0 then\nlocal config_mappings = {}\nfor _, cfginfo in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nif cfg.pchheader and cfg.pchsource and not cfg.flags.NoPCH then\nconfig_mappings[cfginfo] = path.translate(cfg.pchsource, \"\\\\\")\nend\nend\n_p(1,'')\nfor _, file in ipairs(files) do\nlocal translatedpath = path.translate(file.name, \"\\\\\")\n_p(2, '', translatedpath)\n_p(3, '$(IntDir)%s.obj'\n, premake.esc(path.translate(path.trimdots(path.removeext(file.name))))\n)\nfor _, cfginfo in ipairs(configs) do\nif config_mappings[cfginfo] and translatedpath == config_mappings[cfginfo] then\n_p(3,'Create', premake.esc(cfginfo.name))\nconfig_mappings[cfginfo] = nil --only one source file per pch\nend" - "\nend\nlocal excluded = false\nfor _, exclude in ipairs(prj.excludes) do\nif exclude == file.name then\nfor _, vsconfig in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform)\n_p(3, 'true'\n, premake.esc(vsconfig.name)\n)\nend\nexcluded = true\nbreak\nend\nend\nif not excluded then\nfor _, vsconfig in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform)\nfor _, exclude in ipairs(cfg.excludes) do\nif exclude == file.name then\n_p(3, 'true'\n, premake.esc(vsconfig.name)\n)\nend\nend\nend\nend\n_p(2,'')\nend\n_p(1,'')\nend\nend\nfunction vc2010.header(targets)\nio.eol = \"\\r\\n\"\n_p('')\nlocal t = \"\"\nif targets then\nt = ' DefaultTargets=\"' .. targets .. '\"'\nend\n_p('', t)\nend\nfunction premake.vs2010_vcxproj(prj)\nio.indent = \" \"\nvc2010.header(\"Build\")\nvs2010_config(prj)\nvs2010_globals(prj)\n_p(1,'')\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nvc2010.configurationPropertyGroup(cfg, cfginfo)\nend\n_p(1,'')\n_p(1,'')\n_p(1,'')\nimport_props(prj)\n_p(1,'')\nvc2010.outputProperties(prj)\nitem_definitions(prj)\nvc2010.files(prj)\nvc2010.projectReferences(prj)\n_p(1,'')\n_p(1,'')\n_p(1,'')\n_p('')\nend\nfunction vc2010.projectReferences(prj)\nlocal deps = premake.g" - "etdependencies(prj)\nif #deps > 0 then\n_p(1,'')\nfor _, dep in ipairs(deps) do\nlocal deppath = path.getrelative(prj.location, vstudio.projectfile(dep))\n_p(2,'', path.translate(deppath, \"\\\\\"))\n_p(3,'{%s}', dep.uuid)\nif vstudio.toolset == \"v120_wp81\" then\n_p(3,'false')\nend\n_p(2,'')\nend\n_p(1,'')\nend\nend\nfunction vc2010.debugdir(cfg)\nif cfg.debugdir then\n_p(' %s', path.translate(cfg.debugdir, '\\\\'))\n_p(' WindowsLocalDebugger')\nend\nif cfg.debugargs then\n_p(' %s', table.concat(cfg.debugargs, \" \"))\nend\nend\nfunction vc2010.debugenvs(cfg)\nif cfg.debugenvs and #cfg.debugenvs > 0 then\n_p(2,'%s%s',table.concat(cfg.debugenvs, " - "\"\\n\")\n,iif(cfg.flags.DebugEnvsInherit,'\\n$(LocalDebuggerEnvironment)','')\n)\nif cfg.flags.DebugEnvsDontMerge then\n_p(2,'false')\nend\nend\nend\nfunction premake.vs2010_vcxproj_user(prj)\nio.indent = \" \"\nvc2010.header()\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\n_p(' ', premake.esc(cfginfo.name))\nvc2010.debugdir(cfg)\nvc2010.debugenvs(cfg)\n_p(' ')\nend\n_p('')\nend\nfunction premake.vs2010_appxmanifest(prj)\nio.indent = \" \"\nio.eol = \"\\r\\n\"\n_p('')\n_p('')\n_p(1,'')\n_p(1,'')\n_p(1,'')\n_p(2,'' .. prj.name .. '')\n_p(2,'Unknown')\n_p(2,'EmptyLogo.png')\n_p(1,'')\n_p(1,'')\n_p(2,'6.3.1')\n_p(2,'6.3.1')\n_p(1,'')\n_p(1,'')\n_p(2,'')\n_p(1,'')\n_p(1,'')\n_p(2,'')\n_p(3,'')\n_p(3,'')\n_p(2,'')\n_p(1,'')\n_p('')\nend\n", + "e)\nend\nlink_target_machine(3,cfg)\nadditional_options(3,cfg)\nend\n_p(2,'')\nend\nfunction vc2010.additionalDependencies(cfg)\nlocal links = premake.getlinks(cfg, \"system\", \"fullpath\")\nif #links > 0 then\n_p(3,'%s;%%(AdditionalDependencies)',\ntable.concat(links, \";\"))\nend\nend\nlocal function item_definitions(prj)\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\n_p(1,''\n,premake.esc(cfginfo.name))\nvs10_clcompile(cfg)\nresource_compile(cfg)\nitem_def_lib(cfg)\nvc2010.link(cfg)\nevent_hooks(cfg)\n_p(1,'')\nend\nend\nfunction vc2010.getfilegroup(prj, group)\nlocal sortedfiles = prj.vc2010sortedfiles\nif not sortedfiles then\nsortedfiles = {\nClCompile = {},\nClInclude = {},\nNone = {},\nResourceCompile = {},\nAppxManifest = {}\n}\nlocal foundAppxManifest = false\nfor file in premak" + "e.project.eachfile(prj) do\nif path.iscppfile(file.name) then\ntable.insert(sortedfiles.ClCompile, file)\nelseif path.iscppheader(file.name) then\nif not table.icontains(prj.removefiles, file) then\ntable.insert(sortedfiles.ClInclude, file)\nend\nelseif path.isresourcefile(file.name) then\ntable.insert(sortedfiles.ResourceCompile, file)\nelse\nlocal ext = path.getextension(file.name):lower()\nif ext == \".appxmanifest\" then\nfoundAppxManifest = true\ntable.insert(sortedfiles.AppxManifest, file)\nelse\ntable.insert(sortedfiles.None, file)\nend\nend\nend\nif vstudio.toolset == \"v120_wp81\" and prj.kind == \"WindowedApp\" and not foundAppxManifest then\nvstudio.needAppxManifest = true\nlocal fcfg = {}\nfcfg.name = prj.name .. \".appxmanifest\"\nfcfg.vpath = premake.project.getvpath(prj, fcfg.name)\ntable.insert(sortedfiles.AppxManifest, fcfg)\nend\nprj.vc2010sortedfiles = sortedfiles\nend\nreturn sortedfiles[group]\nend\nfunction vc2010.files(prj)\nvc2010.simplefilesgroup(prj, \"ClInclude\")\nvc2010.compilerfil" + "esgroup(prj)\nvc2010.simplefilesgroup(prj, \"None\")\nvc2010.simplefilesgroup(prj, \"ResourceCompile\")\nvc2010.simplefilesgroup(prj, \"AppxManifest\")\nend\nfunction vc2010.simplefilesgroup(prj, section, subtype)\nlocal files = vc2010.getfilegroup(prj, section)\nif #files > 0 then\n_p(1,'')\nfor _, file in ipairs(files) do\nif subtype then\n_p(2,'<%s Include=\\\"%s\\\">', section, path.translate(file.name, \"\\\\\"))\n_p(3,'%s', subtype)\n_p(2,'', section)\nelse\n_p(2,'<%s Include=\\\"%s\\\" />', section, path.translate(file.name, \"\\\\\"))\nend\nend\n_p(1,'')\nend\nend\nfunction vc2010.compilerfilesgroup(prj)\nlocal configs = prj.solution.vstudio_configs\nlocal files = vc2010.getfilegroup(prj, \"ClCompile\")\nif #files > 0 then\nlocal config_mappings = {}\nfor _, cfginfo in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nif cfg.pchheader and cfg.pchsource and not cfg.flags.NoPCH then\nconfig_mappings[cfginfo" + "] = path.translate(cfg.pchsource, \"\\\\\")\nend\nend\n_p(1,'')\nfor _, file in ipairs(files) do\nlocal translatedpath = path.translate(file.name, \"\\\\\")\n_p(2, '', translatedpath)\n_p(3, '$(IntDir)%s.obj'\n, premake.esc(path.translate(path.trimdots(path.removeext(file.name))))\n)\nfor _, cfginfo in ipairs(configs) do\nif config_mappings[cfginfo] and translatedpath == config_mappings[cfginfo] then\n_p(3,'Create', premake.esc(cfginfo.name))\nconfig_mappings[cfginfo] = nil --only one source file per pch\nend\nend\nlocal excluded = table.icontains(prj.excludes, file.name)\nfor _, vsconfig in ipairs(configs) do\nlocal cfg = premake.getconfig(prj, vsconfig.src_buildcfg, vsconfig.src_platform)\nif excluded or table.icontains(cfg.excludes, file.name) then\n_p(3, 'true'\n, premake.esc(vsconfig.n" + "ame)\n)\nend\nend\n_p(2,'')\nend\n_p(1,'')\nend\nend\nfunction vc2010.header(targets)\nio.eol = \"\\r\\n\"\n_p('')\nlocal t = \"\"\nif targets then\nt = ' DefaultTargets=\"' .. targets .. '\"'\nend\n_p('', t)\nend\nfunction premake.vs2010_vcxproj(prj)\nio.indent = \" \"\nvc2010.header(\"Build\")\nvs2010_config(prj)\nvs2010_globals(prj)\n_p(1,'')\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\nvc2010.configurationPropertyGroup(cfg, cfginfo)\nend\n_p(1,'')\n_p(1,'')\n_p(1,'')\nimport_props(prj)\n_p(1,'')\nvc2010.outputProperties(prj)\nitem_def" + "initions(prj)\nvc2010.files(prj)\nvc2010.projectReferences(prj)\n_p(1,'')\n_p(1,'')\n_p(1,'')\n_p('')\nend\nfunction vc2010.projectReferences(prj)\nlocal deps = premake.getdependencies(prj)\nif #deps > 0 then\n_p(1,'')\nfor _, dep in ipairs(deps) do\nlocal deppath = path.getrelative(prj.location, vstudio.projectfile(dep))\n_p(2,'', path.translate(deppath, \"\\\\\"))\n_p(3,'{%s}', dep.uuid)\nif vstudio.toolset == \"v120_wp81\" then\n_p(3,'false')\nend\n_p(2,'')\nend\n_p(1,'')\nend\nend\nfunction vc2010.debugdir(cfg)\nif cfg.debugdir then\n_p(' %s', path.translate(cfg.debugdir, '\\\\'))\n_p(' WindowsLocalDebugger')\nend\nif cfg.debugargs th" + "en\n_p(' %s', table.concat(cfg.debugargs, \" \"))\nend\nend\nfunction vc2010.debugenvs(cfg)\nif cfg.debugenvs and #cfg.debugenvs > 0 then\n_p(2,'%s%s',table.concat(cfg.debugenvs, \"\\n\")\n,iif(cfg.flags.DebugEnvsInherit,'\\n$(LocalDebuggerEnvironment)','')\n)\nif cfg.flags.DebugEnvsDontMerge then\n_p(2,'false')\nend\nend\nend\nfunction premake.vs2010_vcxproj_user(prj)\nio.indent = \" \"\nvc2010.header()\nfor _, cfginfo in ipairs(prj.solution.vstudio_configs) do\nlocal cfg = premake.getconfig(prj, cfginfo.src_buildcfg, cfginfo.src_platform)\n_p(' ', premake.esc(cfginfo.name))\nvc2010.debugdir(cfg)\nvc2010.debugenvs(cfg)\n_p(' ')\nend\n_p('')\nend\nfunction premake.vs2010_appxmanifest(prj)\nio.indent = \" \"\nio.eol = \"\\r\\n\"\n_p('')\n_p('')\n_p(1,'')\n_p(1,'')\n_p(1,'')\n_p(2,'' .. prj.name .. '')\n_p(2,'Unknown')\n_p(2,'EmptyLogo.png')\n_p(1,'')\n_p(1,'')\n_p(2,'6.3.1')\n_p(2,'6.3.1')\n_p(1,'')\n_p(1,'')\n_p(2,'')\n_p(1,'')\n_p(1,'')\n_p(2,'')\n_p(3,'')\n_p(3,'')\n_p(2,'')\n_p(1,'')\n_p('')\nend\n", /* actions/vstudio/vs2010_vcxproj_filters.lua */ "local vc2010 = premake.vstudio.vc2010\nlocal project = premake.project\nfunction vc2010.filteridgroup(prj)\nlocal filters = { }\nlocal filterfound = false\nfor file in project.eachfile(prj) do\nlocal folders = string.explode(file.vpath, \"/\", true)\nlocal path = \"\"\nfor i = 1, #folders - 1 do\nif not filterfound then\nfilterfound = true\n_p(1,'')\nend\npath = path .. folders[i]\nif not filters[path] then\nfilters[path] = true\n_p(2, '', path)\n_p(3, '{%s}', os.uuid())\n_p(2, '')\nend\npath = path .. \"\\\\\"\nend\nend\nif filterfound then\n_p(1,'')\nend\nend\nfunction vc2010.filefiltergroup(prj, section)\nlocal files = vc2010.getfilegroup(prj, section)\nif #files > 0 then\n_p(1,'')\nfor _, file in ipairs(files) do\nlocal filter\nif file.name ~= file.vpath then\nfilter = path.getdirectory(file.vpath)\nelse\nfilter = path.getdirectory(file.name)\nend\nif filter ~= \".\" then\n_p(2,'<%s Include=\\\"%s\\\">', "