From fe82123a2828dfb5f65dc3b39139817c6952ea78 Mon Sep 17 00:00:00 2001 From: Daniel Collin Date: Sun, 14 Sep 2014 08:36:58 +0200 Subject: [PATCH] Added tundra executables --- ogl_editor/bin/macosx/tundra/scripts/strict.lua | 41 + ogl_editor/bin/macosx/tundra/scripts/tundra.lua | 43 + .../bin/macosx/tundra/scripts/tundra/boot.lua | 142 +++ .../bin/macosx/tundra/scripts/tundra/buildfile.lua | 253 ++++ .../bin/macosx/tundra/scripts/tundra/dagsave.lua | 409 ++++++ .../bin/macosx/tundra/scripts/tundra/debugger.lua | 1343 ++++++++++++++++++++ .../bin/macosx/tundra/scripts/tundra/decl.lua | 91 ++ .../bin/macosx/tundra/scripts/tundra/depgraph.lua | 155 +++ .../bin/macosx/tundra/scripts/tundra/dirwalk.lua | 41 + .../macosx/tundra/scripts/tundra/environment.lua | 316 +++++ .../macosx/tundra/scripts/tundra/host/freebsd.lua | 11 + .../macosx/tundra/scripts/tundra/host/linux.lua | 11 + .../macosx/tundra/scripts/tundra/host/macosx.lua | 11 + .../macosx/tundra/scripts/tundra/host/openbsd.lua | 11 + .../macosx/tundra/scripts/tundra/host/windows.lua | 11 + .../tundra/scripts/tundra/ide/msvc-common.lua | 864 +++++++++++++ .../tundra/scripts/tundra/ide/msvc-rules.xml | 173 +++ .../macosx/tundra/scripts/tundra/ide/msvc100.lua | 7 + .../macosx/tundra/scripts/tundra/ide/msvc110.lua | 7 + .../macosx/tundra/scripts/tundra/ide/msvc120.lua | 7 + .../macosx/tundra/scripts/tundra/ide/xcode3.lua | 735 +++++++++++ .../macosx/tundra/scripts/tundra/ide/xcode5.lua | 924 ++++++++++++++ .../bin/macosx/tundra/scripts/tundra/init.lua | 34 + .../bin/macosx/tundra/scripts/tundra/nodegen.lua | 914 +++++++++++++ .../bin/macosx/tundra/scripts/tundra/path.lua | 50 + .../bin/macosx/tundra/scripts/tundra/platform.lua | 7 + .../bin/macosx/tundra/scripts/tundra/scanner.lua | 57 + .../bin/macosx/tundra/scripts/tundra/selftest.lua | 37 + .../macosx/tundra/scripts/tundra/syntax/alias.lua | 40 + .../macosx/tundra/scripts/tundra/syntax/bison.lua | 42 + .../macosx/tundra/scripts/tundra/syntax/dotnet.lua | 117 ++ .../tundra/scripts/tundra/syntax/embed_lua.lua | 65 + .../macosx/tundra/scripts/tundra/syntax/files.lua | 50 + .../macosx/tundra/scripts/tundra/syntax/flex.lua | 28 + .../macosx/tundra/scripts/tundra/syntax/glob.lua | 122 ++ .../tundra/scripts/tundra/syntax/install.lua | 40 + .../macosx/tundra/scripts/tundra/syntax/ispc.lua | 25 + .../macosx/tundra/scripts/tundra/syntax/lemon.lua | 27 + .../macosx/tundra/scripts/tundra/syntax/native.lua | 312 +++++ .../tundra/scripts/tundra/syntax/osx-bundle.lua | 93 ++ .../tundra/scripts/tundra/syntax/pkgconfig.lua | 51 + .../tundra/scripts/tundra/syntax/testsupport.lua | 29 + .../macosx/tundra/scripts/tundra/test/t_env.lua | 62 + .../macosx/tundra/scripts/tundra/test/t_path.lua | 81 ++ .../tundra/scripts/tundra/tools/clang-osx.lua | 11 + .../macosx/tundra/scripts/tundra/tools/dotnet.lua | 28 + .../bin/macosx/tundra/scripts/tundra/tools/gas.lua | 12 + .../macosx/tundra/scripts/tundra/tools/gcc-osx.lua | 19 + .../bin/macosx/tundra/scripts/tundra/tools/gcc.lua | 30 + .../tundra/scripts/tundra/tools/generic-asm.lua | 78 ++ .../tundra/scripts/tundra/tools/generic-cpp.lua | 103 ++ .../tundra/scripts/tundra/tools/generic-dotnet.lua | 17 + .../macosx/tundra/scripts/tundra/tools/ispc.lua | 11 + .../macosx/tundra/scripts/tundra/tools/mingw.lua | 24 + .../macosx/tundra/scripts/tundra/tools/mono.lua | 17 + .../tundra/scripts/tundra/tools/msvc-vs2008.lua | 8 + .../tundra/scripts/tundra/tools/msvc-vs2010.lua | 8 + .../tundra/scripts/tundra/tools/msvc-vs2012.lua | 8 + .../tundra/scripts/tundra/tools/msvc-vs2013.lua | 8 + .../tundra/scripts/tundra/tools/msvc-vscommon.lua | 267 ++++ .../tundra/scripts/tundra/tools/msvc-vswild.lua | 23 + .../tundra/scripts/tundra/tools/msvc-winsdk.lua | 150 +++ .../macosx/tundra/scripts/tundra/tools/msvc.lua | 53 + .../macosx/tundra/scripts/tundra/tools/msvc6.lua | 101 ++ .../tundra/scripts/tundra/tools/openwatcom.lua | 61 + .../macosx/tundra/scripts/tundra/tools/vbcc.lua | 36 + .../tundra/scripts/tundra/tools/win32-rc.lua | 21 + .../macosx/tundra/scripts/tundra/tools/yasm.lua | 12 + .../bin/macosx/tundra/scripts/tundra/unitgen.lua | 197 +++ .../bin/macosx/tundra/scripts/tundra/util.lua | 360 ++++++ ogl_editor/bin/macosx/tundra/t2-inspect | Bin 0 -> 179076 bytes ogl_editor/bin/macosx/tundra/t2-lua | Bin 0 -> 364092 bytes ogl_editor/bin/macosx/tundra/tundra2 | Bin 0 -> 179172 bytes ogl_editor/bin/win32/scripts/strict.lua | 41 + ogl_editor/bin/win32/scripts/tundra.lua | 43 + ogl_editor/bin/win32/scripts/tundra/boot.lua | 142 +++ ogl_editor/bin/win32/scripts/tundra/buildfile.lua | 253 ++++ ogl_editor/bin/win32/scripts/tundra/dagsave.lua | 409 ++++++ ogl_editor/bin/win32/scripts/tundra/debugger.lua | 1343 ++++++++++++++++++++ ogl_editor/bin/win32/scripts/tundra/decl.lua | 91 ++ ogl_editor/bin/win32/scripts/tundra/depgraph.lua | 155 +++ ogl_editor/bin/win32/scripts/tundra/dirwalk.lua | 41 + .../bin/win32/scripts/tundra/environment.lua | 316 +++++ .../bin/win32/scripts/tundra/host/freebsd.lua | 11 + ogl_editor/bin/win32/scripts/tundra/host/linux.lua | 11 + .../bin/win32/scripts/tundra/host/macosx.lua | 11 + .../bin/win32/scripts/tundra/host/openbsd.lua | 11 + .../bin/win32/scripts/tundra/host/windows.lua | 11 + .../bin/win32/scripts/tundra/ide/msvc-common.lua | 864 +++++++++++++ .../bin/win32/scripts/tundra/ide/msvc-rules.xml | 173 +++ .../bin/win32/scripts/tundra/ide/msvc100.lua | 7 + .../bin/win32/scripts/tundra/ide/msvc110.lua | 7 + .../bin/win32/scripts/tundra/ide/msvc120.lua | 7 + ogl_editor/bin/win32/scripts/tundra/ide/xcode3.lua | 735 +++++++++++ ogl_editor/bin/win32/scripts/tundra/ide/xcode5.lua | 924 ++++++++++++++ ogl_editor/bin/win32/scripts/tundra/init.lua | 34 + ogl_editor/bin/win32/scripts/tundra/nodegen.lua | 914 +++++++++++++ ogl_editor/bin/win32/scripts/tundra/path.lua | 50 + ogl_editor/bin/win32/scripts/tundra/platform.lua | 7 + ogl_editor/bin/win32/scripts/tundra/scanner.lua | 57 + ogl_editor/bin/win32/scripts/tundra/selftest.lua | 37 + .../bin/win32/scripts/tundra/syntax/alias.lua | 40 + .../bin/win32/scripts/tundra/syntax/bison.lua | 42 + .../bin/win32/scripts/tundra/syntax/dotnet.lua | 117 ++ .../bin/win32/scripts/tundra/syntax/embed_lua.lua | 65 + .../bin/win32/scripts/tundra/syntax/files.lua | 50 + .../bin/win32/scripts/tundra/syntax/flex.lua | 28 + .../bin/win32/scripts/tundra/syntax/glob.lua | 122 ++ .../bin/win32/scripts/tundra/syntax/install.lua | 40 + .../bin/win32/scripts/tundra/syntax/ispc.lua | 25 + .../bin/win32/scripts/tundra/syntax/lemon.lua | 27 + .../bin/win32/scripts/tundra/syntax/native.lua | 312 +++++ .../bin/win32/scripts/tundra/syntax/osx-bundle.lua | 93 ++ .../bin/win32/scripts/tundra/syntax/pkgconfig.lua | 51 + .../win32/scripts/tundra/syntax/testsupport.lua | 29 + ogl_editor/bin/win32/scripts/tundra/test/t_env.lua | 62 + .../bin/win32/scripts/tundra/test/t_path.lua | 81 ++ .../bin/win32/scripts/tundra/tools/clang-osx.lua | 11 + .../bin/win32/scripts/tundra/tools/dotnet.lua | 28 + ogl_editor/bin/win32/scripts/tundra/tools/gas.lua | 12 + .../bin/win32/scripts/tundra/tools/gcc-osx.lua | 19 + ogl_editor/bin/win32/scripts/tundra/tools/gcc.lua | 30 + .../bin/win32/scripts/tundra/tools/generic-asm.lua | 78 ++ .../bin/win32/scripts/tundra/tools/generic-cpp.lua | 103 ++ .../win32/scripts/tundra/tools/generic-dotnet.lua | 17 + ogl_editor/bin/win32/scripts/tundra/tools/ispc.lua | 11 + .../bin/win32/scripts/tundra/tools/mingw.lua | 24 + ogl_editor/bin/win32/scripts/tundra/tools/mono.lua | 17 + .../bin/win32/scripts/tundra/tools/msvc-vs2008.lua | 8 + .../bin/win32/scripts/tundra/tools/msvc-vs2010.lua | 8 + .../bin/win32/scripts/tundra/tools/msvc-vs2012.lua | 8 + .../bin/win32/scripts/tundra/tools/msvc-vs2013.lua | 8 + .../win32/scripts/tundra/tools/msvc-vscommon.lua | 267 ++++ .../bin/win32/scripts/tundra/tools/msvc-vswild.lua | 23 + .../bin/win32/scripts/tundra/tools/msvc-winsdk.lua | 150 +++ ogl_editor/bin/win32/scripts/tundra/tools/msvc.lua | 53 + .../bin/win32/scripts/tundra/tools/msvc6.lua | 101 ++ .../bin/win32/scripts/tundra/tools/openwatcom.lua | 61 + ogl_editor/bin/win32/scripts/tundra/tools/vbcc.lua | 36 + .../bin/win32/scripts/tundra/tools/win32-rc.lua | 21 + ogl_editor/bin/win32/scripts/tundra/tools/yasm.lua | 12 + ogl_editor/bin/win32/scripts/tundra/unitgen.lua | 197 +++ ogl_editor/bin/win32/scripts/tundra/util.lua | 360 ++++++ ogl_editor/bin/win32/t2-inspect.exe | Bin 0 -> 119808 bytes ogl_editor/bin/win32/t2-lua.exe | Bin 0 -> 449024 bytes ogl_editor/bin/win32/tundra2.exe | Bin 0 -> 298496 bytes 146 files changed, 19104 insertions(+) create mode 100644 ogl_editor/bin/macosx/tundra/scripts/strict.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/boot.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/buildfile.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/dagsave.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/debugger.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/decl.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/depgraph.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/dirwalk.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/environment.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/host/freebsd.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/host/linux.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/host/macosx.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/host/openbsd.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/host/windows.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc-common.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc-rules.xml create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc100.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc110.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc120.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/ide/xcode3.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/ide/xcode5.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/init.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/nodegen.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/path.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/platform.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/scanner.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/selftest.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/alias.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/bison.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/dotnet.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/embed_lua.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/files.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/flex.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/glob.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/install.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/ispc.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/lemon.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/native.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/osx-bundle.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/pkgconfig.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/testsupport.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/test/t_env.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/test/t_path.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/clang-osx.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/dotnet.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/gas.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/gcc-osx.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/gcc.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/generic-asm.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/generic-cpp.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/generic-dotnet.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/ispc.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/mingw.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/mono.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vs2008.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vs2010.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vs2012.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vs2013.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vscommon.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vswild.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-winsdk.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc6.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/openwatcom.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/vbcc.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/win32-rc.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/tools/yasm.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/unitgen.lua create mode 100644 ogl_editor/bin/macosx/tundra/scripts/tundra/util.lua create mode 100755 ogl_editor/bin/macosx/tundra/t2-inspect create mode 100755 ogl_editor/bin/macosx/tundra/t2-lua create mode 100755 ogl_editor/bin/macosx/tundra/tundra2 create mode 100644 ogl_editor/bin/win32/scripts/strict.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/boot.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/buildfile.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/dagsave.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/debugger.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/decl.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/depgraph.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/dirwalk.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/environment.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/host/freebsd.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/host/linux.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/host/macosx.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/host/openbsd.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/host/windows.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/ide/msvc-common.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/ide/msvc-rules.xml create mode 100644 ogl_editor/bin/win32/scripts/tundra/ide/msvc100.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/ide/msvc110.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/ide/msvc120.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/ide/xcode3.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/ide/xcode5.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/init.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/nodegen.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/path.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/platform.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/scanner.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/selftest.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/syntax/alias.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/syntax/bison.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/syntax/dotnet.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/syntax/embed_lua.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/syntax/files.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/syntax/flex.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/syntax/glob.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/syntax/install.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/syntax/ispc.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/syntax/lemon.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/syntax/native.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/syntax/osx-bundle.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/syntax/pkgconfig.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/syntax/testsupport.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/test/t_env.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/test/t_path.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/clang-osx.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/dotnet.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/gas.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/gcc-osx.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/gcc.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/generic-asm.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/generic-cpp.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/generic-dotnet.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/ispc.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/mingw.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/mono.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/msvc-vs2008.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/msvc-vs2010.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/msvc-vs2012.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/msvc-vs2013.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/msvc-vscommon.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/msvc-vswild.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/msvc-winsdk.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/msvc.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/msvc6.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/openwatcom.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/vbcc.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/win32-rc.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/tools/yasm.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/unitgen.lua create mode 100644 ogl_editor/bin/win32/scripts/tundra/util.lua create mode 100644 ogl_editor/bin/win32/t2-inspect.exe create mode 100644 ogl_editor/bin/win32/t2-lua.exe create mode 100644 ogl_editor/bin/win32/tundra2.exe diff --git a/ogl_editor/bin/macosx/tundra/scripts/strict.lua b/ogl_editor/bin/macosx/tundra/scripts/strict.lua new file mode 100644 index 0000000..604619d --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/strict.lua @@ -0,0 +1,41 @@ +-- +-- strict.lua +-- checks uses of undeclared global variables +-- All global variables must be 'declared' through a regular assignment +-- (even assigning nil will do) in a main chunk before being used +-- anywhere or assigned to inside a function. +-- + +local getinfo, error, rawset, rawget = debug.getinfo, error, rawset, rawget + +local mt = getmetatable(_G) +if mt == nil then + mt = {} + setmetatable(_G, mt) +end + +mt.__declared = {} + +local function what () + local d = getinfo(3, "S") + return d and d.what or "C" +end + +mt.__newindex = function (t, n, v) + if not mt.__declared[n] then + local w = what() + if w ~= "main" and w ~= "C" then + error("assign to undeclared variable '"..n.."'", 2) + end + mt.__declared[n] = true + end + rawset(t, n, v) +end + +mt.__index = function (t, n) + if not mt.__declared[n] and what() ~= "C" then + error("variable '"..n.."' is not declared", 2) + end + return rawget(t, n) +end + diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra.lua new file mode 100644 index 0000000..cede76e --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra.lua @@ -0,0 +1,43 @@ +require "strict" + +local boot = require "tundra.boot" + +local actions = { + ['generate-dag'] = function(build_script) + assert(build_script, "need a build script name") + boot.generate_dag_data(build_script) + end, + + ['generate-ide-files'] = function(build_script, ide_script) + assert(build_script, "need a build script name") + assert(ide_script, "need a generator name") + boot.generate_ide_files(build_script, ide_script) + end, + + ['selftest'] = function() + require "tundra.selftest" + end +} + +local function main(action_name, ...) + assert(action_name, "need an action") + + local action = actions[action_name] + assert(action, "unknown action '" .. action_name .. "'") + + -- check if debugger was requested + for i, v in ipairs(arg) do + if v == "--lua-debugger" then + table.remove(arg, i) + require "tundra.debugger" + pause() + break + end + end + + action(unpack(arg)) +end + +return { + main = main +} diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/boot.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/boot.lua new file mode 100644 index 0000000..4c0dbf9 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/boot.lua @@ -0,0 +1,142 @@ +module(..., package.seeall) + +-- Use "strict" when developing to flag accesses to nil global variables +-- This has very low perf impact (<0.1%), so always leave it on. +require "strict" + +local os = require "os" +local platform = require "tundra.platform" +local util = require "tundra.util" +local depgraph = require "tundra.depgraph" +local unitgen = require "tundra.unitgen" +local buildfile = require "tundra.buildfile" +local native = require "tundra.native" + +-- This trio is so useful we want them everywhere without imports. +function _G.printf(msg, ...) + local str = string.format(msg, ...) + print(str) +end + +function _G.errorf(msg, ...) + local str = string.format(msg, ...) + error(str) +end + +function _G.croak(msg, ...) + local str = string.format(msg, ...) + io.stderr:write(str, "\n") + os.exit(1) +end + +-- Expose benchmarking function for those times everything sucks +-- +-- Wrap a function so that it prints execution times. +-- +-- Usage: +-- foo = bench("foo", foo) -- benchmark function foo +function _G.bench(name, fn) + return function (...) + local t1 = native.get_timer() + local result = { fn(...) } + local t2 = native.get_timer() + printf("%s: %ss", name, native.timerdiff(t1, t2)) + return unpack(result) + end +end + +local environment = require "tundra.environment" +local nodegen = require "tundra.nodegen" +local decl = require "tundra.decl" +local path = require "tundra.path" +local depgraph = require "tundra.depgraph" +local dagsave = require "tundra.dagsave" + +_G.SEP = platform.host_platform() == "windows" and "\\" or "/" + +_G.Options = { + FullPaths = 1 +} + +local function make_default_env(build_data, add_unfiltered_vars) + local default_env = environment.create() + + default_env:set_many { + ["OBJECTROOT"] = "t2-output", + ["SEP"] = SEP, + } + + local host_platform = platform.host_platform() + do + local mod_name = "tundra.host." .. host_platform + local mod = require(mod_name) + mod.apply_host(default_env) + end + + -- Add any unfiltered entries from the build data's Env and ReplaceEnv to the + -- default environment. For config environments, this will be false, because we + -- want to wait until the config's tools have run before adding any user + -- customizations. + if add_unfiltered_vars then + if build_data.Env then + nodegen.append_filtered_env_vars(default_env, build_data.Env, nil, true) + end + if build_data.ReplaceEnv then + nodegen.replace_filtered_env_vars(default_env, build_data.ReplaceEnv, nil, true) + end + end + + return default_env +end + +function generate_dag_data(build_script_fn) + local build_data = buildfile.run(build_script_fn) + local env = make_default_env(build_data.BuildData, false) + local raw_nodes, node_bindings = unitgen.generate_dag( + build_data.BuildTuples, + build_data.BuildData, + build_data.Passes, + build_data.Configs, + env) + + dagsave.save_dag_data( + node_bindings, + build_data.DefaultVariant, + build_data.DefaultSubVariant, + build_data.ContentDigestExtensions, + build_data.Options) +end + +function generate_ide_files(build_script_fn, ide_script) + -- We are generating IDE integration files. Load the specified + -- integration module rather than DAG builders. + -- + -- Also, default to using full paths for all commands to aid with locating + -- sources better. + Options.FullPaths = 1 + + local build_data = buildfile.run(build_script_fn) + local build_tuples = assert(build_data.BuildTuples) + local raw_data = assert(build_data.BuildData) + local passes = assert(build_data.Passes) + + local env = make_default_env(raw_data, true) + + if not ide_script:find('.', 1, true) then + ide_script = 'tundra.ide.' .. ide_script + end + + require(ide_script) + + -- Generate dag + local raw_nodes, node_bindings = unitgen.generate_dag( + build_data.BuildTuples, + build_data.BuildData, + build_data.Passes, + build_data.Configs, + env) + + -- Pass the build tuples directly to the generator and let it write + -- files. + nodegen.generate_ide_files(build_tuples, build_data.DefaultNodes, raw_nodes, env, raw_data.IdeGenerationHints, ide_script) +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/buildfile.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/buildfile.lua new file mode 100644 index 0000000..cf24d1f --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/buildfile.lua @@ -0,0 +1,253 @@ +module(..., package.seeall) + +local util = require "tundra.util" +local native = require "tundra.native" + +local function mk_defvariant(name) + return { Name = name; Options = {} } +end + +local default_variants = { + mk_defvariant "debug", + mk_defvariant "production", + mk_defvariant "release" +} + +local default_subvariants = { + "default" +} + +local _config_class = {} + +-- Table constructor to make tundra.lua syntax a bit nicer in the Configs array +function _G.Config(args) + local name = args.Name + if not name then + error("no `Name' specified for configuration") + end + if not name:match("^[%w_]+-[%w_]+$") then + errorf("configuration name %s doesn't follow - pattern", name) + end + + if args.SubConfigs then + if not args.DefaultSubConfig then + errorf("configuration %s has `SubConfigs' but no `DefaultSubConfig'", name) + end + end + + return setmetatable(args, _config_class) +end + +local function analyze_targets(configs, variants, subvariants) + local build_tuples = {} + + local build_configs = {} + local build_variants = {} + local build_subvariants = {} + + for _, cfg in pairs(configs) do + + if not cfg.Virtual then -- skip virtual configs + + if not cfg.SupportedHosts then + if cfg.DefaultOnHost then + if type(cfg.DefaultOnHost) == "table" then + cfg.SupportedHosts = cfg.DefaultOnHost + else + cfg.SupportedHosts = { cfg.DefaultOnHost } + end + else + printf("1.0-compat: config %s doesn't specify SupportedHosts -- will never be built", cfg.Name); + cfg.SupportedHosts = { } + end + end + + local lut = util.make_lookup_table(cfg.SupportedHosts) + if lut[native.host_platform] then + build_configs[#build_configs + 1] = cfg + end + end + end + for _, var in pairs(variants) do build_variants[#build_variants + 1] = var end + for var, _ in pairs(subvariants) do build_subvariants[#build_subvariants + 1] = var end + + for _, config in ipairs(build_configs) do + if config.Virtual then + croak("can't build configuration %s directly; it is a support configuration only", config.Name) + end + for _, variant in ipairs(build_variants) do + for _, subvariant in ipairs(build_subvariants) do + build_tuples[#build_tuples + 1] = { Config = config, Variant = variant, SubVariant = subvariant } + end + end + end + + if #build_tuples == 0 then + errorf("no build tuples available\n") + end + + return build_tuples +end + +-- Custom pcall error handler to scan for syntax errors (thrown as tables) and +-- report them without a backtrace, trying to get the filename and line number +-- right so the user can fix their build file. +function syntax_error_catcher(err_obj) + if type(err_obj) == "table" and err_obj.Class and err_obj.Message then + local i = 1 + -- Walk down the stack until we find a function that isn't sourced from + -- a file. These have 'source' names that don't start with an @ sign. + -- Because we read all files into memory before executing them, this + -- will give us the source filename of the user script. + while true do + local info = debug.getinfo(i, 'Sl') + --print(util.tostring(info)) + if not info then + break + end + if info.what == "C" or (info.source:sub(1, 1) == "@" and info.source ~= "@units.lua") then + i = i + 1 + else + local fn = info.source + if info.source:sub(1, 1) == "@" then + fn = info.source:sub(2) + end + if info.currentline == -1 then + return string.format("%s: %s", err_obj.Class, err_obj.Message) + else + return string.format("%s(%d): %s: %s", fn, info.currentline, err_obj.Class, err_obj.Message) + end + end + end + return string.format("%s: %s", err_obj.Class, err_obj.Message) + else + return debug.traceback(err_obj, 2) + end +end + + + +-- A place to store the result of the user's build script calling Build() +local build_result = nil + +-- The Build function is the main entry point for "tundra.lua" when invoked. +function _G.Build(args) + if type(args.Configs) ~= "table" or #args.Configs == 0 then + croak("Need at least one config; got %s", util.tostring(args.Configs or "none at all")) + end + + local configs, variants, subvariants = {}, {}, {} + + -- Legacy support: run "Config" constructor automatically on naked tables + -- passed in Configs array. + for idx = 1, #args.Configs do + local cfg = args.Configs[idx] + if getmetatable(cfg) ~= _config_class then + cfg = Config(cfg) + args.Configs[idx] = cfg + end + configs[cfg.Name] = cfg + end + + for _, dir in util.nil_ipairs(args.ScriptDirs) do + -- Make sure dir is sane and ends with a slash + dir = dir:gsub("[/\\]", SEP):gsub("[/\\]$", "") + local expr = dir .. SEP .. "?.lua" + + -- Add user toolset dir first so they can override builtin scripts. + package.path = expr .. ";" .. package.path + end + + if args.Variants then + for i, x in ipairs(args.Variants) do + if type(x) == "string" then + args.Variants[i] = mk_defvariant(x) + else + assert(x.Name) + if not x.Options then + x.Options = {} + end + end + end + end + + local variant_array = args.Variants or default_variants + for _, variant in ipairs(variant_array) do variants[variant.Name] = variant end + + local subvariant_array = args.SubVariants or default_subvariants + for _, subvariant in ipairs(subvariant_array) do subvariants[subvariant] = true end + + local default_variant = variant_array[1] + if args.DefaultVariant then + for _, x in ipairs(variant_array) do + if x.Name == args.DefaultVariant then + default_variant = x + end + end + end + + local default_subvariant = args.DefaultSubVariant or subvariant_array[1] + local build_tuples = analyze_targets(configs, variants, subvariants) + local passes = args.Passes or { Default = { Name = "Default", BuildOrder = 1 } } + + printf("%d valid build tuples", #build_tuples) + + -- Validate pass data + for id, data in pairs(passes) do + if not data.Name then + croak("Pass %s has no Name attribute", id) + elseif not data.BuildOrder then + croak("Pass %s has no BuildOrder attribute", id) + end + end + + -- Assume syntax for C and DotNet is always needed + -- for now. Could possible make an option for which generator sets to load + -- in the future. + require "tundra.syntax.native" + require "tundra.syntax.dotnet" + + build_result = { + BuildTuples = build_tuples, + BuildData = args, + Passes = passes, + Configs = configs, + DefaultVariant = default_variant, + DefaultSubVariant = default_subvariant, + ContentDigestExtensions = args.ContentDigestExtensions, + Options = args.Options, + } +end + +function run(build_script_fn) + local f, err = io.open(build_script_fn, 'r') + + if not f then + croak("%s", err) + end + + local text = f:read("*all") + f:close() + + local script_globals, script_globals_mt = {}, {} + script_globals_mt.__index = _G + setmetatable(script_globals, script_globals_mt) + + local chunk, error_msg = loadstring(text, build_script_fn) + if not chunk then + croak("%s", error_msg) + end + setfenv(chunk, script_globals) + + local success, result = xpcall(chunk, syntax_error_catcher) + + if not success then + print("Build script execution failed") + croak("%s", result or "") + end + + local result = build_result + build_result = nil + return result +end + diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/dagsave.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/dagsave.lua new file mode 100644 index 0000000..37dba90 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/dagsave.lua @@ -0,0 +1,409 @@ +module(..., package.seeall) + +local depgraph = require "tundra.depgraph" +local util = require "tundra.util" +local scanner = require "tundra.scanner" +local dirwalk = require "tundra.dirwalk" +local platform = require "tundra.platform" +local native = require "tundra.native" +local njson = require "tundra.native.json" +local path = require "tundra.path" + +local dag_dag_magic = 0x15890105 + +local function get_passes(nodes) + local result = {} + local seen_passes = {} + + for _, node in ipairs(nodes) do + local p = node.pass + if not seen_passes[p] then + assert(type(p) == "table", "Passes must be tables, have " .. util.tostring(p)) + assert(type(p.BuildOrder) == "number", "Pass BuildOrder must be a number") + result[#result + 1] = p + seen_passes[p] = true + end + end + + table.sort(result, function (a, b) return a.BuildOrder < b.BuildOrder end) + + local pass_lookup = {} + + for index, pass in ipairs(result) do + pass_lookup[pass] = index - 1 + end + + return result, pass_lookup +end + +local function setup_input_deps(nodes) + local producers = {} + + local cwd = native.getcwd() .. SEP + local filter + if native.host_platform == 'windows' or native.host_platform == 'macosx' then + filter = function (str) return str:lower() end + else + filter = function (str) return str end + end + + local node_deps = {} + + -- Record producing node for all output files + for _, n in ipairs(nodes) do + for _, output in util.nil_ipairs(n.outputs) do + if not path.is_absolute(output) then + output = cwd .. output + end + output = filter(output) + if producers[output] then + errorf("file %s set to be written by more than one target:\n%s\n%s\n", + output, n.annotation, producers[output].annotation) + end + producers[output] = n + end + if n.deps then + node_deps[n] = util.make_lookup_table(n.deps) + end + end + + -- Map input files to dependencies + for _, n in ipairs(nodes) do + for _, inputf in util.nil_ipairs(n.inputs) do + if not path.is_absolute(inputf) then + inputf = cwd .. inputf + end + inputf = filter(inputf) + local producer = producers[inputf] + local deps_lut = node_deps[n] + if producer and (not deps_lut or not deps_lut[producer]) then + n.deps[#n.deps + 1] = producer + if not deps_lut then + deps_lut = {} + node_deps[n] = deps_lut + end + deps_lut[producer] = true + end + end + end + +end + +local function get_scanners(nodes) + local scanners = {} + local scanner_to_index = {} + for _, node in ipairs(nodes) do + local scanner = node.scanner + if scanner and not scanner_to_index[scanner] then + scanner_to_index[scanner] = #scanners + scanners[#scanners + 1] = scanner + end + end + return scanners, scanner_to_index +end + +local function save_passes(w, passes) + w:begin_array("Passes") + for _, s in ipairs(passes) do + w:write_string(s.Name) + end + w:end_array() +end + +local function save_scanners(w, scanners) + w:begin_array("Scanners") + for _, s in ipairs(scanners) do + w:begin_object() + w:write_string(s.Kind, 'Kind') + w:begin_array("IncludePaths") + for _, path in util.nil_ipairs(s.Paths) do + w:write_string(path) + end + w:end_array() + -- Serialize specialized state for generic scanners + if s.Kind == 'generic' then + w:write_bool(s.RequireWhitespace, 'RequireWhitespace') + w:write_bool(s.UseSeparators, 'UseSeparators') + w:write_bool(s.BareMeansSystem, 'BareMeansSystem') + w:begin_array('Keywords') + for _, kw in util.nil_ipairs(s.Keywords) do + w:write_string(kw) + end + w:end_array() + w:begin_array('KeywordsNoFollow') + for _, kw in util.nil_ipairs(s.KeywordsNoFollow) do + w:write_string(kw) + end + w:end_array() + end + w:end_object() + end + w:end_array() +end + +local function save_nodes(w, nodes, pass_to_index, scanner_to_index) + w:begin_array("Nodes") + for idx, node in ipairs(nodes) do + w:begin_object() + assert(idx - 1 == node.index) + if node.action then + w:write_string(node.action, "Action") + end + if node.preaction then + w:write_string(node.preaction, "PreAction") + end + w:write_string(node.annotation, "Annotation") + + w:write_number(pass_to_index[node.pass], "PassIndex") + + if #node.deps > 0 then + w:begin_array("Deps") + for _, dep in ipairs(node.deps) do + w:write_number(dep.index) + end + w:end_array() + end + + local function dump_file_list(list, name) + if list and #list > 0 then + w:begin_array(name) + for _, fn in ipairs(list) do + w:write_string(fn) + end + w:end_array(name) + end + end + + dump_file_list(node.inputs, "Inputs") + dump_file_list(node.outputs, "Outputs") + dump_file_list(node.aux_outputs, "AuxOutputs") + + -- Save environment strings + local env_count = 0 + for k, v in util.nil_pairs(node.env) do + env_count = env_count + 1 + end + + if env_count > 0 then + w:begin_array("Env") + for k, v in pairs(node.env) do + w:begin_object() + w:write_string(k, "Key") + w:write_string(v, "Value") + w:end_object() + end + w:end_array() + end + + if node.scanner then + w:write_number(scanner_to_index[node.scanner], "ScannerIndex") + end + + if node.overwrite_outputs then + w:write_bool(true, "OverwriteOutputs") + end + + if node.is_precious then + w:write_bool(true, "PreciousOutputs") + end + + if node.expensive then + w:write_bool(true, "Expensive") + end + + w:end_object() + end + w:end_array() +end + +local function save_configs(w, bindings, default_variant, default_subvariant) + local configs = {} + local variants = {} + local subvariants = {} + local config_index = {} + local variant_index = {} + local subvariant_index = {} + local default_config = nil + local host_platform = platform.host_platform() + + for _, b in ipairs(bindings) do + if not configs[b.Config.Name] then + configs[b.Config.Name] = #config_index + config_index[#config_index+1] = b.Config.Name + end + if not variants[b.Variant.Name] then + variants[b.Variant.Name] = #variant_index + variant_index[#variant_index+1] = b.Variant.Name + end + if not subvariants[b.SubVariant] then + subvariants[b.SubVariant] = #subvariant_index + subvariant_index[#subvariant_index+1] = b.SubVariant + end + + if b.Config.DefaultOnHost == host_platform then + default_config = b.Config + end + end + + assert(#config_index > 0) + assert(#variant_index > 0) + assert(#subvariant_index > 0) + + local function dump_str_array(array, name) + if array and #array > 0 then + w:begin_array(name) + for _, name in ipairs(array) do + w:write_string(name) + end + w:end_array() + end + end + + w:begin_object("Setup") + dump_str_array(config_index, "Configs") + dump_str_array(variant_index, "Variants") + dump_str_array(subvariant_index, "SubVariants") + + w:begin_array("BuildTuples") + for index, binding in ipairs(bindings) do + w:begin_object() + w:write_number(configs[binding.Config.Name], "ConfigIndex") + w:write_number(variants[binding.Variant.Name], "VariantIndex") + w:write_number(subvariants[binding.SubVariant], "SubVariantIndex") + local function store_node_index_array(nodes, name) + w:begin_array(name) + for _, node in util.nil_ipairs(nodes) do + w:write_number(node.index) + end + w:end_array() + end + store_node_index_array(binding.AlwaysNodes, "AlwaysNodes") + store_node_index_array(binding.DefaultNodes, "DefaultNodes") + + w:begin_object("NamedNodes") + for name, node in pairs(binding.NamedNodes) do + w:write_number(node.index, name) + end + w:end_object() + + w:end_object() + end + w:end_array() + + -- m_DefaultBuildTuple + w:begin_object("DefaultBuildTuple") + if default_config then + w:write_number(configs[default_config.Name], "ConfigIndex") + else + w:write_number(-1, "ConfigIndex") + end + + if default_variant then + w:write_number(variants[default_variant.Name], "VariantIndex") + else + w:write_number(-1, "VariantIndex") + end + + if default_subvariant then + w:write_number(subvariants[default_subvariant], "SubVariantIndex") + else + w:write_number(-1, "SubVariantIndex") + end + w:end_object() + + w:end_object() + +end + +local function save_signatures(w, accessed_lua_files) + w:begin_array("FileSignatures") + for _, fn in ipairs(accessed_lua_files) do + w:begin_object() + local stat = native.stat_file(fn) + if not stat.exists then + errorf("accessed file %s is gone: %s", fn, err) + end + w:write_string(fn, "File") + w:write_number(stat.timestamp, "Timestamp") + w:end_object() + end + w:end_array() + + w:begin_array("GlobSignatures") + local globs = dirwalk.all_queries() + for _, glob in ipairs(globs) do + w:begin_object() + w:write_string(glob.Path, "Path") + w:begin_array("Files") + for _, fn in ipairs(glob.Files) do w:write_string(fn) end + w:end_array() + w:begin_array("SubDirs") + for _, fn in ipairs(glob.SubDirs) do w:write_string(fn) end + w:end_array() + w:end_object() + end + w:end_array() +end + +local function check_deps(nodes) + for _, node in ipairs(nodes) do + for _ , dep in ipairs(node.deps) do + if dep.pass.BuildOrder > node.pass.BuildOrder then + errorf("%s (pass: %s) depends on %s in later pass (%s)", node.annotation, node.pass.Name, dep.annotation, dep.pass.Name) + end + end + end +end + +function save_dag_data(bindings, default_variant, default_subvariant, content_digest_exts, misc_options) + + -- Call builtin function to get at accessed file table + local accessed_lua_files = util.table_keys(get_accessed_files()) + + misc_options = misc_options or {} + local max_expensive_jobs = misc_options.MaxExpensiveJobs or -1 + + printf("save_dag_data: %d bindings, %d accessed files", #bindings, #accessed_lua_files) + + local nodes = depgraph.get_all_nodes() + + -- Set node indices + for idx, node in ipairs(nodes) do + node.index = idx - 1 + end + + -- Set up array of passes + local passes, pass_to_index = get_passes(nodes) + + -- Hook up dependencies due to input files + setup_input_deps(nodes) + + check_deps(nodes) + + -- Find scanners + local scanners, scanner_to_index = get_scanners(nodes) + + local w = njson.new('.tundra2.dag.json') + + w:begin_object() + save_configs(w, bindings, default_variant, default_subvariant) + save_passes(w, passes) + save_scanners(w, scanners) + save_nodes(w, nodes, pass_to_index, scanner_to_index) + save_signatures(w, accessed_lua_files) + + if content_digest_exts and #content_digest_exts > 0 then + w:begin_array("ContentDigestExtensions") + for _, ext in ipairs(content_digest_exts) do + w:write_string(ext) + end + w:end_array() + end + + w:write_number(max_expensive_jobs, "MaxExpensiveCount") + + w:end_object() + + w:close() +end + diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/debugger.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/debugger.lua new file mode 100644 index 0000000..73a79ff --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/debugger.lua @@ -0,0 +1,1343 @@ + +--{{{ history + +--15/03/06 DCN Created based on RemDebug +--28/04/06 DCN Update for Lua 5.1 +--01/06/06 DCN Fix command argument parsing +-- Add step/over N facility +-- Add trace lines facility +--05/06/06 DCN Add trace call/return facility +--06/06/06 DCN Make it behave when stepping through the creation of a coroutine +--06/06/06 DCN Integrate the simple debugger into the main one +--07/06/06 DCN Provide facility to step into coroutines +--13/06/06 DCN Fix bug that caused the function environment to get corrupted with the global one +--14/06/06 DCN Allow 'sloppy' file names when setting breakpoints +--04/08/06 DCN Allow for no space after command name +--11/08/06 DCN Use io.write not print +--30/08/06 DCN Allow access to array elements in 'dump' +--10/10/06 DCN Default to breakfile for all commands that require a filename and give '-' +--06/12/06 DCN Allow for punctuation characters in DUMP variable names +--03/01/07 DCN Add pause on/off facility +--19/06/07 DCN Allow for duff commands being typed in the debugger (thanks to Michael.Bringmann@lsi.com) +-- Allow for case sensitive file systems (thanks to Michael.Bringmann@lsi.com) + +--}}} +--{{{ description + +--A simple command line debug system for Lua written by Dave Nichols of +--Match-IT Limited. Its public domain software. Do with it as you wish. + +--This debugger was inspired by: +-- RemDebug 1.0 Beta +-- Copyright Kepler Project 2005 (http://www.keplerproject.org/remdebug) + +--Usage: +-- require('debugger') --load the debug library +-- pause(message) --start/resume a debug session + +--An assert() failure will also invoke the debugger. + +--}}} + +local IsWindows = string.find(string.lower(os.getenv('OS') or ''),'^windows') + +local coro_debugger +local events = { BREAK = 1, WATCH = 2, STEP = 3, SET = 4 } +local breakpoints = {} +local watches = {} +local step_into = false +local step_over = false +local step_lines = 0 +local step_level = {main=0} +local stack_level = {main=0} +local trace_level = {main=0} +local trace_calls = false +local trace_returns = false +local trace_lines = false +local ret_file, ret_line, ret_name +local current_thread = 'main' +local started = false +local pause_off = false +local _g = _G +local cocreate, cowrap = coroutine.create, coroutine.wrap +local pausemsg = 'pause' + +--{{{ local hints -- command help +--The format in here is name=summary|description +local hints = { + +pause = [[ +pause(msg) -- start/resume a debugger session| + +This can only be used in your code or from the console as a means to +start/resume a debug session. +If msg is given that is shown when the session starts/resumes. Useful to +give a context if you've instrumented your code with pause() statements. +]], + +poff = [[ +poff -- turn off pause() command| + +This causes all pause() commands to be ignored. This is useful if you have +instrumented your code in a busy loop and want to continue normal execution +with no further interruption. +]], + +pon = [[ +pon -- turn on pause() command| + +This re-instates honouring the pause() commands you may have instrumented +your code with. +]], + +setb = [[ +setb [line file] -- set a breakpoint to line/file| + +If file is omitted or is "-" the breakpoint is set at the file for the +currently set level (see "set"). Execution pauses when this line is about +to be executed and the debugger session is re-activated. + +The file can be given as the fully qualified name, partially qualified or +just the file name. E.g. if file is set as "myfile.lua", then whenever +execution reaches any file that ends with "myfile.lua" it will pause. +]], + +delb = [[ +delb [line file] -- removes a breakpoint| + +If file is omitted or is "-" the breakpoint is removed for the file of the +currently set level (see "set"). +]], + +delallb = [[ +delallb -- removes all breakpoints| +]], + +setw = [[ +setw -- adds a new watch expression| + +The expression is evaluated before each line is executed. If the expression +yields true then execution is paused and the debugger session re-activated. +The expression is executed in the context of the line about to be executed. +]], + +delw = [[ +delw -- removes the watch expression at index| + +The index is that returned when the watch expression was set by setw. +]], + +delallw = [[ +delallw -- removes all watch expressions| +]], + +run = [[ +run -- run until next breakpoint or watch expression| +]], + +step = [[ +step [N] -- run next N lines, stepping into function calls| + +If N is omitted, use 1. +]], + +over = [[ +over [N] -- run next N lines, stepping over function calls| + +If N is omitted, use 1. +]], + +out = [[ +out [N] -- run lines until stepped out of N functions| + +If N is omitted, use 1. +If you are inside a function, using "out 1" will run until you return +from that function to the caller. +]], + +goto = [[ +goto -- step to line number in the current file| + +The line and current file are those in the currently set context level. +]], + +listb = [[ +listb -- lists breakpoints| +]], + +listw = [[ +listw -- lists watch expressions| +]], + +set = [[ +set [level] -- set context to stack level, omitted=show| + +If level is omitted it just prints the current level set. +This sets the current context to the level given. This affects the +context used for several other functions (e.g. vars). The possible +levels are those shown by trace. +]], + +vars = [[ +vars [depth] -- list context locals to depth, omitted=1| + +If depth is omitted then uses 1. +Use a depth of 0 for the maximum. +Lists all non-nil local variables and all non-nil upvalues in the +currently set context. For variables that are tables, lists all fields +to the given depth. +]], + +fenv = [[ +fenv [depth] -- list context function env to depth, omitted=1| + +If depth is omitted then uses 1. +Use a depth of 0 for the maximum. +Lists all function environment variables in the currently set context. +For variables that are tables, lists all fields to the given depth. +]], + +glob = [[ +glob [depth] -- list globals to depth, omitted=1| + +If depth is omitted then uses 1. +Use a depth of 0 for the maximum. +Lists all global variables. +For variables that are tables, lists all fields to the given depth. +]], + +ups = [[ +ups -- list all the upvalue names| + +These names will also be in the "vars" list unless their value is nil. +This provides a means to identify which vars are upvalues and which are +locals. If a name is both an upvalue and a local, the local value takes +precedance. +]], + +locs = [[ +locs -- list all the locals names| + +These names will also be in the "vars" list unless their value is nil. +This provides a means to identify which vars are upvalues and which are +locals. If a name is both an upvalue and a local, the local value takes +precedance. +]], + +dump = [[ +dump [depth] -- dump all fields of variable to depth| + +If depth is omitted then uses 1. +Use a depth of 0 for the maximum. +Prints the value of in the currently set context level. If +is a table, lists all fields to the given depth. can be just a +name, or name.field or name.# to any depth, e.g. t.1.f accesses field +'f' in array element 1 in table 't'. + +Can also be called from a script as dump(var,depth). +]], + +tron = [[ +tron [crl] -- turn trace on for (c)alls, (r)etuns, (l)lines| + +If no parameter is given then tracing is turned off. +When tracing is turned on a line is printed to the console for each +debug 'event' selected. c=function calls, r=function returns, l=lines. +]], + +trace = [[ +trace -- dumps a stack trace| + +Format is [level] = file,line,name +The level is a candidate for use by the 'set' command. +]], + +info = [[ +info -- dumps the complete debug info captured| + +Only useful as a diagnostic aid for the debugger itself. This information +can be HUGE as it dumps all variables to the maximum depth, so be careful. +]], + +show = [[ +show line file X Y -- show X lines before and Y after line in file| + +If line is omitted or is '-' then the current set context line is used. +If file is omitted or is '-' then the current set context file is used. +If file is not fully qualified and cannot be opened as specified, then +a search for the file in the package[path] is performed using the usual +"require" searching rules. If no file extension is given, .lua is used. +Prints the lines from the source file around the given line. +]], + +exit = [[ +exit -- exits debugger, re-start it using pause()| +]], + +help = [[ +help [command] -- show this list or help for command| +]], + +[""] = [[ + -- execute a statement in the current context| + +The statement can be anything that is legal in the context, including +assignments. Such assignments affect the context and will be in force +immediately. Any results returned are printed. Use '=' as a short-hand +for 'return', e.g. "=func(arg)" will call 'func' with 'arg' and print +the results, and "=var" will just print the value of 'var'. +]], + +what = [[ +what -- show where is defined (if known)| +]], + +} +--}}} + +--{{{ local function getinfo(level,field) + +--like debug.getinfo but copes with no activation record at the given level +--and knows how to get 'field'. 'field' can be the name of any of the +--activation record fields or any of the 'what' names or nil for everything. +--only valid when using the stack level to get info, not a function name. + +local function getinfo(level,field) + level = level + 1 --to get to the same relative level as the caller + if not field then return debug.getinfo(level) end + local what + if field == 'name' or field == 'namewhat' then + what = 'n' + elseif field == 'what' or field == 'source' or field == 'linedefined' or field == 'lastlinedefined' or field == 'short_src' then + what = 'S' + elseif field == 'currentline' then + what = 'l' + elseif field == 'nups' then + what = 'u' + elseif field == 'func' then + what = 'f' + else + return debug.getinfo(level,field) + end + local ar = debug.getinfo(level,what) + if ar then return ar[field] else return nil end +end + +--}}} +--{{{ local function indented( level, ... ) + +local function indented( level, ... ) + io.write( string.rep(' ',level), table.concat({...}), '\n' ) +end + +--}}} +--{{{ local function dumpval( level, name, value, limit ) + +local dumpvisited + +local function dumpval( level, name, value, limit ) + local index + if type(name) == 'number' then + index = string.format('[%d] = ',name) + elseif type(name) == 'string' + and (name == '__VARSLEVEL__' or name == '__ENVIRONMENT__' or name == '__GLOBALS__' or name == '__UPVALUES__' or name == '__LOCALS__') then + --ignore these, they are debugger generated + return + elseif type(name) == 'string' and string.find(name,'^[_%a][_.%w]*$') then + index = name ..' = ' + else + index = string.format('[%q] = ',tostring(name)) + end + if type(value) == 'table' then + if dumpvisited[value] then + indented( level, index, string.format('ref%q;',dumpvisited[value]) ) + else + dumpvisited[value] = tostring(value) + if (limit or 0) > 0 and level+1 >= limit then + indented( level, index, dumpvisited[value] ) + else + indented( level, index, '{ -- ', dumpvisited[value] ) + for n,v in pairs(value) do + dumpval( level+1, n, v, limit ) + end + indented( level, '};' ) + end + end + else + if type(value) == 'string' then + if string.len(value) > 40 then + indented( level, index, '[[', value, ']];' ) + else + indented( level, index, string.format('%q',value), ';' ) + end + else + indented( level, index, tostring(value), ';' ) + end + end +end + +--}}} +--{{{ local function dumpvar( value, limit, name ) + +local function dumpvar( value, limit, name ) + dumpvisited = {} + dumpval( 0, name or tostring(value), value, limit ) +end + +--}}} +--{{{ local function show(file,line,before,after) + +--show +/-N lines of a file around line M + +local function show(file,line,before,after) + + line = tonumber(line or 1) + before = tonumber(before or 10) + after = tonumber(after or before) + + if not string.find(file,'%.') then file = file..'.lua' end + + local f = io.open(file,'r') + if not f then + --{{{ try to find the file in the path + + -- + -- looks for a file in the package path + -- + local path = package.path or LUA_PATH or '' + for c in string.gmatch (path, "[^;]+") do + local c = string.gsub (c, "%?%.lua", file) + f = io.open (c,'r') + if f then + break + end + end + + --}}} + if not f then + io.write('Cannot find '..file..'\n') + return + end + end + + local i = 0 + for l in f:lines() do + i = i + 1 + if i >= (line-before) then + if i > (line+after) then break end + if i == line then + io.write(i..'***\t'..l..'\n') + else + io.write(i..'\t'..l..'\n') + end + end + end + + f:close() + +end + +--}}} +--{{{ local function tracestack(l) + +local function gi( i ) + return function() i=i+1 return debug.getinfo(i),i end +end + +local function gl( level, j ) + return function() j=j+1 return debug.getlocal( level, j ) end +end + +local function gu( func, k ) + return function() k=k+1 return debug.getupvalue( func, k ) end +end + +local traceinfo + +local function tracestack(l) + local l = l + 1 --NB: +1 to get level relative to caller + traceinfo = {} + traceinfo.pausemsg = pausemsg + for ar,i in gi(l) do + table.insert( traceinfo, ar ) + local names = {} + local values = {} + for n,v in gl(i,0) do + if string.sub(n,1,1) ~= '(' then --ignore internal control variables + table.insert( names, n ) + table.insert( values, v ) + end + end + if #names > 0 then + ar.lnames = names + ar.lvalues = values + end + if ar.func then + local names = {} + local values = {} + for n,v in gu(ar.func,0) do + if string.sub(n,1,1) ~= '(' then --ignore internal control variables + table.insert( names, n ) + table.insert( values, v ) + end + end + if #names > 0 then + ar.unames = names + ar.uvalues = values + end + end + end +end + +--}}} +--{{{ local function trace() + +local function trace(set) + local mark + for level,ar in ipairs(traceinfo) do + if level == set then + mark = '***' + else + mark = '' + end + io.write('['..level..']'..mark..'\t'..(ar.name or ar.what)..' in '..ar.short_src..':'..ar.currentline..'\n') + end +end + +--}}} +--{{{ local function info() + +local function info() dumpvar( traceinfo, 0, 'traceinfo' ) end + +--}}} + +--{{{ local function set_breakpoint(file, line) + +local function set_breakpoint(file, line) + if not breakpoints[line] then + breakpoints[line] = {} + end + breakpoints[line][file] = true +end + +--}}} +--{{{ local function remove_breakpoint(file, line) + +local function remove_breakpoint(file, line) + if breakpoints[line] then + breakpoints[line][file] = nil + end +end + +--}}} +--{{{ local function has_breakpoint(file, line) + +--allow for 'sloppy' file names +--search for file and all variations walking up its directory hierachy +--ditto for the file with no extension + +local function has_breakpoint(file, line) + if not breakpoints[line] then return false end + local noext = string.gsub(file,"(%..-)$",'',1) + if noext == file then noext = nil end + while file do + if breakpoints[line][file] then return true end + file = string.match(file,"[:/\](.+)$") + end + while noext do + if breakpoints[line][noext] then return true end + noext = string.match(noext,"[:/\](.+)$") + end + return false +end + +--}}} +--{{{ local function capture_vars(ref,level,line) + +local function capture_vars(ref,level,line) + --get vars, file and line for the given level relative to debug_hook offset by ref + + local lvl = ref + level --NB: This includes an offset of +1 for the call to here + + --{{{ capture variables + + local ar = debug.getinfo(lvl, "f") + if not ar then return {},'?',0 end + + local vars = {__UPVALUES__={}, __LOCALS__={}} + local i + + local func = ar.func + if func then + i = 1 + while true do + local name, value = debug.getupvalue(func, i) + if not name then break end + if string.sub(name,1,1) ~= '(' then --NB: ignoring internal control variables + vars[name] = value + vars.__UPVALUES__[i] = name + end + i = i + 1 + end + vars.__ENVIRONMENT__ = getfenv(func) + end + + vars.__GLOBALS__ = getfenv(0) + + i = 1 + while true do + local name, value = debug.getlocal(lvl, i) + if not name then break end + if string.sub(name,1,1) ~= '(' then --NB: ignoring internal control variables + vars[name] = value + vars.__LOCALS__[i] = name + end + i = i + 1 + end + + vars.__VARSLEVEL__ = level + + if func then + --NB: Do not do this until finished filling the vars table + setmetatable(vars, { __index = getfenv(func), __newindex = getfenv(func) }) + end + + --NB: Do not read or write the vars table anymore else the metatable functions will get invoked! + + --}}} + + local file = getinfo(lvl, "source") + if string.find(file, "@") == 1 then + file = string.sub(file, 2) + end + if IsWindows then file = string.lower(file) end + + if not line then + line = getinfo(lvl, "currentline") + end + + return vars,file,line + +end + +--}}} +--{{{ local function restore_vars(ref,vars) + +local function restore_vars(ref,vars) + + if type(vars) ~= 'table' then return end + + local level = vars.__VARSLEVEL__ --NB: This level is relative to debug_hook offset by ref + if not level then return end + + level = level + ref --NB: This includes an offset of +1 for the call to here + + local i + local written_vars = {} + + i = 1 + while true do + local name, value = debug.getlocal(level, i) + if not name then break end + if vars[name] and string.sub(name,1,1) ~= '(' then --NB: ignoring internal control variables + debug.setlocal(level, i, vars[name]) + written_vars[name] = true + end + i = i + 1 + end + + local ar = debug.getinfo(level, "f") + if not ar then return end + + local func = ar.func + if func then + + i = 1 + while true do + local name, value = debug.getupvalue(func, i) + if not name then break end + if vars[name] and string.sub(name,1,1) ~= '(' then --NB: ignoring internal control variables + if not written_vars[name] then + debug.setupvalue(func, i, vars[name]) + end + written_vars[name] = true + end + i = i + 1 + end + + end + +end + +--}}} +--{{{ local function trace_event(event, line, level) + +local function print_trace(level,depth,event,file,line,name) + + --NB: level here is relative to the caller of trace_event, so offset by 2 to get to there + level = level + 2 + + local file = file or getinfo(level,'short_src') + local line = line or getinfo(level,'currentline') + local name = name or getinfo(level,'name') + + local prefix = '' + if current_thread ~= 'main' then prefix = '['..tostring(current_thread)..'] ' end + + io.write(prefix.. + string.format('%08.2f:%02i.',os.clock(),depth).. + string.rep('.',depth%32).. + (file or '')..' ('..(line or '')..') '.. + (name or '').. + ' ('..event..')\n') + +end + +local function trace_event(event, line, level) + + if event == 'return' and trace_returns then + --note the line info for later + ret_file = getinfo(level+1,'short_src') + ret_line = getinfo(level+1,'currentline') + ret_name = getinfo(level+1,'name') + end + + if event ~= 'line' then return end + + local slevel = stack_level[current_thread] + local tlevel = trace_level[current_thread] + + if trace_calls and slevel > tlevel then + --we are now in the function called, so look back 1 level further to find the calling file and line + print_trace(level+1,slevel-1,'c',nil,nil,getinfo(level+1,'name')) + end + + if trace_returns and slevel < tlevel then + print_trace(level,slevel,'r',ret_file,ret_line,ret_name) + end + + if trace_lines then + print_trace(level,slevel,'l') + end + + trace_level[current_thread] = stack_level[current_thread] + +end + +--}}} +--{{{ local function debug_hook(event, line, level, thread) + +local function debug_hook(event, line, level, thread) + if not started then debug.sethook() return end + current_thread = thread or 'main' + local level = level or 2 + trace_event(event,line,level) + if event == "call" then + stack_level[current_thread] = stack_level[current_thread] + 1 + elseif event == "return" then + stack_level[current_thread] = stack_level[current_thread] - 1 + if stack_level[current_thread] < 0 then stack_level[current_thread] = 0 end + else + local vars,file,line = capture_vars(level,1,line) + local stop, ev, idx = false, events.STEP, 0 + while true do + for index, value in pairs(watches) do + setfenv(value.func, vars) + local status, res = pcall(value.func) + if status and res then + ev, idx = events.WATCH, index + stop = true + break + end + end + if stop then break end + if (step_into) + or (step_over and (stack_level[current_thread] <= step_level[current_thread] or stack_level[current_thread] == 0)) then + step_lines = step_lines - 1 + if step_lines < 1 then + ev, idx = events.STEP, 0 + break + end + end + if has_breakpoint(file, line) then + ev, idx = events.BREAK, 0 + break + end + return + end + tracestack(level) + local last_next = 1 + local err, next = assert(coroutine.resume(coro_debugger, ev, vars, file, line, idx)) + while true do + if next == 'cont' then + return + elseif next == 'stop' then + started = false + debug.sethook() + return + elseif tonumber(next) then --get vars for given level or last level + next = tonumber(next) + if next == 0 then next = last_next end + last_next = next + restore_vars(level,vars) + vars, file, line = capture_vars(level,next) + err, next = assert(coroutine.resume(coro_debugger, events.SET, vars, file, line, idx)) + else + io.write('Unknown command from debugger_loop: '..tostring(next)..'\n') + io.write('Stopping debugger\n') + next = 'stop' + end + end + end +end + +--}}} +--{{{ local function report(ev, vars, file, line, idx_watch) + +local function report(ev, vars, file, line, idx_watch) + local vars = vars or {} + local file = file or '?' + local line = line or 0 + local prefix = '' + if current_thread ~= 'main' then prefix = '['..tostring(current_thread)..'] ' end + if ev == events.STEP then + io.write(prefix.."Paused at file "..file.." line "..line..' ('..stack_level[current_thread]..')\n') + elseif ev == events.BREAK then + io.write(prefix.."Paused at file "..file.." line "..line..' ('..stack_level[current_thread]..') (breakpoint)\n') + elseif ev == events.WATCH then + io.write(prefix.."Paused at file "..file.." line "..line..' ('..stack_level[current_thread]..')'.." (watch expression "..idx_watch.. ": ["..watches[idx_watch].exp.."])\n") + elseif ev == events.SET then + --do nothing + else + io.write(prefix.."Error in application: "..file.." line "..line.."\n") + end + if ev ~= events.SET then + if pausemsg and pausemsg ~= '' then io.write('Message: '..pausemsg..'\n') end + pausemsg = '' + end + return vars, file, line +end + +--}}} + +--{{{ local function debugger_loop(server) + +local function debugger_loop(ev, vars, file, line, idx_watch) + + io.write("Lua Debugger\n") + local eval_env, breakfile, breakline = report(ev, vars, file, line, idx_watch) + io.write("Type 'help' for commands\n") + + local command, args + + --{{{ local function getargs(spec) + + --get command arguments according to the given spec from the args string + --the spec has a single character for each argument, arguments are separated + --by white space, the spec characters can be one of: + -- F for a filename (defaults to breakfile if - given in args) + -- L for a line number (defaults to breakline if - given in args) + -- N for a number + -- V for a variable name + -- S for a string + + local function getargs(spec) + local res={} + local char,arg + local ptr=1 + local _ + for i=1,string.len(spec) do + char = string.sub(spec,i,i) + if char == 'F' then + _,ptr,arg = string.find(args..' ',"%s*([%w%p]*)%s*",ptr) + if not arg or arg == '' then arg = '-' end + if arg == '-' then arg = breakfile end + elseif char == 'L' then + _,ptr,arg = string.find(args..' ',"%s*([%w%p]*)%s*",ptr) + if not arg or arg == '' then arg = '-' end + if arg == '-' then arg = breakline end + arg = tonumber(arg) or 0 + elseif char == 'N' then + _,ptr,arg = string.find(args..' ',"%s*([%w%p]*)%s*",ptr) + if not arg or arg == '' then arg = '0' end + arg = tonumber(arg) or 0 + elseif char == 'V' then + _,ptr,arg = string.find(args..' ',"%s*([%w%p]*)%s*",ptr) + if not arg or arg == '' then arg = '' end + elseif char == 'S' then + _,ptr,arg = string.find(args..' ',"%s*([%w%p]*)%s*",ptr) + if not arg or arg == '' then arg = '' end + else + arg = '' + end + table.insert(res,arg or '') + end + return unpack(res) + end + + --}}} + + while true do + io.write("[DEBUG]> ") + local line = io.read("*line") + if line == nil then io.write('\n'); line = 'exit' end + + if string.find(line, "^[a-z]+") then + command = string.sub(line, string.find(line, "^[a-z]+")) + args = string.gsub(line,"^[a-z]+%s*",'',1) --strip command off line + else + command = '' + end + + if command == "setb" then + --{{{ set breakpoint + + local line, filename = getargs('LF') + if filename ~= '' and line ~= '' then + set_breakpoint(filename,line) + io.write("Breakpoint set in file "..filename..' line '..line..'\n') + else + io.write("Bad request\n") + end + + --}}} + + elseif command == "delb" then + --{{{ delete breakpoint + + local line, filename = getargs('LF') + if filename ~= '' and line ~= '' then + remove_breakpoint(filename, line) + io.write("Breakpoint deleted from file "..filename..' line '..line.."\n") + else + io.write("Bad request\n") + end + + --}}} + + elseif command == "delallb" then + --{{{ delete all breakpoints + breakpoints = {} + io.write('All breakpoints deleted\n') + --}}} + + elseif command == "listb" then + --{{{ list breakpoints + for i, v in pairs(breakpoints) do + for ii, vv in pairs(v) do + io.write("Break at: "..i..' in '..ii..'\n') + end + end + --}}} + + elseif command == "setw" then + --{{{ set watch expression + + if args and args ~= '' then + local func = loadstring("return(" .. args .. ")") + local newidx = #watches + 1 + watches[newidx] = {func = func, exp = args} + io.write("Set watch exp no. " .. newidx..'\n') + else + io.write("Bad request\n") + end + + --}}} + + elseif command == "delw" then + --{{{ delete watch expression + + local index = tonumber(args) + if index then + watches[index] = nil + io.write("Watch expression deleted\n") + else + io.write("Bad request\n") + end + + --}}} + + elseif command == "delallw" then + --{{{ delete all watch expressions + watches = {} + io.write('All watch expressions deleted\n') + --}}} + + elseif command == "listw" then + --{{{ list watch expressions + for i, v in pairs(watches) do + io.write("Watch exp. " .. i .. ": " .. v.exp..'\n') + end + --}}} + + elseif command == "run" then + --{{{ run until breakpoint + step_into = false + step_over = false + eval_env, breakfile, breakline = report(coroutine.yield('cont')) + --}}} + + elseif command == "step" then + --{{{ step N lines (into functions) + local N = tonumber(args) or 1 + step_over = false + step_into = true + step_lines = tonumber(N or 1) + eval_env, breakfile, breakline = report(coroutine.yield('cont')) + --}}} + + elseif command == "over" then + --{{{ step N lines (over functions) + local N = tonumber(args) or 1 + step_into = false + step_over = true + step_lines = tonumber(N or 1) + step_level[current_thread] = stack_level[current_thread] + eval_env, breakfile, breakline = report(coroutine.yield('cont')) + --}}} + + elseif command == "out" then + --{{{ step N lines (out of functions) + local N = tonumber(args) or 1 + step_into = false + step_over = true + step_lines = 1 + step_level[current_thread] = stack_level[current_thread] - tonumber(N or 1) + eval_env, breakfile, breakline = report(coroutine.yield('cont')) + --}}} + + elseif command == "goto" then + --{{{ step until reach line + local N = tonumber(args) + if N then + step_over = false + step_into = false + if has_breakpoint(breakfile,N) then + eval_env, breakfile, breakline = report(coroutine.yield('cont')) + else + local bf = breakfile + set_breakpoint(breakfile,N) + eval_env, breakfile, breakline = report(coroutine.yield('cont')) + if breakfile == bf and breakline == N then remove_breakpoint(breakfile,N) end + end + else + io.write("Bad request\n") + end + --}}} + + elseif command == "set" then + --{{{ set/show context level + local level = args + if level and level == '' then level = nil end + if level then + eval_env, breakfile, breakline = report(coroutine.yield(level)) + end + if eval_env.__VARSLEVEL__ then + io.write('Level: '..eval_env.__VARSLEVEL__..'\n') + else + io.write('No level set\n') + end + --}}} + + elseif command == "vars" then + --{{{ list context variables + local depth = args + if depth and depth == '' then depth = nil end + depth = tonumber(depth) or 1 + dumpvar(eval_env, depth+1, 'variables') + --}}} + + elseif command == "glob" then + --{{{ list global variables + local depth = args + if depth and depth == '' then depth = nil end + depth = tonumber(depth) or 1 + dumpvar(eval_env.__GLOBALS__,depth+1,'globals') + --}}} + + elseif command == "fenv" then + --{{{ list function environment variables + local depth = args + if depth and depth == '' then depth = nil end + depth = tonumber(depth) or 1 + dumpvar(eval_env.__ENVIRONMENT__,depth+1,'environment') + --}}} + + elseif command == "ups" then + --{{{ list upvalue names + dumpvar(eval_env.__UPVALUES__,2,'upvalues') + --}}} + + elseif command == "locs" then + --{{{ list locals names + dumpvar(eval_env.__LOCALS__,2,'upvalues') + --}}} + + elseif command == "what" then + --{{{ show where a function is defined + if args and args ~= '' then + local v = eval_env + local n = nil + for w in string.gmatch(args,"[%w_]+") do + v = v[w] + if n then n = n..'.'..w else n = w end + if not v then break end + end + if type(v) == 'function' then + local def = debug.getinfo(v,'S') + if def then + io.write(def.what..' in '..def.short_src..' '..def.linedefined..'..'..def.lastlinedefined..'\n') + else + io.write('Cannot get info for '..v..'\n') + end + else + io.write(v..' is not a function\n') + end + else + io.write("Bad request\n") + end + --}}} + + elseif command == "dump" then + --{{{ dump a variable + local name, depth = getargs('VN') + if name ~= '' then + if depth == '' or depth == 0 then depth = nil end + depth = tonumber(depth or 1) + local v = eval_env + local n = nil + for w in string.gmatch(name,"[^%.]+") do --get everything between dots + if tonumber(w) then + v = v[tonumber(w)] + else + v = v[w] + end + if n then n = n..'.'..w else n = w end + if not v then break end + end + dumpvar(v,depth+1,n) + else + io.write("Bad request\n") + end + --}}} + + elseif command == "show" then + --{{{ show file around a line or the current breakpoint + + local line, file, before, after = getargs('LFNN') + if before == 0 then before = 10 end + if after == 0 then after = before end + + if file ~= '' and file ~= "=stdin" then + show(file,line,before,after) + else + io.write('Nothing to show\n') + end + + --}}} + + elseif command == "poff" then + --{{{ turn pause command off + pause_off = true + --}}} + + elseif command == "pon" then + --{{{ turn pause command on + pause_off = false + --}}} + + elseif command == "tron" then + --{{{ turn tracing on/off + local option = getargs('S') + trace_calls = false + trace_returns = false + trace_lines = false + if string.find(option,'c') then trace_calls = true end + if string.find(option,'r') then trace_returns = true end + if string.find(option,'l') then trace_lines = true end + --}}} + + elseif command == "trace" then + --{{{ dump a stack trace + trace(eval_env.__VARSLEVEL__) + --}}} + + elseif command == "info" then + --{{{ dump all debug info captured + info() + --}}} + + elseif command == "pause" then + --{{{ not allowed in here + io.write('pause() should only be used in the script you are debugging\n') + --}}} + + elseif command == "help" then + --{{{ help + local command = getargs('S') + if command ~= '' and hints[command] then + io.write(hints[command]..'\n') + else + for _,v in pairs(hints) do + local _,_,h = string.find(v,"(.+)|") + io.write(h..'\n') + end + end + --}}} + + elseif command == "exit" then + --{{{ exit debugger + return 'stop' + --}}} + + elseif line ~= '' then + --{{{ just execute whatever it is in the current context + + --map line starting with "=..." to "return ..." + if string.sub(line,1,1) == '=' then line = string.gsub(line,'=','return ',1) end + + local ok, func = pcall(loadstring,line) + if func == nil then --Michael.Bringmann@lsi.com + io.write("Compile error: "..line..'\n') + elseif not ok then + io.write("Compile error: "..func..'\n') + else + setfenv(func, eval_env) + local res = {pcall(func)} + if res[1] then + if res[2] then + table.remove(res,1) + for _,v in ipairs(res) do + io.write(tostring(v)) + io.write('\t') + end + io.write('\n') + end + --update in the context + eval_env, breakfile, breakline = report(coroutine.yield(0)) + else + io.write("Run error: "..res[2]..'\n') + end + end + + --}}} + end + end + +end + +--}}} + +--{{{ coroutine.create + +--This function overrides the built-in for the purposes of propagating +--the debug hook settings from the creator into the created coroutine. + +_G.coroutine.create = function(f) + local thread + local hook, mask, count = debug.gethook() + if hook then + local function thread_hook(event,line) + hook(event,line,3,thread) + end + thread = cocreate(function(...) + stack_level[thread] = 0 + trace_level[thread] = 0 + step_level [thread] = 0 + debug.sethook(thread_hook,mask,count) + return f(...) + end) + return thread + else + return cocreate(f) + end +end + +--}}} +--{{{ coroutine.wrap + +--This function overrides the built-in for the purposes of propagating +--the debug hook settings from the creator into the created coroutine. + +_G.coroutine.wrap = function(f) + local thread + local hook, mask, count = debug.gethook() + if hook then + local function thread_hook(event,line) + hook(event,line,3,thread) + end + thread = cowrap(function(...) + stack_level[thread] = 0 + trace_level[thread] = 0 + step_level [thread] = 0 + debug.sethook(thread_hook,mask,count) + return f(...) + end) + return thread + else + return cowrap(f) + end +end + +--}}} + +--{{{ function pause() + +-- +-- Starts/resumes a debug session +-- + +function pause(x) + if pause_off then return end --being told to ignore pauses + pausemsg = x or 'pause' + local lines + local src = getinfo(2,'short_src') + if src == "stdin" then + lines = 1 --if in a console session, stop now + else + lines = 2 --if in a script, stop when get out of pause() + end + if started then + --we'll stop now 'cos the existing debug hook will grab us + step_lines = lines + step_into = true + else + coro_debugger = cocreate(debugger_loop) --NB: Use original coroutune.create + --set to stop when get out of pause() + trace_level[current_thread] = 0 + step_level [current_thread] = 0 + stack_level[current_thread] = 1 + step_lines = lines + step_into = true + started = true + debug.sethook(debug_hook, "crl") --NB: this will cause an immediate entry to the debugger_loop + end +end + +--}}} +--{{{ function dump() + +--shows the value of the given variable, only really useful +--when the variable is a table +--see dump debug command hints for full semantics + +function dump(v,depth) + dumpvar(v,(depth or 1)+1,tostring(v)) +end + +--}}} +--{{{ function debug.traceback(x) + +local _traceback = debug.traceback --note original function + +--override standard function +debug.traceback = function(x) + local assertmsg = _traceback(x) --do original function + pause(x) --let user have a look at stuff + return assertmsg --carry on +end + +_TRACEBACK = debug.traceback --Lua 5.0 function + +--}}} + diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/decl.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/decl.lua new file mode 100644 index 0000000..9ede9c4 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/decl.lua @@ -0,0 +1,91 @@ +module(..., package.seeall) + +local nodegen = require "tundra.nodegen" + +local functions = {} +local _decl_meta = {} +_decl_meta.__index = _decl_meta + +local current = nil + +local function new_parser() + local obj = { + Functions = {}, + Results = {}, + DefaultTargets = {}, + AlwaysTargets = {}, + } + + local outer_env = _G + local iseval = nodegen.is_evaluator + local function indexfunc(tab, var) + if iseval(var) then + -- Return an anonymous function such that + -- the code "Foo { ... }" will result in a call to + -- "nodegen.evaluate('Foo', { ... })" + return function (data) + local result = nodegen.evaluate(var, data) + obj.Results[#obj.Results + 1] = result + return result + end + end + local p = obj.Functions[var] + if p then return p end + return outer_env[var] + end + + obj.FunctionMeta = { __index = indexfunc, __newindex = error } + obj.FunctionEnv = setmetatable({}, obj.FunctionMeta) + + for name, fn in pairs(functions) do + obj.Functions[name] = setfenv(fn, obj.FunctionEnv) + end + + obj.Functions["Default"] = function(default_obj) + obj.DefaultTargets[#obj.DefaultTargets + 1] = default_obj + end + + obj.Functions["Always"] = function(always_obj) + obj.AlwaysTargets[#obj.AlwaysTargets + 1] = always_obj + end + + current = setmetatable(obj, _decl_meta) + return current +end + +function add_function(name, fn) + assert(name and fn) + functions[name] = fn + + if current then + -- require called from within unit script + current.Functions[name] = setfenv(fn, current.FunctionEnv) + end +end + +function _decl_meta:parse_rec(data) + local chunk + if type(data) == "table" then + for _, gen in ipairs(data) do + self:parse_rec(gen) + end + return + elseif type(data) == "function" then + chunk = data + elseif type(data) == "string" then + chunk = assert(loadfile(data)) + else + croak("unknown type %s for unit_generator %q", type(data), tostring(data)) + end + + setfenv(chunk, self.FunctionEnv) + chunk() +end + +function parse(data) + p = new_parser() + current = p + p:parse_rec(data) + current = nil + return p.Results, p.DefaultTargets, p.AlwaysTargets +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/depgraph.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/depgraph.lua new file mode 100644 index 0000000..d7a0bdf --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/depgraph.lua @@ -0,0 +1,155 @@ +module(..., package.seeall) + +local boot = require "tundra.boot" +local util = require "tundra.util" +local path = require "tundra.path" +local native = require "tundra.native" +local environment = require "tundra.environment" + +local default_pass = { Name = "Default", BuildOrder = 100000 } + +local all_nodes = {} + +local _node_mt = {} +_node_mt.__index = _node_mt + +function make_node(data_) + local env_ = data_.Env + assert(environment.is_environment(env_), "Env must be provided") + + local root_path = native.getcwd() .. env_:get('SEP') + + local function path_for_cmdline(p) + local full_path + if path.is_absolute(p) then + full_path = p + else + full_path = root_path .. p + end + if full_path:find(' ', 1, true) then + return '"' .. full_path .. '"' + else + return full_path + end + end + + local function normalize_paths(paths) + return util.mapnil(paths, function (x) + if type(x) == "string" then + local v = env_:interpolate(x) + v = path.normalize(v) + return v + else + return x + end + end) + end + + -- these are the inputs that $(<) expand to + local regular_inputs = normalize_paths(data_.InputFiles) + + -- these are other, auxillary input files that shouldn't appear on the command line + -- useful to e.g. add an input dependency on a tool + local implicit_inputs = normalize_paths(data_.ImplicitInputs) + + local inputs = util.merge_arrays_2(regular_inputs, implicit_inputs) + local outputs = normalize_paths(data_.OutputFiles) + + local inputs_sorted = inputs and util.clone_array(inputs) or {} + local outputs_sorted = outputs and util.clone_array(outputs) or {} + + local cmdline_inputs = util.merge_arrays(regular_inputs, data_.InputFilesUntracked) + + table.sort(inputs_sorted) + table.sort(outputs_sorted) + + -- Quote the paths before interpolation into the command line + local expand_env = { + ['<'] = util.mapnil(cmdline_inputs, path_for_cmdline), + ['@'] = util.mapnil(outputs, path_for_cmdline), + } + + local expand_env_pretty = { + ['<'] = cmdline_inputs, + ['@'] = outputs, + } + + local overwrite = true + if type(data_.OverwriteOutputs) ~= "nil" then + overwrite = data_.OverwriteOutputs + end + + if data_.Scanner and not data_.Scanner.Kind then + errorf("Missing scanner kind") + end + + -- make sure dependencies are unique + local unique_deps = util.uniq(data_.Dependencies or {}) + + local params = { + pass = data_.Pass or default_pass, + scanner = data_.Scanner, + deps = unique_deps, + inputs = inputs_sorted, + outputs = outputs_sorted, + is_precious = data_.Precious, + expensive = data_.Expensive, + overwrite_outputs = overwrite, + src_env = env_, + env = env_.external_vars, + aux_outputs = util.mapnil(data_.AuxOutputFiles, function (x) + local result = env_:interpolate(x, expand_env) + return path.normalize(result) + end), + } + + if data_.Action then + params.action = env_:interpolate(data_.Action, expand_env) + else + assert(0 == #params.outputs, "can't have output files without an action") + params.action = "" + end + + if data_.PreAction then + params.preaction = env_:interpolate(data_.PreAction, expand_env) + end + + params.annotation = env_:interpolate(data_.Label or "?", expand_env_pretty) + + local result = setmetatable(params, _node_mt) + + -- Stash node + all_nodes[#all_nodes + 1] = result + + return result +end + +function is_node(obj) + return getmetatable(obj) == _node_mt +end + +function _node_mt:insert_output_files(tab, exts) + if exts then + local lut = util.make_lookup_table(exts) + for _, fn in ipairs(self.outputs) do + local ext = path.get_extension(fn) + if lut[ext] then + tab[#tab + 1] = fn + end + end + else + for _, fn in ipairs(self.outputs) do + tab[#tab + 1] = fn + end + end +end + +function _node_mt:insert_deps(tab) + for _, dep in util.nil_ipairs(self.deps) do + tab[#tab + 1] = dep + end +end + +function get_all_nodes() + return all_nodes +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/dirwalk.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/dirwalk.lua new file mode 100644 index 0000000..cfa067d --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/dirwalk.lua @@ -0,0 +1,41 @@ +module(..., package.seeall) + +local native = require "tundra.native" + +-- Stash of all dir walks performed for signature generation. +local query_records = {} + +function walk(path, filter_callback) + + local dir_stack = { path } + local paths_out = {} + + while #dir_stack > 0 do + local dir = dir_stack[#dir_stack] + table.remove(dir_stack) + + local subdirs, files = native.list_directory(dir) + query_records[dir] = { Files = files, SubDirs = subdirs } + + for _, subdir in ipairs(subdirs) do + full_dir_path = dir .. SEP .. subdir + if not filter_callback or filter_callback(subdir) then + table.insert(dir_stack, full_dir_path) + end + end + + for _, file in ipairs(files) do + table.insert(paths_out, dir .. SEP .. file) + end + end + + return paths_out +end + +function all_queries() + local result = {} + for k, v in pairs(query_records) do + result[#result + 1] = { Path = k, Files = v.Files, SubDirs = v.SubDirs } + end + return result +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/environment.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/environment.lua new file mode 100644 index 0000000..7934620 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/environment.lua @@ -0,0 +1,316 @@ +module(..., package.seeall) + +local util = require 'tundra.util' +local path = require 'tundra.path' +local depgraph = require 'tundra.depgraph' +local nenv = require 'tundra.environment.native' +local os = require 'os' + +local global_setup = {} + +--[==[ + +The environment is a holder for variables and their associated values. Values +are always kept as tables, even if there is only a single value. + +FOO = { a b c } + +e:interpolate("$(FOO)") -> "a b c" +e:interpolate("$(FOO:j, )") -> "a, b, c" +e:interpolate("$(FOO:p-I)") -> "-Ia -Ib -Ic" + +Missing keys trigger errors unless a default value is specified. + +]==]-- + +local envclass = {} + +function envclass:create(parent, assignments, obj) + obj = obj or {} + setmetatable(obj, self) + self.__index = self + + obj.cached_interpolation = {} + obj.vars = {} + obj.parent = parent + obj.lookup = { obj.vars } + obj.memos = {} + obj.memo_keys = {} + obj.external_vars = parent and util.clone_table(parent.external_vars) or nil + + -- assign initial bindings + if assignments then + obj:set_many(assignments) + end + + return obj +end + +function envclass:clone(assignments) + return envclass:create(self, assignments) +end + +function envclass:register_implicit_make_fn(ext, fn, docstring) + if type(ext) ~= "string" then + errorf("extension must be a string") + end + if type(fn) ~= "function" then + errorf("fn must be a function") + end + + if not ext:match("^%.") then + ext = "." .. ext -- we want the dot in the extension + end + + if not self._implicit_exts then + self._implicit_exts = {} + end + + self._implicit_exts[ext] = { + Function = fn, + Doc = docstring or "", + } +end + +function envclass:get_implicit_make_fn(filename) + local ext = path.get_extension(filename) + local chain = self + while chain do + local t = chain._implicit_exts + if t then + local v = t[ext] + if v then return v.Function end + end + chain = chain.parent + end + return nil +end + +function envclass:has_key(key) + local chain = self + while chain do + if chain.vars[key] then + return true + end + chain = chain.parent + end + + return false +end + +function envclass:get_vars() + return self.vars +end + +function envclass:set_many(table) + for k, v in pairs(table) do + self:set(k, v) + end +end + +function envclass:append(key, value) + if type(value) ~= "string" then + error("environment append: " .. util.tostring(value) .. " is not a string", 2) + end + self:invalidate_memos(key) + local t = self:get_list(key, 1) + local result + if type(t) == "table" then + result = util.clone_array(t) + table.insert(result, value) + else + result = { value } + end + self.vars[key] = result +end + +function envclass:append_many(data) + for k, v in pairs(data) do + self:append(k, v) + end +end + +function envclass:replace(key, value) + if type(value) == "string" then + value = { value } + end + assert(type(value) == "table") + + self:invalidate_memos(key) + self.vars[key] = value +end + +function envclass:invalidate_memos(key) + self.cached_interpolation = {} + local name_tab = self.memo_keys[key] + if name_tab then + for name, _ in pairs(name_tab) do + self.memos[name] = nil + end + end +end + +function envclass:set_default(key, value) + if not self:has_key(key) then + self:set(key, value) + end +end + +function envclass:set_default_many(table) + for key, value in pairs(table) do + self:set_default(key, value) + end +end + +function envclass:set(key, value) + self:invalidate_memos(key) + assert(key:len() > 0, "key must not be empty") + assert(type(key) == "string", "key must be a string") + if type(value) == "string" then + if value:len() > 0 then + self.vars[key] = { value } + else + -- let empty strings make empty tables + self.vars[key] = {} + end + elseif type(value) == "table" then + -- FIXME: should filter out empty values + for _, v in ipairs(value) do + if not type(v) == "string" then + error("key " .. key .. "'s table value contains non-string value " .. tostring(v)) + end + end + self.vars[key] = util.clone_array(value) + else + error("key " .. key .. "'s value is neither table nor string: " .. tostring(value)) + end +end + +function envclass:get_id() + return self.id +end + +function envclass:get(key, default) + local v = self.vars[key] + if v then + return table.concat(v, " ") + elseif self.parent then + return self.parent:get(key, default) + elseif default then + return default + else + error(string.format("key '%s' not present in environment", key)) + end +end + +function envclass:get_list(key, default) + local v = self.vars[key] + if v then + return v -- FIXME: this should be immutable from the outside + elseif self.parent then + return self.parent:get_list(key, default) + elseif default then + return default + elseif not key then + error("nil key is not allowed") + else + error(string.format("key '%s' not present in environment", key)) + end +end + +function envclass:get_parent() + return self.parent +end + +function envclass:interpolate(str, vars) + local cached = self.cached_interpolation[str] + + if not cached then + cached = nenv.interpolate(str, self) + self.cached_interpolation[str] = cached + end + + if vars then + return nenv.interpolate(cached, self, vars) + else + return cached + end +end + +function create(parent, assignments, obj) + return envclass:create(parent, assignments, obj) +end + +function envclass:record_memo_var(key, name) + local tab = self.memo_keys[key] + if not tab then + tab = {} + self.memo_keys[key] = tab + end + tab[name] = true +end + +function envclass:memoize(key, name, fn) + local memo = self.memos[name] + if not memo then + self:record_memo_var(key, name) + memo = fn() + self.memos[name] = memo + end + return memo +end + +function envclass:get_external_env_var(key) + local chain = self + while chain do + local t = self.external_vars + if t then + local v = t[key] + if v then return v end + end + + chain = chain.parent + end + + return os.getenv(key) +end + +function envclass:set_external_env_var(key, value) + local t = self.external_vars + if not t then + t = {} + self.external_vars = t + end + t[key] = value +end + +function envclass:add_setup_function(fn) + local t = self.setup_funcs + if not t then + t = {} + self.setup_funcs = t + end + t[#t + 1] = fn +end + +function envclass:run_setup_functions() + for _, func in ipairs(global_setup) do + func(self) + end + t = self.setup_funcs + local chain = self + while chain do + for _, func in util.nil_ipairs(chain.setup_funcs) do + func(self) + end + chain = chain.parent + end +end + +function add_global_setup(fn) + global_setup[#global_setup + 1] = fn +end + +function is_environment(datum) + return getmetatable(datum) == envclass +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/host/freebsd.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/host/freebsd.lua new file mode 100644 index 0000000..87cade2 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/host/freebsd.lua @@ -0,0 +1,11 @@ +module(..., package.seeall) + +function apply_host(env) + env:set_many { + ["DOTNETRUN"] = "mono ", + ["HOSTPROGSUFFIX"] = "", + ["HOSTSHLIBSUFFIX"] = ".so", + ["_COPY_FILE"] = "cp -f $(<) $(@)", + ["_HARDLINK_FILE"] = "ln -f $(<) $(@)", + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/host/linux.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/host/linux.lua new file mode 100644 index 0000000..87cade2 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/host/linux.lua @@ -0,0 +1,11 @@ +module(..., package.seeall) + +function apply_host(env) + env:set_many { + ["DOTNETRUN"] = "mono ", + ["HOSTPROGSUFFIX"] = "", + ["HOSTSHLIBSUFFIX"] = ".so", + ["_COPY_FILE"] = "cp -f $(<) $(@)", + ["_HARDLINK_FILE"] = "ln -f $(<) $(@)", + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/host/macosx.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/host/macosx.lua new file mode 100644 index 0000000..81d2c59 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/host/macosx.lua @@ -0,0 +1,11 @@ +module(..., package.seeall) + +function apply_host(env) + env:set_many { + ["DOTNETRUN"] = "mono ", + ["HOSTPROGSUFFIX"] = "", + ["HOSTSHLIBSUFFIX"] = ".dylib", + ["_COPY_FILE"] = "cp -f $(<) $(@)", + ["_HARDLINK_FILE"] = "ln -f $(<) $(@)", + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/host/openbsd.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/host/openbsd.lua new file mode 100644 index 0000000..87cade2 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/host/openbsd.lua @@ -0,0 +1,11 @@ +module(..., package.seeall) + +function apply_host(env) + env:set_many { + ["DOTNETRUN"] = "mono ", + ["HOSTPROGSUFFIX"] = "", + ["HOSTSHLIBSUFFIX"] = ".so", + ["_COPY_FILE"] = "cp -f $(<) $(@)", + ["_HARDLINK_FILE"] = "ln -f $(<) $(@)", + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/host/windows.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/host/windows.lua new file mode 100644 index 0000000..dd5d2de --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/host/windows.lua @@ -0,0 +1,11 @@ +module(..., package.seeall) + +function apply_host(env) + env:set_many { + ["DOTNETRUN"] = "", + ["HOSTPROGSUFFIX"] = ".exe", + ["HOSTSHLIBSUFFIX"] = ".dll", + ["_COPY_FILE"] = "copy $(<) $(@)", + ["_HARDLINK_FILE"] = "copy /f $(<) $(@)", + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc-common.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc-common.lua new file mode 100644 index 0000000..4f78bfe --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc-common.lua @@ -0,0 +1,864 @@ +module(..., package.seeall) + +local native = require "tundra.native" +local nodegen = require "tundra.nodegen" +local path = require "tundra.path" +local util = require "tundra.util" + +LF = '\r\n' +local UTF_HEADER = '\239\187\191' -- byte mark EF BB BF + +local VERSION_NUMBER = "12.00" +local VERSION_YEAR = "2012" +local HOOKS = {} + +local msvc_generator = {} +msvc_generator.__index = msvc_generator + +local project_types = util.make_lookup_table { + "Program", "SharedLibrary", "StaticLibrary", "CSharpExe", "CSharpLib", "ObjGroup", +} + +local toplevel_stuff = util.make_lookup_table { + ".exe", ".lib", ".dll", +} + +local binary_extension = util.make_lookup_table { + ".exe", ".lib", ".dll", ".pdb", ".res", ".obj", ".o", ".a", +} + +local header_exts = util.make_lookup_table { + ".h", ".hpp", ".hh", ".inl", +} + +-- Scan for sources, following dependencies until those dependencies seem to be +-- a different top-level unit +local function get_sources(dag, sources, generated, level, dag_lut) + for _, output in util.nil_ipairs(dag.outputs) do + local ext = path.get_extension(output) + if not binary_extension[ext] then + generated[output] = true + sources[output] = true -- pick up generated headers + end + end + + for _, input in util.nil_ipairs(dag.inputs) do + local ext = path.get_extension(input) + if not binary_extension[ext] then + sources[input] = true + end + end + + for _, dep in util.nil_ipairs(dag.deps) do + if not dag_lut[dep] then -- don't go into other top-level DAGs + get_sources(dep, sources, generated, level + 1, dag_lut) + end + end +end + +function get_guid_string(data) + local sha1 = native.digest_guid(data) + local guid = sha1:sub(1, 8) .. '-' .. sha1:sub(9,12) .. '-' .. sha1:sub(13,16) .. '-' .. sha1:sub(17,20) .. '-' .. sha1:sub(21, 32) + assert(#guid == 36) + return guid:upper() +end + +local function get_headers(unit, source_lut, dag_lut, name_to_dags) + local src_dir = '' + + if not unit.Decl then + -- Ignore ExternalLibrary and similar that have no data. + return + end + + if unit.Decl.SourceDir then + src_dir = unit.Decl.SourceDir .. '/' + end + for _, src in util.nil_ipairs(nodegen.flatten_list('*-*-*-*', unit.Decl.Sources)) do + if type(src) == "string" then + local ext = path.get_extension(src) + if header_exts[ext] then + local full_path = path.normalize(src_dir .. src) + source_lut[full_path] = true + end + end + end + + local function toplevel(u) + if type(u) == "string" then + return type(name_to_dags[u]) ~= "nil" + end + + for _, dag in pairs(u.Decl.__DagNodes) do + if dag_lut[dag] then + return true + end + end + return false + end + + -- Repeat for dependencies ObjGroups + for _, dep in util.nil_ipairs(nodegen.flatten_list('*-*-*-*', unit.Decl.Depends)) do + + if not toplevel(dep) then + get_headers(dep, source_lut, dag_lut) + end + end +end + +local function make_meta_project(base_dir, data) + data.Guid = get_guid_string(data.Name) + data.IdeGenerationHints = { Msvc = { SolutionFolder = "Build System Meta" } } + data.IsMeta = true + data.RelativeFilename = data.Name .. ".vcxproj" + data.Filename = base_dir .. data.RelativeFilename + data.Type = "meta" + if not data.Sources then + data.Sources = {} + end + return data +end + +local function tundra_cmdline(args) + local root_dir = native.getcwd() + return "\"" .. TundraExePath .. "\" -C \"" .. root_dir .. "\" " .. args +end + +local function project_regen_commandline(ide_script) + return tundra_cmdline("-g " .. ide_script) +end + +local function make_project_data(units_raw, env, proj_extension, hints, ide_script) + + -- Filter out stuff we don't care about. + local units = util.filter(units_raw, function (u) + return u.Decl.Name and project_types[u.Keyword] + end) + + local base_dir = hints.MsvcSolutionDir and (hints.MsvcSolutionDir .. '\\') or env:interpolate('$(OBJECTROOT)$(SEP)') + native.mkdir(base_dir) + + local project_by_name = {} + local all_sources = {} + local dag_node_lut = {} -- lookup table of all named, top-level DAG nodes + local name_to_dags = {} -- table mapping unit name to array of dag nodes (for configs) + + -- Map out all top-level DAG nodes + for _, unit in ipairs(units) do + local decl = unit.Decl + + local dag_nodes = assert(decl.__DagNodes, "no dag nodes for " .. decl.Name) + for build_id, dag_node in pairs(dag_nodes) do + dag_node_lut[dag_node] = unit + local array = name_to_dags[decl.Name] + if not array then + array = {} + name_to_dags[decl.Name] = array + end + array[#array + 1] = dag_node + end + end + + local function get_output_project(name) + if not project_by_name[name] then + local relative_fn = name .. proj_extension + project_by_name[name] = { + Name = name, + Sources = {}, + RelativeFilename = relative_fn, + Filename = base_dir .. relative_fn, + Guid = get_guid_string(name), + BuildByDefault = hints.BuildAllByDefault, + } + end + return project_by_name[name] + end + + -- Sort units based on dependency complexity. We want to visit the leaf nodes + -- first so that any source file references are picked up as close to the + -- bottom of the dependency chain as possible. + local unit_weights = {} + for _, unit in ipairs(units) do + local decl = unit.Decl + local stack = { } + for _, dag in pairs(decl.__DagNodes) do + stack[#stack + 1] = dag + end + local weight = 0 + while #stack > 0 do + local node = table.remove(stack) + if dag_node_lut[node] then + weight = weight + 1 + end + for _, dep in util.nil_ipairs(node.deps) do + stack[#stack + 1] = dep + end + end + unit_weights[unit] = weight + end + + table.sort(units, function (a, b) + return unit_weights[a] < unit_weights[b] + end) + + -- Keep track of what source files have already been grabbed by other projects. + local grabbed_sources = {} + + for _, unit in ipairs(units) do + local decl = unit.Decl + local name = decl.Name + + local source_lut = {} + local generated_lut = {} + for build_id, dag_node in pairs(decl.__DagNodes) do + get_sources(dag_node, source_lut, generated_lut, 0, dag_node_lut) + end + + -- Explicitly add all header files too as they are not picked up from the DAG + -- Also pick up headers from non-toplevel DAGs we're depending on + get_headers(unit, source_lut, dag_node_lut, name_to_dags) + + -- Figure out which project should get this data. + local output_name = name + local ide_hints = unit.Decl.IdeGenerationHints + if ide_hints then + if ide_hints.OutputProject then + output_name = ide_hints.OutputProject + end + end + + local proj = get_output_project(output_name) + + if output_name == name then + -- This unit is the real thing for this project, not something that's + -- just being merged into it (like an ObjGroup). Set some more attributes. + proj.IdeGenerationHints = ide_hints + proj.DagNodes = decl.__DagNodes + proj.Unit = unit + end + + for src, _ in pairs(source_lut) do + local norm_src = path.normalize(src) + if not grabbed_sources[norm_src] then + grabbed_sources[norm_src] = unit + local is_generated = generated_lut[src] + proj.Sources[#proj.Sources+1] = { + Path = norm_src, + Generated = is_generated, + } + end + end + end + + -- Get all accessed Lua files + local accessed_lua_files = util.table_keys(get_accessed_files()) + + -- Filter out the ones that belong to this build (exclude ones coming from Tundra) + local function is_non_tundra_lua_file(p) + return not path.is_absolute(p) + end + local function make_src_node(p) + return { Path = path.normalize(p) } + end + local source_list = util.map(util.filter(accessed_lua_files, is_non_tundra_lua_file), make_src_node) + + local solution_hints = hints.MsvcSolutions + if not solution_hints then + print("No IdeGenerationHints.MsvcSolutions specified - using defaults") + solution_hints = { + ['tundra-generated.sln'] = {} + } + end + + local projects = util.table_values(project_by_name) + local vanilla_projects = util.clone_array(projects) + + local solutions = {} + + -- Create meta project to regenerate solutions/projects. Added to every solution. + local regen_meta_proj = make_meta_project(base_dir, { + Name = "00-Regenerate-Projects", + FriendlyName = "Regenerate Solutions and Projects", + BuildCommand = project_regen_commandline(ide_script), + }) + + projects[#projects + 1] = regen_meta_proj + + for name, data in pairs(solution_hints) do + local sln_projects + local ext_projects = {} + if data.Projects then + sln_projects = {} + for _, pname in ipairs(data.Projects) do + local pp = project_by_name[pname] + if not pp then + errorf("can't find project %s for inclusion in %s -- check your MsvcSolutions data", pname, name) + end + sln_projects[#sln_projects + 1] = pp + end + else + -- All the projects (that are not meta) + sln_projects = util.clone_array(vanilla_projects) + end + + for _, ext in util.nil_ipairs(data.ExternalProjects) do + ext_projects[#ext_projects + 1] = ext + end + + local meta_proj = make_meta_project(base_dir, { + Name = "00-tundra-" .. path.drop_suffix(name), + FriendlyName = "Build This Solution", + BuildByDefault = true, + Sources = source_list, + BuildProjects = util.clone_array(sln_projects), + }) + + sln_projects[#sln_projects + 1] = regen_meta_proj + sln_projects[#sln_projects + 1] = meta_proj + projects[#projects + 1] = meta_proj + + solutions[#solutions + 1] = { + Filename = base_dir .. name, + Projects = sln_projects, + ExternalProjects = ext_projects, + BuildSolutionProject = meta_proj, + } + end + + return solutions, projects +end + +local cl_tags = { + ['.h'] = 'ClInclude', + ['.hh'] = 'ClInclude', + ['.hpp'] = 'ClInclude', + ['.inl'] = 'ClInclude', +} + +local function slurp_file(fn) + local fh, err = io.open(fn, 'rb') + if fh then + local data = fh:read("*all") + fh:close() + return data + end + return '' +end + +local function replace_if_changed(new_fn, old_fn) + local old_data = slurp_file(old_fn) + local new_data = slurp_file(new_fn) + if old_data == new_data then + os.remove(new_fn) + return + end + printf("Updating %s", old_fn) + os.remove(old_fn) + os.rename(new_fn, old_fn) +end + +function msvc_generator:generate_solution(fn, projects, ext_projects, solution) + local sln = io.open(fn .. '.tmp', 'wb') + sln:write(UTF_HEADER, LF, "Microsoft Visual Studio Solution File, Format Version ", VERSION_NUMBER, LF, "# Visual Studio ", VERSION_YEAR, LF) + + -- Map folder names to array of projects under that folder + local sln_folders = {} + for _, proj in ipairs(projects) do + local hints = proj.IdeGenerationHints + local msvc_hints = hints and hints.Msvc or nil + local folder = msvc_hints and msvc_hints.SolutionFolder or nil + if folder then + local projects = sln_folders[folder] or {} + projects[#projects + 1] = proj + sln_folders[folder] = projects + end + end + + for _, proj in ipairs(projects) do + local name = proj.Name + local fname = proj.RelativeFilename + local guid = proj.Guid + sln:write(string.format('Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "%s", "%s", "{%s}"', name, fname, guid), LF) + sln:write('EndProject', LF) + end + + -- Dump external projects. Make them depend on everything in this solution being built by Tundra. + for _, data in util.nil_ipairs(ext_projects) do + local guid = data.Guid + local fname = path.normalize(path.join(native.getcwd(), data.Filename)) + local name = path.get_filename_base(fname) + sln:write(string.format('Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "%s", "%s", "{%s}"', name, fname, guid), LF) + local build_sln_proj = solution.BuildSolutionProject + if build_sln_proj then + local meta_guid = build_sln_proj.Guid + sln:write('\tProjectSection(ProjectDependencies) = postProject', LF) + sln:write('\t\t{', meta_guid,'} = {', meta_guid,'}', LF) + sln:write('\tEndProjectSection', LF) + end + sln:write('EndProject', LF) + end + + for folder_name, _ in pairs(sln_folders) do + local folder_guid = get_guid_string("folder/" .. folder_name) + sln:write(string.format('Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "%s", "%s", "{%s}"', folder_name, folder_name, folder_guid), LF) + sln:write('EndProject', LF) + end + + sln:write("Global", LF) + sln:write("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution", LF) + for _, tuple in ipairs(self.config_tuples) do + sln:write(string.format('\t\t%s = %s', tuple.MsvcName, tuple.MsvcName), LF) + end + sln:write("\tEndGlobalSection", LF) + + sln:write("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution", LF) + for _, proj in ipairs(projects) do + for _, tuple in ipairs(self.config_tuples) do + local leader = string.format('\t\t{%s}.%s.', proj.Guid, tuple.MsvcName) + sln:write(leader, "ActiveCfg = ", tuple.MsvcName, LF) + if proj.BuildByDefault then + sln:write(leader, "Build.0 = ", tuple.MsvcName, LF) + end + end + end + + -- External projects build by default, and after Tundra is done (depends on "Build this solution"). + for _, proj in util.nil_ipairs(ext_projects) do + for _, tuple in ipairs(self.config_tuples) do + local leader = string.format('\t\t{%s}.%s.', proj.Guid, tuple.MsvcName) + sln:write(leader, "ActiveCfg = ", tuple.MsvcName, LF) + if not proj.Platform or proj.Platform == tuple.MsvcPlatform then + sln:write(leader, "Build.0 = ", tuple.MsvcName, LF) + end + end + end + sln:write("\tEndGlobalSection", LF) + + sln:write("\tGlobalSection(SolutionProperties) = preSolution", LF) + sln:write("\t\tHideSolutionNode = FALSE", LF) + sln:write("\tEndGlobalSection", LF) + + sln:write("\tGlobalSection(NestedProjects) = preSolution", LF) + for folder_name, projects in pairs(sln_folders) do + local folder_guid = get_guid_string("folder/" .. folder_name) + for _, project in ipairs(projects) do + sln:write(string.format('\t\t{%s} = {%s}', project.Guid, folder_guid), LF) + end + end + sln:write("\tEndGlobalSection", LF) + + sln:write("EndGlobal", LF) + sln:close() + + replace_if_changed(fn .. ".tmp", fn) +end + +local function find_dag_node_for_config(project, tuple) + local build_id = string.format("%s-%s-%s", tuple.Config.Name, tuple.Variant.Name, tuple.SubVariant) + local nodes = project.DagNodes + if not nodes then + return nil + end + + if nodes[build_id] then + return nodes[build_id] + end + errorf("couldn't find config %s for project %s (%d dag nodes) - available: %s", + build_id, project.Name, #nodes, table.concat(util.table_keys(nodes), ", ")) +end + +function msvc_generator:generate_project(project, all_projects) + local fn = project.Filename + local p = assert(io.open(fn .. ".tmp", 'wb')) + p:write('', LF) + p:write('', LF) + + -- List all project configurations + p:write('\t', LF) + for _, tuple in ipairs(self.config_tuples) do + p:write('\t\t', LF) + p:write('\t\t\t', tuple.MsvcConfiguration, '', LF) + p:write('\t\t\t', tuple.MsvcPlatform, '', LF) + p:write('\t\t', LF) + end + p:write('\t', LF) + + p:write('\t', LF) + p:write('\t\t{', project.Guid, '}', LF) + p:write('\t\tMakeFileProj', LF) + if project.FriendlyName then + p:write('\t\t', project.FriendlyName, '', LF) + end + + if HOOKS.global_properties then + HOOKS.global_properties(p, project) + end + + p:write('\t', LF) + p:write('\t', LF) + if VERSION_YEAR == '2012' then + p:write('\t\t<_ProjectFileVersion>10.0.30319.1', LF) + end + p:write('\t', LF) + + p:write('\t', LF) + + -- Mark all project configurations as makefile-type projects + for _, tuple in ipairs(self.config_tuples) do + p:write('\t', LF) + p:write('\t\tMakefile', LF) + p:write('\t\ttrue', LF) -- I have no idea what this setting affects + if VERSION_YEAR == '2012' then + p:write('\t\tv110', LF) -- I have no idea what this setting affects + elseif VERSION_YEAR == '2013' then + p:write('\t\tv120', LF) -- I have no idea what this setting affects + end + p:write('\t', LF) + end + + p:write('\t', LF) + + for _, tuple in ipairs(self.config_tuples) do + p:write('\t', LF) + + local dag_node = find_dag_node_for_config(project, tuple) + local include_paths, defines + if dag_node then + local env = dag_node.src_env + local paths = util.map(env:get_list("CPPPATH"), function (p) + local ip = path.normalize(env:interpolate(p)) + if not path.is_absolute(ip) then + ip = native.getcwd() .. '\\' .. ip + end + return ip + end) + include_paths = table.concat(paths, ';') + local ext_paths = env:get_external_env_var('INCLUDE') + if ext_paths then + include_paths = include_paths .. ';' .. ext_paths + end + defines = env:interpolate("$(CPPDEFS:j;)") + else + include_paths = '' + defines = '' + end + + local root_dir = native.getcwd() + local build_id = string.format("%s-%s-%s", tuple.Config.Name, tuple.Variant.Name, tuple.SubVariant) + local base = "\"" .. TundraExePath .. "\" -C \"" .. root_dir .. "\" " + local build_cmd = base .. build_id + local clean_cmd = base .. "--clean " .. build_id + local rebuild_cmd = base .. "--rebuild " .. build_id + + if project.BuildCommand then + build_cmd = project.BuildCommand + clean_cmd = "" + rebuild_cmd = "" + elseif not project.IsMeta then + build_cmd = build_cmd .. " " .. project.Name + clean_cmd = clean_cmd .. " " .. project.Name + rebuild_cmd = rebuild_cmd .. " " .. project.Name + else + local all_projs_str = table.concat( + util.map(assert(project.BuildProjects), function (p) return p.Name end), ' ') + build_cmd = build_cmd .. " " .. all_projs_str + clean_cmd = clean_cmd .. " " .. all_projs_str + rebuild_cmd = rebuild_cmd .. " " .. all_projs_str + end + + p:write('\t\t', build_cmd, '', LF) + p:write('\t\t', LF) + p:write('\t\t', clean_cmd, '', LF) + p:write('\t\t', rebuild_cmd, '', LF) + p:write('\t\t', defines, ';$(NMakePreprocessorDefinitions)', LF) + p:write('\t\t', include_paths, ';$(NMakeIncludeSearchPath)', LF) + p:write('\t\t$(NMakeForcedIncludes)', LF) + p:write('\t', LF) + end + + if HOOKS.pre_sources then + HOOKS.pre_sources(p, project) + end + + -- Emit list of source files + p:write('\t', LF) + for _, record in ipairs(project.Sources) do + local path_str = assert(record.Path) + if not path.is_absolute(path_str) then + path_str = native.getcwd() .. '\\' .. path_str + end + local ext = path.get_extension(path_str) + local cl_tag = cl_tags[ext] or 'ClCompile' + p:write('\t\t<', cl_tag,' Include="', path_str, '" />', LF) + end + p:write('\t', LF) + + local post_src_hook = HOOKS.post_sources + if post_src_hook then + post_src_hook(p, project) + end + + p:write('\t', LF) + + if VERSION_YEAR == "2012" then + -- Import helper msbuild stuff to make build aborting work propertly in VS2012 + local xml = path.normalize(TundraScriptDir .. '/tundra/ide/msvc-rules.xml') + p:write('\t', LF) + end + + p:write('', LF) + p:close() + + replace_if_changed(fn .. ".tmp", fn) +end + +local function get_common_dir(sources) + local dir_tokens = {} + for _, src in ipairs(sources) do + local path = assert(src.Path) + if not tundra.path.is_absolute(path) then + local subdirs = {} + for subdir in path:gmatch("([^\\\]+)\\") do + subdirs[#subdirs + 1] = subdir + end + + if #dir_tokens == 0 then + dir_tokens = subdirs + else + for i = 1, #dir_tokens do + if dir_tokens[i] ~= subdirs[i] then + while #dir_tokens >= i do + table.remove(dir_tokens) + end + break + end + end + end + end + end + + local result = table.concat(dir_tokens, '\\') + if #result > 0 then + result = result .. '\\' + end + return result +end + +function msvc_generator:generate_project_filters(project) + local fn = project.Filename .. ".filters" + local p = assert(io.open(fn .. ".tmp", 'wb')) + p:write('', LF) + p:write('', LF) + + local common_dir = get_common_dir(util.filter(project.Sources, function (s) return not s.Generated end)) + local common_dir_gen = get_common_dir(util.filter(project.Sources, function (s) return s.Generated end)) + + local filters = {} + local sources = {} + + -- Mangle source filenames, and find which filters need to be created + for _, record in ipairs(project.Sources) do + local fn = record.Path + local common_start = record.Generated and common_dir_gen or common_dir + if fn:find(common_start, 1, true) then + fn = fn:sub(#common_start+1) + end + + local dir, filename = path.split(fn) + + if dir == '.' then + dir = nil + end + + local abs_path = record.Path + if not path.is_absolute(abs_path) then + abs_path = native.getcwd() .. '\\' .. abs_path + end + + if record.Generated then + dir = 'Generated Files' + end + + sources[#sources + 1] = { + FullPath = abs_path, + Directory = dir, + } + + -- Register filter and all its parents + while dir and dir ~= '.' do + filters[dir] = true + dir, _ = path.split(dir) + end + end + + -- Emit list of filters + p:write('\t', LF) + for filter_name, _ in pairs(filters) do + if filter_name ~= "" then + filter_guid = get_guid_string(filter_name) + p:write('\t\t', LF) + p:write('\t\t\t{', filter_guid, '}', LF) + p:write('\t\t', LF) + end + end + p:write('\t', LF) + + -- Emit list of source files + p:write('\t', LF) + for _, source in ipairs(sources) do + local ext = path.get_extension(source.FullPath) + local cl_tag = cl_tags[ext] or 'ClCompile' + if not source.Directory then + p:write('\t\t<', cl_tag, ' Include="', source.FullPath, '" />', LF) + else + p:write('\t\t<', cl_tag, ' Include="', source.FullPath, '">', LF) + p:write('\t\t\t', source.Directory, '', LF) + p:write('\t\t', LF) + end + end + p:write('\t', LF) + + p:write('', LF) + + p:close() + + replace_if_changed(fn .. ".tmp", fn) +end + +function msvc_generator:generate_project_user(project) + local fn = project.Filename .. ".user" + -- Don't overwrite user settings + do + local p, err = io.open(fn, 'rb') + if p then + p:close() + return + end + end + + local p = assert(io.open(fn, 'wb')) + p:write('', LF) + p:write('', LF) + + for _, tuple in ipairs(self.config_tuples) do + local dag_node = find_dag_node_for_config(project, tuple) + if dag_node then + local exe = nil + for _, output in util.nil_ipairs(dag_node.outputs) do + if output:match("%.exe") then + exe = output + break + end + end + if exe then + p:write('\t', LF) + p:write('\t\t', native.getcwd() .. '\\' .. exe, '', LF) + p:write('\t\tWindowsLocalDebugger', LF) + p:write('\t\t', native.getcwd(), '', LF) + p:write('\t', LF) + end + end + end + + p:write('', LF) + + p:close() +end + +function msvc_generator:generate_files(ngen, config_tuples, raw_nodes, env, default_names, hints, ide_script) + assert(config_tuples and #config_tuples > 0) + + if not hints then + hints = {} + end + + local complained_mappings = {} + + self.msvc_platforms = {} + local msvc_hints = hints.Msvc or {} + local variant_mappings = msvc_hints.VariantMappings or {} + local platform_mappings = msvc_hints.PlatformMappings or {} + local full_mappings = msvc_hints.FullMappings or {} + + for _, tuple in ipairs(config_tuples) do + local build_id = string.format("%s-%s-%s", tuple.Config.Name, tuple.Variant.Name, tuple.SubVariant) + if full_mappings[build_id] then + local m = full_mappings[build_id] + tuple.MsvcConfiguration = assert(m.Config) + tuple.MsvcPlatform = assert(m.Platform) + elseif variant_mappings[tuple.Variant.Name] then + tuple.MsvcConfiguration = variant_mappings[tuple.Variant.Name] + elseif variant_mappings[tuple.Variant.Name .. "-" .. tuple.SubVariant] then + tuple.MsvcConfiguration = variant_mappings[tuple.Variant.Name .. "-" .. tuple.SubVariant] + else + tuple.MsvcConfiguration = tuple.Variant.Name + end + + -- Use IdeGenerationHints.Msvc.PlatformMappings table to map tundra + -- configurations to MSVC platform names. Note that this isn't a huge deal + -- for building stuff as Tundra doesn't care about this setting. But it + -- might influence the choice of debugger and affect include paths for + -- things like Intellisense that certain users may care about. + if not tuple.MsvcPlatform then + tuple.MsvcPlatform = platform_mappings[tuple.Config.Name] + end + + -- If we didn't find anything, warn and then default to Win32, which VS + -- will always accept (or so one would assume) + if not tuple.MsvcPlatform then + tuple.MsvcPlatform = "Win32" + if not complained_mappings[tuple.Config.Name] then + printf("warning: No VS platform mapping for %s, mapping to Win32", tuple.Config.Name) + print("(Add one to IdeGenerationHints.Msvc.PlatformMappings to override)") + complained_mappings[tuple.Config.Name] = true + end + end + tuple.MsvcName = tuple.MsvcConfiguration .. "|" .. tuple.MsvcPlatform + self.msvc_platforms[tuple.MsvcPlatform] = true + end + + self.config_tuples = config_tuples + + printf("Generating Visual Studio projects for %d configurations/variants", #config_tuples) + + -- Figure out where we're going to store the projects + local solutions, projects = make_project_data(raw_nodes, env, ".vcxproj", hints, ide_script) + + local proj_lut = {} + for _, p in ipairs(projects) do + proj_lut[p.Name] = p + end + + for _, sln in pairs(solutions) do + self:generate_solution(sln.Filename, sln.Projects, sln.ExternalProjects, sln) + end + + for _, proj in ipairs(projects) do + self:generate_project(proj, projects) + self:generate_project_filters(proj) + self:generate_project_user(proj) + end +end + +function setup(version_short, version_year, hooks) + VERSION_NUMBER = version_short + VERSION_YEAR = version_year + if hooks then + HOOKS = hooks + end + nodegen.set_ide_backend(function(...) + local state = setmetatable({}, msvc_generator) + state:generate_files(...) + end) +end + diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc-rules.xml b/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc-rules.xml new file mode 100644 index 0000000..b62155d --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc-rules.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + { + if (line.Data != null) + Log.LogMessageFromText(line.Data, MessageImportance.High); + }; + p.ErrorDataReceived += (object sender, DataReceivedEventArgs line) => { + if (line.Data != null) + Log.LogMessageFromText(line.Data, MessageImportance.High); + }; + p.Start(); + p.BeginOutputReadLine(); + p.BeginErrorReadLine(); + + while (!p.WaitForExit(100)) + { + if (m_Cancel) + { + // Keep sending CTRL+C events - sometimes it takes more than one.. + GenerateConsoleCtrlEvent(ConsoleCtrlEvent.CTRL_C, 0); + } + } + + p.WaitForExit(); + return m_Cancel ? false : p.ExitCode == 0; + } + } + catch(Exception e) + { + Console.WriteLine(e); + return false; + } + } + } + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GetNativeTargetPath;%(Targets) + + + + + + + + + + + obj + lib + dll + xdc + + + + + + + $(TargetPath) + + + + + + + + + + + + + + Project + + + + + PropertySheet + + + + diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc100.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc100.lua new file mode 100644 index 0000000..f2381b5 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc100.lua @@ -0,0 +1,7 @@ +-- Microsoft Visual Studio 2010 Solution/Project file generation + +module(..., package.seeall) + +local msvc_common = require "tundra.ide.msvc-common" +msvc_common.setup("11.00", "2010") + diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc110.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc110.lua new file mode 100644 index 0000000..1410de9 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc110.lua @@ -0,0 +1,7 @@ +-- Microsoft Visual Studio 2012 Solution/Project file generation + +module(..., package.seeall) + +local msvc_common = require "tundra.ide.msvc-common" + +msvc_common.setup("12.00", "2012") diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc120.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc120.lua new file mode 100644 index 0000000..14f55f2 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/msvc120.lua @@ -0,0 +1,7 @@ +-- Microsoft Visual Studio 2013 Solution/Project file generation + +module(..., package.seeall) + +local msvc_common = require "tundra.ide.msvc-common" + +msvc_common.setup("12.00", "2013") diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/xcode3.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/xcode3.lua new file mode 100644 index 0000000..643fe72 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/xcode3.lua @@ -0,0 +1,735 @@ +-- Xcode 3 (works in 4 as well) Workspace/Project file generation + +module(..., package.seeall) + +local path = require "tundra.path" +local nodegen = require "tundra.nodegen" +local util = require "tundra.util" +local native = require "tundra.native" + +local xcode_generator = {} +local xcode_generator = {} +xcode_generator.__index = xcode_generator + +function xcode_generator:generate_workspace(fn, projects) + local sln = io.open(fn, 'wb') + + sln:write('\n') + sln:write('\n') + + for _, proj in ipairs(projects) do + local name = proj.Decl.Name + local fname = proj.RelativeFilename + if fname == '.' then fname = '' + else fname = fname ..'/' + end + sln:write('\t\n') + sln:write('\t\n') + end + + sln:write('\n') +end + +local project_types = util.make_lookup_table { + "Program", "SharedLibrary", "StaticLibrary", +} + +local function get_absolute_output_path(env) + local base_dir = env:interpolate('$(OBJECTROOT)$(SEP)') + local cwd = native.getcwd() + return cwd .. "/" .. base_dir +end + +local function newid(data) + local string = native.digest_guid(data) + -- a bit ugly but is to match the xcode style of UIds + return string.sub(string.gsub(string, '-', ''), 1, 24) +end + +local function getfiletype(name) + local types = { + [".c"] = "sourcecode.c.c", + [".cc"] = "sourcecode.cpp.cpp", + [".cpp"] = "sourcecode.cpp.cpp", + [".css"] = "text.css", + [".cxx"] = "sourcecode.cpp.cpp", + [".framework"] = "wrapper.framework", + [".gif"] = "image.gif", + [".h"] = "sourcecode.c.h", + [".html"] = "text.html", + [".lua"] = "sourcecode.lua", + [".m"] = "sourcecode.c.objc", + [".mm"] = "sourcecode.cpp.objc", + [".nib"] = "wrapper.nib", + [".pch"] = "sourcecode.c.h", + [".plist"] = "text.plist.xml", + [".strings"] = "text.plist.strings", + [".xib"] = "file.xib", + [".icns"] = "image.icns", + [""] = "compiled.mach-o.executable", + } + return types[path.get_extension(name)] or "text" +end + + +local function get_project_data(unit, env) + local decl = unit.Decl + + if decl.Name and project_types[unit.Keyword] then + + local relative_fn = decl.Name + local sources = util.flatten(decl.Sources) or {} + sources = util.filter(sources, function (x) return type(x) == "string" end) + + if decl.SourceDir then + sources = util.map(sources, function (x) return decl.SourceDir .. x end) + end + + local source_list = {} + + -- Rebuild source list with ids that is needed by the xcode project layout + for _, fn in ipairs(sources) do + source_list[newid(fn)] = fn + end + + return { + Type = unit.Keyword, + Decl = decl, + Sources = source_list, + RelativeFilename = relative_fn, + Guid = newid(decl.Name .. "ProjectId"), + } + + elseif unit.Keyword == "OsxBundle" then + + decl.Name = "OsxBundle" + + local source_list = {} + + source_list[newid(decl.InfoPList)] = decl.InfoPList + + for _, resource in ipairs(decl.Resources) do + if resource.Decl then + source_list[newid(resource.Decl.Source)] = resource.Decl.Source + end + end + + return { + Type = unit.Keyword, + Decl = decl, + Sources = source_list, + RelativeFilename = "$(OBJECTDIR)/MyApp.app", + Guid = newid("OsxBundle"), + } + else + return nil + end +end + +local function sort_filelist(source_list) + local dest = {} + for k, v in pairs(source_list) do table.insert(dest, { Key = k, Value = v }) end + table.sort(dest, function(a, b) return a.Value < b.Value end) + return dest +end + +local function write_file_refs(p, projects) + p:write('/* Begin FBXFileReference section */\n') + local cwd = native.getcwd(); + + -- build the source list + + local full_source_list = {} + + for _, project in pairs(projects) do + local sources = project.Sources + for key, fn in pairs(sources) do + full_source_list[key] = fn + end + + -- include executable names in the source list as well + + if project.Type == "Program" then + full_source_list[newid(project.Decl.Name .. "Program")] = project.Decl.Name + end + end + + local source_list = {} + + -- As we can't sort hashtables we need to move this over to a regular table + + source_list = sort_filelist(full_source_list) + + for _, entry in pairs(source_list) do + local key = entry.Key + local fn = entry.Value + local name = path.get_filename(fn) + local file_type = getfiletype(fn) + local str = "" + if file_type == "compiled.mach-o.executable" then + str = string.format('\t\t%s /* %s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = %s; name = "%s"; includeInIndex = 0; path = "%s"; sourceTree = BUILT_PRODUCTS_DIR; };', + key, fn, file_type, name, fn) + else + str = string.format('\t\t%s /* %s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = %s; name = "%s"; path = "%s"; sourceTree = ""; };', + key, fn, file_type, name, path.join(cwd, fn)) + end + p:write(str, '\n') + end + + p:write('/* End FBXFileReference section */\n\n') +end + +local function write_legacy_targets(p, projects, env) + p:write('/* Begin PBXLegacyTarget section */\n') + + local script_path = get_absolute_output_path(env) + + for _, project in pairs(projects) do + local decl = project.Decl + + if project.IsMeta then + --[[ + isa = PBXLegacyTarget; + buildArgumentsString = ""; + buildConfigurationList = D7D12762170E4CF98A79B5EF /* Build configuration list for PBXLegacyTarget "!UpdateWorkspace" */; + buildPhases = ( + ); + buildToolPath = /Users/danielcollin/unity_ps3/ps3/Projects/JamGenerated/_workspace.xcode_/updateworkspace; + dependencies = ( + ); + name = "!UpdateWorkspace"; + passBuildSettingsInEnvironment = 1; + productName = "!UpdateWorkspace"; + --]] + + p:write('\t\t', newid(decl.Name .. "Target"), ' /* ', decl.Name, ' */ = {\n') + p:write('\t\t\tisa = PBXLegacyTarget;\n') + p:write('\t\t\tbuildArgumentsString = "', project.MetaData.BuildArgs, '";\n') + p:write('\t\t\tbuildConfigurationList = ', newid(decl.Name .. 'Config'), ' /* Build configuration list for PBXLegacyTarget "',decl.Name, '" */;\n') + p:write('\t\t\tbuildPhases = (\n') + p:write('\t\t\t);\n'); + p:write('\t\t\tbuildToolPath = ', script_path .. project.MetaData.BuildTool, ';\n') + p:write('\t\t\tdependencies = (\n\t\t\t);\n') + p:write('\t\t\tname = "', decl.Name, '";\n') + p:write('\t\t\tpassBuildSettingsInEnvironment = 1;\n') + p:write('\t\t\tproductName = "', decl.Name or "", '";\n') + p:write('\t\t};\n') + end + end + + p:write('/* End PBXLegacyTarget section */\n') +end + +local function write_native_targes(p, projects) + p:write('/* Begin PBXNativeTarget section */\n') + + local categories = { + ["Program"] = "com.apple.product-type.tool", + ["StaticLibrary"] = "com.apple.product-type.library.static", + ["SharedLibrary"] = "com.apple.product-type.library.dynamic", + } + + for _, project in pairs(projects) do + local decl = project.Decl + + if not project.IsMeta then + p:write('\t\t', newid(decl.Name .. "Target"), ' /* ', decl.Name, ' */ = {\n') + p:write('\t\t\tisa = PBXNativeTarget;\n') + p:write('\t\t\tbuildConfigurationList = ', newid(decl.Name .. 'Config'), ' /* Build configuration list for PBXNativeTarget "',decl.Name, '" */;\n') + p:write('\t\t\tbuildPhases = (\n') + p:write('\t\t\t\t', newid(decl.Name .. "ShellScript"), ' /* ShellScript */,\n') + p:write('\t\t\t);\n'); + p:write('\t\t\tbuildRules = (\n\t\t\t);\n') + p:write('\t\t\tdependencies = (\n\t\t\t);\n') + p:write('\t\t\tname = "', decl.Name, '";\n') + p:write('\t\t\tProductName = "', decl.Name, '";\n') + p:write('\t\t\tproductReference = ', newid(decl.Name .. "Program"), ' /* ', decl.Name, ' */;\n ') + p:write('\t\t\tproductType = "', categories[project.Type] or "", '";\n') + p:write('\t\t};\n') + end + end + + p:write('/* End PBXNativeTarget section */\n') +end + + +local function write_header(p) + p:write('// !$*UTF8*$!\n') + p:write('{\n') + p:write('\tarchiveVersion = 1;\n') + p:write('\tclasses = {\n') + p:write('\t};\n') + p:write('\tobjectVersion = 45;\n') + p:write('\tobjects = {\n') + p:write('\n') +end + +local function get_projects(raw_nodes, env) + local projects = {} + + local source_list = {} + source_list[newid("tundra.lua")] = "tundra.lua" + local units = io.open("units.lua") + if units then + source_list[newid("units.lua")] = "units.lua" + io.close(units) + end + + local meta_name = "!BuildWorkspace" + + projects[#projects + 1] = { + Decl = { Name = meta_name, }, + Type = "LegacyTarget", + RelativeFilename = "", + Sources = source_list, + Guid = newid(meta_name .. 'ProjectId'), + IsMeta = true, + MetaData = { BuildArgs = "'' $(CONFIG) $(VARIANT) $(SUBVARIANT) $(ACTION)", + BuildTool = "xcodetundra" }, + } + + local meta_name = "!UpdateWorkspace" + + projects[#projects + 1] = { + Decl = { Name = "!UpdateWorkspace", }, + Type = "LegacyTarget", + RelativeFilename = "", + Sources = source_list, + Guid = newid(meta_name .. 'ProjectId'), + IsMeta = true, + MetaData = { BuildArgs = "", + BuildTool = "xcodeupdateproj" }, + } + + for _, unit in ipairs(raw_nodes) do + local data = get_project_data(unit, env) + if data then projects[#projects + 1] = data; end + end + + return projects +end + +local function split(fn) + local dir, file = fn:match("^(.*)[/\\]([^\\/]*)$") + if not dir then + return ".", fn + else + return dir, file + end +end + +local function split_str(str, pat, name) + local t = {} -- NOTE: use {n = 0} in Lua-5.0 + local fpat = "(.-)" .. pat + local last_end = 1 + local s, e, cap = str:find(fpat, 1) + table.insert(t,name) + while s do + if s ~= 1 or cap ~= "" then + table.insert(t,cap) + end + last_end = e+1 + s, e, cap = str:find(fpat, last_end) + end + if last_end <= #str then + cap = str:sub(last_end) + table.insert(t, cap) + end + return t +end + +local function build_name_id(entry, offset, end_count) + local entryname = "" + for p = offset, end_count, 1 do + if entry[p] ~= nil then + entryname = entryname .. entry[p] + end + end + return newid(entryname) +end + + +local function make_indent(level) + local indent = '\t'; + for i=1, level, 1 do + indent = indent .. '\t' + end + return indent +end + +local function make_full_path( grp ) + + local full_path_string = grp.Name + local gparent = grp.Parent + while gparent ~= nil do + full_path_string = gparent.Name ..'/'..full_path_string + gparent = gparent.Parent + end + return full_path_string .. ' : ' .. grp.Key +end + +local function write_group_ref(p, g, full_path) + + p:write('\t\t', g.Key, ' /* ', full_path .. '/' .. g.Name, ' */ = {\n') + p:write('\t\t\tisa = PBXGroup;\n') + p:write('\t\t\tchildren = (\n') + + local dirs = {} + local files = {} + + for _, ref in pairs(g.Children) do + if ref.IsDir then + local key = ref.Key + dirs[#dirs + 1] = { Key = key, Name = ref.Name } + else + local key = ref.Key + files[#files + 1] = { Key = key, Name = ref.Name } + end + end + + table.sort(dirs, function(a, b) return a.Name < b.Name end) + table.sort(files, function(a, b) return a.Name < b.Name end) + + for _, ref in pairs(dirs) do + p:write(string.format('\t\t\t\t%s /* %s */,\n', ref.Key, full_path .. '/' .. ref.Name)) + end + + for _, ref in pairs(files) do + p:write(string.format('\t\t\t\t%s /* %s */,\n', ref.Key, full_path .. '/' .. ref.Name)) + end + + p:write('\t\t\t);\n') + p:write('\t\t\tname = "', g.Name, '"; \n'); + p:write('\t\t\tsourceTree = "";\n'); + p:write('\t\t};\n') +end + +local function print_children_2(p, children, path, level) + if children == nil then + return path + end + + local c + local local_path = ''--path + for _, c in pairs(children) do + local indent = make_indent(level) + local_path = print_children_2( p, c.Children, path .. '/' .. c.Name, level + 1 ) + if #c.Children ~= 0 then + write_group_ref(p, c, path) + end + + end + + return path +end + +local function find_group(groups, group, parent) + if groups == nil then return nil end + for _, g in pairs(groups) do + if g.Name == group and g.Parent == parent then + return g + end + local r = find_group( g.Children, group, parent ) + if r ~= nil then return r end + end + return nil +end + +local function write_sources(p, children, name, parent) + + local filelist = sort_filelist(children) + local groups = {}; + + table.insert(groups, {Name = name, Parent = nil, Key = parent, Children = {} }) + + for _, entry in pairs(filelist) do + local parent_group = nil + local path, filename = split(entry.Value) + local split_path = split_str(path, "/", name) + for i=1 , #split_path, 1 do + if split_path[i] ~= '.' then + local grp = find_group(groups, split_path[i], parent_group) + if grp == nil then + grp = { IsDir = true, Name=split_path[i], Parent=parent_group, Key=newid(util.tostring(parent_group)..split_path[i]), Children={} } + if parent_group == nil then + table.insert(groups, grp) + else + parent_group = grp.Parent + table.insert(parent_group.Children, grp) + end + end + parent_group = grp + end + end + if parent_group ~= nil then + table.insert(parent_group.Children, { IsDir = false, Name=filename, Parent=parent_group, Key = entry.Key, Children = {}} ) + end + end + + print_children_2(p, groups, '.', 0); +end + + +local function write_groups(p, projects) + p:write('/* Begin PBXGroup section */\n') + + local all_targets_name = "AllTargets.workspace" + local all_targets_id = newid(all_targets_name) + + for _, project in pairs(projects) do + write_sources(p, project.Sources, project.Decl.Name, project.Guid) + end + + -- write last group that links the projects names above + + p:write('\t\t', all_targets_id, ' /* ', all_targets_name, ' */ = {\n') + p:write('\t\t\tisa = PBXGroup;\n') + p:write('\t\t\tchildren = (\n') + + for _, project in pairs(projects) do + p:write(string.format('\t\t\t\t%s /* %s */,\n', project.Guid, project.Decl.Name)) + end + p:write('\t\t\t);\n') + p:write('\t\t\tname = "', all_targets_name, '"; \n'); + p:write('\t\t\tsourceTree = "";\n'); + p:write('\t\t};\n') + + p:write('/* End PBXGroup section */\n\n') +end + +local function write_project(p, projects) + + local all_targets_name = "AllTargets.workspace" + local all_targets_id = newid(all_targets_name) + + local project_id = newid("ProjectObject") + local project_config_list_id = newid("ProjectObjectConfigList") + + p:write('/* Begin PBXProject section */\n') + p:write('\t\t', project_id, ' /* Project object */ = {\n') + p:write('\t\t\tisa = PBXProject;\n') + p:write('\t\t\tbuildConfigurationList = ', project_config_list_id, ' /* Build configuration list for PBXProject "', "Project Object", '" */;\n') + p:write('\t\t\tcompatibilityVersion = "Xcode 3.1";\n') + p:write('\t\t\thasScannedForEncodings = 1;\n') + p:write('\t\t\tmainGroup = ', all_targets_id, ' /* ', all_targets_name, ' */;\n') + p:write('\t\t\tprojectDirPath = "";\n') + p:write('\t\t\tprojectRoot = "";\n') + p:write('\t\t\ttargets = (\n') + + for _, project in pairs(projects) do + p:write(string.format('\t\t\t\t%s /* %s */,\n', newid(project.Decl.Name .. "Target"), project.Decl.Name)) + end + + p:write('\t\t\t);\n') + p:write('\t\t};\n') + p:write('/* End PBXProject section */\n') +end + +local function write_shellscripts(p, projects, env) + p:write('/* Begin PBXShellScriptBuildPhase section */\n') + + -- TODO: Do we really need to repead this for all projects? seems a bit wasteful + + local xcodetundra_filename = get_absolute_output_path(env) .. "xcodetundra" + + for _, project in pairs(projects) do + local name = project.Decl.Name + if not project.IsMeta then + p:write('\t\t', newid(name .. "ShellScript"), ' /* ShellScript */ = {\n') + p:write('\t\t\tisa = PBXShellScriptBuildPhase;\n') + p:write('\t\t\tbuildActionMask = 2147483647;\n') + p:write('\t\t\tfiles = (\n') + p:write('\t\t\t);\n') + p:write('\t\t\tinputPaths = (\n') + p:write('\t\t\t);\n') + p:write('\t\t\toutputPaths = (\n') + p:write('\t\t\t);\n') + p:write('\t\t\trunOnlyForDeploymentPostprocessing = 0;\n') + p:write('\t\t\tshellPath = /bin/sh;\n') + p:write('\t\t\tshellScript = "', xcodetundra_filename, ' $TARGET_NAME $CONFIG $VARIANT $SUBVARIANT $ACTION -v";\n') + p:write('\t\t};\n') + end + end + + p:write('/* Begin PBXShellScriptBuildPhase section */\n') +end + +local function get_full_config_name(config) + return config.Config.Name .. '-' .. config.Variant.Name .. '-' .. config.SubVariant +end + +local function write_configs(p, projects, config_tuples, env) + + p:write('/* Begin XCConfigurationList section */\n') + + -- I wonder if we really need to do it this way for all configs? + + for __, project in ipairs(projects) do + for _, tuple in ipairs(config_tuples) do + local full_config_name = get_full_config_name(tuple) + + local is_macosx_native = false + + for _, host in util.nil_ipairs(tuple.Config.SupportedHosts) do + if host == "macosx" then + is_macosx_native = true + end + end + + if "macosx" == tuple.Config.DefaultOnHost then + is_macosx_native = true + end + + local config_id = newid(project.Decl.Name .. full_config_name) + + p:write('\t\t', config_id, ' = {\n') + p:write('\t\t\tisa = XCBuildConfiguration;\n') + + -- Don't add any think extra if subvariant is default + + p:write('\t\t\tbuildSettings = {\n') + + if is_macosx_native then + p:write('\t\t\t\tARCHS = "$(NATIVE_ARCH_ACTUAL)";\n') + end + + p:write('\t\t\t\tVARIANT = "', tuple.Variant.Name, '";\n') + p:write('\t\t\t\tCONFIG = "', tuple.Config.Name, '";\n') + p:write('\t\t\t\tSUBVARIANT = "', tuple.SubVariant, '";\n') + + if is_macosx_native and not project.IsMeta then + p:write('\t\t\t\tCONFIGURATION_BUILD_DIR = "', full_config_name, '";\n') + end + + -- this is a little hack to get xcode to clean the whole output folder when using "FullBuild" + p:write('\t\t\t\tPRODUCT_NAME = "',project.Decl.Name , '";\n') + p:write('\t\t\t\tTARGET_NAME = "',project.Decl.Name , '";\n') + + p:write('\t\t\t};\n') + p:write('\t\t\tname = "',full_config_name , '";\n') + p:write('\t\t};\n') + end + end + + p:write('/* End XCConfigurationList section */\n') + +end + +local function write_config_list(p, projects, config_tuples) + + p:write('/* Begin XCConfigurationList section */\n') + + local default_config = ""; + + -- find the default config + + for _, tuple in ipairs(config_tuples) do + local is_macosx_native = tuple.Config.Name:match('^(%macosx)%-') + + if is_macosx_native and tuple.Variant.Name == "debug" then + default_config = get_full_config_name(tuple) + break + end + end + + -- if we did't find a default config just grab the first one + + if default_config == "" then + default_config = get_full_config_name(config_tuples[0]) + end + + for __, project in ipairs(projects) do + + local config_id = newid(project.Decl.Name .. 'Config') + + p:write('\t\t', config_id, ' /* Build config list for "', project.Decl.Name, '" */ = {\n') + p:write('\t\t\tisa = XCConfigurationList;\n') + + -- Don't add any think extra if subvariant is default + + p:write('\t\t\tbuildConfigurations = (\n') + + for _, tuple in ipairs(config_tuples) do + local full_config_name = get_full_config_name(tuple) + p:write(string.format('\t\t\t\t%s /* %s */,\n', newid(project.Decl.Name .. full_config_name), full_config_name)) + end + + p:write('\t\t\t);\n') + p:write('\t\t\tdefaultConfigurationIsVisible = 1;\n') + p:write('\t\t\tdefaultConfigurationName = "', default_config, '";\n') + + p:write('\t\t};\n') + end + + p:write('/* End XCConfigurationList section */\n') + +end + +local function write_footer(p) + p:write('\t};\n') + p:write('\trootObject = ', newid("ProjectObject"), ' /* Project object */;\n') + p:write('}\n') +end + +local function generate_shellscript(env) + local filename = path.join(get_absolute_output_path(env), "xcodetundra") + local p = assert(io.open(filename, 'wb')) + p:write("#/bin/sh\n") + p:write("TARGET_NAME=$1\n") + p:write("CONFIG=$2\n") + p:write("VARIANT=$3\n") + p:write("SUBVARIANT=$4\n") + p:write("ACTION=$5\n") + p:write('if [ "$5" = "clean" ]; then\n') + p:write(' ACTION="-c"\n') + p:write("fi\n\n") + p:write('if [ "$5" = "build" ]; then\n') + p:write(' ACTION=""\n') + p:write("fi\n\n") + p:write(TundraExePath .. " --full-paths $TARGET_NAME $CONFIG-$VARIANT-$SUBVARIANT $ACTION -v\n") + p:close() + os.execute("chmod +x " .. filename) + local filename = path.join(get_absolute_output_path(env), "xcodeupdateproj") + local p = io.open(filename, 'wb') + p:write("#/bin/sh\n") + p:write(TundraExePath .. " --ide-gen xcode3 -a\n") + p:close() + os.execute("chmod +x " .. filename) +end + +function xcode_generator:generate_files(ngen, config_tuples, raw_nodes, env, default_names) + assert(config_tuples and #config_tuples > 0) + + -- TODO: Set the first default config as default + + local base_dir = env:interpolate('$(OBJECTROOT)$(SEP)') + local xcodeproj_dir = base_dir .. "tundra-generated.xcodeproj/" + + native.mkdir(base_dir) + native.mkdir(xcodeproj_dir) + + generate_shellscript(env) + + local p = io.open(path.join(xcodeproj_dir, "project.pbxproj"), 'wb') + + local projects = get_projects(raw_nodes, env) + + write_header(p) + write_file_refs(p, projects) + write_groups(p, projects) + write_legacy_targets(p, projects, env) + write_native_targes(p, projects) + write_project(p, projects) + write_shellscripts(p, projects, env) + write_configs(p, projects, config_tuples, env) + write_config_list(p, projects, config_tuples) + write_footer(p) +end + +nodegen.set_ide_backend(function(...) + local state = setmetatable({}, xcode_generator) + state:generate_files(...) +end) + diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/xcode5.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/xcode5.lua new file mode 100644 index 0000000..6fb5353 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/ide/xcode5.lua @@ -0,0 +1,924 @@ +-- Xcode 5 Workspace/Project file generation + +module(..., package.seeall) + +local path = require "tundra.path" +local nodegen = require "tundra.nodegen" +local util = require "tundra.util" +local native = require "tundra.native" + +local xcode_generator = {} +xcode_generator.__index = xcode_generator + +function xcode_generator:generate_workspace(fn, projects) + local sln = io.open(fn, 'wb') + + sln:write('\n') + sln:write('\n') + + for _, proj in ipairs(projects) do + local name = proj.Decl.Name + local fname = proj.RelativeFilename + if fname == '.' then fname = '' + else fname = fname ..'/' + end + sln:write('\t\n') + sln:write('\t\n') + end + + sln:write('\n') +end + +local project_types = util.make_lookup_table { + "Program", "SharedLibrary", "StaticLibrary", +} +local toplevel_stuff = util.make_lookup_table { + ".exe", ".lib", ".dll", +} + +local binary_extension = util.make_lookup_table { + "", ".obj", ".o", ".a", +} + +local header_exts = util.make_lookup_table { + ".h", ".hpp", ".hh", ".inl", +} + +local function newid(data) + local string = native.digest_guid(data) + -- a bit ugly but is to match the xcode style of UIds + return string.sub(string.gsub(string, '-', ''), 1, 24) +end + +local file_types = { + [".c"] = "sourcecode.c.c", + [".cc"] = "sourcecode.cpp.cpp", + [".cpp"] = "sourcecode.cpp.cpp", + [".css"] = "text.css", + [".cxx"] = "sourcecode.cpp.cpp", + [".framework"] = "wrapper.framework", + [".gif"] = "image.gif", + [".h"] = "sourcecode.c.h", + [".html"] = "text.html", + [".lua"] = "sourcecode.lua", + [".m"] = "sourcecode.c.objc", + [".mm"] = "sourcecode.cpp.objc", + [".nib"] = "wrapper.nib", + [".pch"] = "sourcecode.c.h", + [".plist"] = "text.plist.xml", + [".strings"] = "text.plist.strings", + [".xib"] = "file.xib", + [".icns"] = "image.icns", + [""] = "compiled.mach-o.executable", +} + +local function getfiletype(name) + return file_types[path.get_extension(name)] or "text" +end + +-- Scan for sources, following dependencies until those dependencies seem to be a different top-level unit +local function get_sources(dag, sources, generated, dag_lut) + for _, output in ipairs(dag.outputs) do + local ext = path.get_extension(output) + if not binary_extension[ext] then + generated[output] = true + sources[output] = true -- pick up generated headers + end + end + + for _, input in ipairs(dag.inputs) do + local ext = path.get_extension(input) + if not binary_extension[ext] then + sources[input] = true + end + end + + for _, dep in util.nil_ipairs(dag.deps) do + if not dag_lut[dep] then -- don't go into other top-level DAGs + get_sources(dep, sources, generated, dag_lut) + end + end +end + +local function get_headers(unit, sources, dag_lut, name_to_dags) + local src_dir = '' + + if not unit.Decl then + -- Ignore ExternalLibrary and similar that have no data. + return + end + + if unit.Decl.SourceDir then + src_dir = unit.Decl.SourceDir .. '/' + end + for _, src in util.nil_ipairs(nodegen.flatten_list('*-*-*-*', unit.Decl.Sources)) do + if type(src) == "string" then + local ext = path.get_extension(src) + if header_exts[ext] then + local full_path = path.normalize(src_dir .. src) + sources[full_path] = true + end + end + end + + local function toplevel(u) + if type(u) == "string" then + return type(name_to_dags[u]) ~= "nil" + end + + for _, dag in pairs(u.Decl.__DagNodes) do + if dag_lut[dag] then + return true + end + end + return false + end + + -- Repeat for dependencies ObjGroups + for _, dep in util.nil_ipairs(nodegen.flatten_list('*-*-*-*', unit.Decl.Depends)) do + + if not toplevel(dep) then + get_headers(dep, sources, dag_lut) + end + end +end + +local function sort_filelist(source_list) + local dest = {} + for k, v in pairs(source_list) do table.insert(dest, { Key = k, Value = v }) end + table.sort(dest, function(a, b) return a.Value < b.Value end) + return dest +end + +local function write_file_refs(p, projects) + p:write('/* Begin FBXFileReference section */\n') + local cwd = native.getcwd(); + + -- build the source list + + local full_source_list = {} + + for _, project in ipairs(projects) do + local sources = project.Sources + for key, fn in pairs(sources) do + full_source_list[key] = fn + end + + -- include executable names in the source list as well + + if project.Type == "Program" then + full_source_list[newid(project.Decl.Name .. "Program")] = project.Decl.Name + end + end + + local source_list = {} + + -- As we can't sort hashtables we need to move this over to a regular table + + source_list = sort_filelist(full_source_list) + + for _, entry in pairs(source_list) do + local key = entry.Key + local fn = entry.Value + local name = path.get_filename(fn) + local file_type = getfiletype(fn) + local str = "" + if file_type == "compiled.mach-o.executable" then + str = string.format('\t\t%s /* %s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = %s; name = "%s"; includeInIndex = 0; path = "%s"; sourceTree = BUILT_PRODUCTS_DIR; };', + key, fn, file_type, name, fn) + else + str = string.format('\t\t%s /* %s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = %s; name = "%s"; path = "%s"; sourceTree = ""; };', + key, fn, file_type, name, path.join(cwd, fn)) + end + p:write(str, '\n') + end + + p:write('/* End FBXFileReference section */\n\n') +end + +local function write_legacy_targets(p, projects, env) + p:write('/* Begin PBXLegacyTarget section */\n') + + for _, project in ipairs(projects) do + local decl = project.Decl + + if project.IsMeta then + --[[ + isa = PBXLegacyTarget; + buildArgumentsString = ""; + buildConfigurationList = D7D12762170E4CF98A79B5EF /* Build configuration list for PBXLegacyTarget "!UpdateWorkspace" */; + buildPhases = ( + ); + buildToolPath = /Users/danielcollin/unity_ps3/ps3/Projects/JamGenerated/_workspace.xcode_/updateworkspace; + dependencies = ( + ); + name = "!UpdateWorkspace"; + passBuildSettingsInEnvironment = 1; + productName = "!UpdateWorkspace"; + --]] + + p:write('\t\t', newid(decl.Name .. "Target"), ' /* ', decl.Name, ' */ = {\n') + p:write('\t\t\tisa = PBXLegacyTarget;\n') + p:write('\t\t\tbuildArgumentsString = "', project.MetaData.BuildArgs, '";\n') + p:write('\t\t\tbuildConfigurationList = ', newid(decl.Name .. 'Config'), ' /* Build configuration list for PBXLegacyTarget "',decl.Name, '" */;\n') + p:write('\t\t\tbuildPhases = (\n') + p:write('\t\t\t);\n'); + p:write('\t\t\tbuildToolPath = ', project.MetaData.BuildTool, ';\n') + p:write('\t\t\tbuildWorkingDirectory = ', '..', ';\n') + + p:write('\t\t\tdependencies = (\n\t\t\t);\n') + p:write('\t\t\tname = "', decl.Name, '";\n') + p:write('\t\t\tpassBuildSettingsInEnvironment = 1;\n') + p:write('\t\t\tproductName = "', decl.Name or "", '";\n') + p:write('\t\t};\n') + end + end + + p:write('/* End PBXLegacyTarget section */\n') +end + +local function write_native_targes(p, projects) + p:write('/* Begin PBXNativeTarget section */\n') + + local categories = { + ["Program"] = "com.apple.product-type.tool", + ["StaticLibrary"] = "com.apple.product-type.library.static", + ["SharedLibrary"] = "com.apple.product-type.library.dynamic", + } + + for _, project in ipairs(projects) do + local decl = project.Decl + + if not project.IsMeta then + p:write('\t\t', newid(decl.Name .. "Target"), ' /* ', decl.Name, ' */ = {\n') + p:write('\t\t\tisa = PBXNativeTarget;\n') + p:write('\t\t\tbuildConfigurationList = ', newid(decl.Name .. 'Config'), ' /* Build configuration list for PBXNativeTarget "',decl.Name, '" */;\n') + p:write('\t\t\tbuildPhases = (\n') + p:write('\t\t\t\t', newid(decl.Name .. "ShellScript"), ' /* ShellScript */,\n') + p:write('\t\t\t);\n'); + p:write('\t\t\tbuildRules = (\n\t\t\t);\n') + p:write('\t\t\tdependencies = (\n\t\t\t);\n') + p:write('\t\t\tname = "', decl.Name, '";\n') + p:write('\t\t\tProductName = "', decl.Name, '";\n') + p:write('\t\t\tproductReference = ', newid(decl.Name .. "Program"), ' /* ', decl.Name, ' */;\n ') + p:write('\t\t\tproductType = "', categories[project.Type] or "", '";\n') + p:write('\t\t};\n') + end + end + + p:write('/* End PBXNativeTarget section */\n') +end + + +local function write_header(p) + p:write('// !$*UTF8*$!\n') + p:write('{\n') + p:write('\tarchiveVersion = 1;\n') + p:write('\tclasses = {\n') + p:write('\t};\n') + p:write('\tobjectVersion = 45;\n') + p:write('\tobjects = {\n') + p:write('\n') +end + +local function get_projects(raw_nodes, env, hints, ide_script) + local projects = {} + + -- Filter out stuff we don't care about. + local units = util.filter(raw_nodes, function (u) + return u.Decl.Name and project_types[u.Keyword] + end) + + local dag_node_lut = {} -- lookup table of all named, top-level DAG nodes + local name_to_dags = {} -- table mapping unit name to array of dag nodes (for configs) + + -- Map out all top-level DAG nodes + for _, unit in ipairs(units) do + local decl = unit.Decl + + local dag_nodes = assert(decl.__DagNodes, "no dag nodes for " .. decl.Name) + for build_id, dag_node in pairs(dag_nodes) do + dag_node_lut[dag_node] = unit + local array = name_to_dags[decl.Name] + if not array then + array = {} + name_to_dags[decl.Name] = array + end + array[#array + 1] = dag_node + end + end + + -- Sort units based on dependency complexity. We want to visit the leaf nodes + -- first so that any source file references are picked up as close to the + -- bottom of the dependency chain as possible. + local unit_weights = {} + for _, unit in ipairs(units) do + local decl = unit.Decl + local stack = { } + for _, dag in pairs(decl.__DagNodes) do + stack[#stack + 1] = dag + end + local weight = 0 + while #stack > 0 do + local node = table.remove(stack) + if dag_node_lut[node] then + weight = weight + 1 + end + for _, dep in util.nil_ipairs(node.deps) do + stack[#stack + 1] = dep + end + end + unit_weights[unit] = weight + end + + table.sort(units, function (a, b) + return unit_weights[a] < unit_weights[b] + end) + + -- Keep track of what source files have already been grabbed by other projects. + local grabbed_sources = {} + + for _, unit in ipairs(units) do + local decl = unit.Decl + local name = decl.Name + + local sources = {} + local generated = {} + for build_id, dag_node in pairs(decl.__DagNodes) do + get_sources(dag_node, sources, generated, dag_node_lut) + end + + -- Explicitly add all header files too as they are not picked up from the DAG + -- Also pick up headers from non-toplevel DAGs we're depending on + get_headers(unit, sources, dag_node_lut, name_to_dags) + + -- Figure out which project should get this data. + local output_name = name + local ide_hints = unit.Decl.IdeGenerationHints + if ide_hints then + if ide_hints.OutputProject then + output_name = ide_hints.OutputProject + end + end + + -- Rebuild source list with ids that are needed by the xcode project layout + local source_list = {} + for src, _ in pairs(sources) do + local norm_src = path.normalize(src) + -- if not grabbed_sources[norm_src] then + grabbed_sources[norm_src] = unit + source_list[newid(norm_src)] = norm_src + -- end + end + + projects[name] = { + Type = unit.Keyword, + Decl = decl, + Sources = source_list, + RelativeFilename = name, + Guid = newid(name .. "ProjectId"), + IdeGenerationHints = unit.Decl.IdeGenerationHints + } + end + + for _, unit in ipairs(raw_nodes) do + if unit.Keyword == "OsxBundle" then + local decl = unit.Decl + decl.Name = "OsxBundle" + + local source_list = {[newid(decl.InfoPList)] = decl.InfoPList} + for _, resource in util.nil_ipairs(decl.Resources) do + if resource.Decl then + source_list[newid(resource.Decl.Source)] = resource.Decl.Source + end + end + + projects["OsxBundle"] = { + Type = unit.Keyword, + Decl = decl, + Sources = source_list, + RelativeFilename = "$(OBJECTDIR)/MyApp.app", + Guid = newid("OsxBundle"), + } + end + end + + return projects +end + +local function split(fn) + local dir, file = fn:match("^(.*)[/\\]([^\\/]*)$") + if not dir then + return ".", fn + else + return dir, file + end +end + +local function split_str(str, pat) + local t = {} -- NOTE: use {n = 0} in Lua-5.0 + local fpat = "(.-)" .. pat + local last_end = 1 + local s, e, cap = str:find(fpat, 1) + while s do + if s ~= 1 or cap ~= "" then + table.insert(t,cap) + end + last_end = e+1 + s, e, cap = str:find(fpat, last_end) + end + if last_end <= #str then + cap = str:sub(last_end) + table.insert(t, cap) + end + return t +end + +local function print_children_2(p, groupname, key, children, path) + + for name, c in pairs(children) do + if c.Type > 0 then + print_children_2(p, name, c.Key, c.Children, c.Type == 1 and path..'/'..name or path) + end + end + + p:write('\t\t', key, ' /* ', path, ' */ = {\n') + p:write('\t\t\tisa = PBXGroup;\n') + p:write('\t\t\tchildren = (\n') + + local dirs = {} + local files = {} + + for name, ref in pairs(children) do + if ref.Type > 0 then + dirs[#dirs + 1] = { Key = ref.Key, Name = name } + else + files[#files + 1] = { Key = ref.Key, Name = name } + end + end + + table.sort(dirs, function(a, b) return a.Name < b.Name end) + table.sort(files, function(a, b) return a.Name < b.Name end) + + for i, ref in pairs(dirs) do + p:write(string.format('\t\t\t\t%s /* %s */,\n', ref.Key, path .. '/' .. ref.Name)) + end + + for i, ref in pairs(files) do + p:write(string.format('\t\t\t\t%s /* %s */,\n', ref.Key, path .. '/' .. ref.Name)) + end + + p:write('\t\t\t);\n') + p:write('\t\t\tname = "', groupname, '"; \n'); + p:write('\t\t\tsourceTree = "";\n'); + p:write('\t\t};\n') +end + +local function prune_groups(group) + local i = 0 + local first_name + local first_child + + for name, child in pairs(group.Children) do + first_name = name + first_child = child + i = i + 1 + end + + if i == 1 and first_child.Type > 0 then + local new_name = prune_groups(first_child) + group.Children = first_child.Children; + if not new_name then + new_name = first_name + end + return new_name + + else + local children = {} + for name, child in pairs(group.Children) do + if child.Type > 0 then + local new_name = prune_groups(child) + if new_name then + name = new_name + end + end + children[name] = child + end + group.children = children + return nil + end + +end + + +local function make_groups(p, files, key) + local filelist = sort_filelist(files) + local group = { Type = 2, Key = key, Children = {} } + + for _, entry in pairs(filelist) do + local parent_group = group + local path, filename = split(entry.Value) + for i, part in ipairs(split_str(path, "/")) do + if part ~= '.' then + local grp = parent_group.Children[part] + if grp == nil then + grp = { Type = 1, Key=newid(util.tostring(parent_group)..part), Children={} } + parent_group.Children[part] = grp + end + parent_group = grp + end + end + parent_group.Children[filename] = { Type = 0, Key = entry.Key } + end + + -- prune single-entry groups + prune_groups(group) + + return group +end + + +local function write_groups(p, projects) + p:write('/* Begin PBXGroup section */\n') + + -- Map folder names to array of projects under that folder + local folders = {} + for _, project in ipairs(projects) do + local hints = project.IdeGenerationHints + local msvc_hints = hints and hints.Msvc + local fname = msvc_hints and msvc_hints.SolutionFolder + if fname == nil then + fname = "" + end + local folder = folders[fname] + if folder == nil then + folder = { Type = 2, Key = newid("Folder"..fname), Children = {} } + folders[fname] = folder + end + folder.Children[project.Decl.Name] = make_groups(p, project.Sources, project.Guid) + end + + local root = folders[""]; + for name, folder in pairs(folders) do + if folder ~= root then + root.Children[name] = folder + end + end + + local all_targets_name = "AllTargets.workspace" + local all_targets_id = newid(all_targets_name) + print_children_2(p, all_targets_name, all_targets_id, root.Children, '.'); + + -- write last group that links the projects names above + + -- local all_targets_name = "AllTargets.workspace" + -- local all_targets_id = newid(all_targets_name) + -- p:write('\t\t', all_targets_id, ' /* ', all_targets_name, ' */ = {\n') + -- p:write('\t\t\tisa = PBXGroup;\n') + -- p:write('\t\t\tchildren = (\n') + + -- for _, project in pairs(projects) do + -- p:write(string.format('\t\t\t\t%s /* %s */,\n', project.Guid, project.Decl.Name)) + -- end + -- p:write('\t\t\t);\n') + -- p:write('\t\t\tname = "', all_targets_name, '"; \n'); + -- p:write('\t\t\tsourceTree = "";\n'); + -- p:write('\t\t};\n') + + p:write('/* End PBXGroup section */\n\n') +end + +local function write_project(p, projects) + + local all_targets_name = "AllTargets.workspace" + local all_targets_id = newid(all_targets_name) + + local project_id = newid("ProjectObject") + local project_config_list_id = newid("ProjectObjectConfigList") + + p:write('/* Begin PBXProject section */\n') + p:write('\t\t', project_id, ' /* Project object */ = {\n') + p:write('\t\t\tisa = PBXProject;\n') + p:write('\t\t\tbuildConfigurationList = ', project_config_list_id, ' /* Build configuration list for PBXProject "', "Project Object", '" */;\n') + p:write('\t\t\tcompatibilityVersion = "Xcode 3.1";\n') + p:write('\t\t\thasScannedForEncodings = 1;\n') + p:write('\t\t\tmainGroup = ', all_targets_id, ' /* ', all_targets_name, ' */;\n') + p:write('\t\t\tprojectDirPath = "";\n') + p:write('\t\t\tprojectRoot = "";\n') + p:write('\t\t\ttargets = (\n') + + for _, project in ipairs(projects) do + p:write(string.format('\t\t\t\t%s /* %s */,\n', newid(project.Decl.Name .. "Target"), project.Decl.Name)) + end + + p:write('\t\t\t);\n') + p:write('\t\t};\n') + p:write('/* End PBXProject section */\n') +end + +local function write_shellscripts(p, projects, env) + p:write('/* Begin PBXShellScriptBuildPhase section */\n') + + -- TODO: Do we really need to repeat this for all projects? seems a bit wasteful + + for _, project in ipairs(projects) do + local name = project.Decl.Name + if not project.IsMeta then + p:write('\t\t', newid(name .. "ShellScript"), ' /* ShellScript */ = {\n') + p:write('\t\t\tisa = PBXShellScriptBuildPhase;\n') + p:write('\t\t\tbuildActionMask = 2147483647;\n') + p:write('\t\t\tfiles = (\n') + p:write('\t\t\t);\n') + p:write('\t\t\tinputPaths = (\n') + p:write('\t\t\t);\n') + p:write('\t\t\toutputPaths = (\n') + p:write('\t\t\t);\n') + p:write('\t\t\trunOnlyForDeploymentPostprocessing = 0;\n') + p:write('\t\t\tshellPath = /bin/sh;\n') + p:write('\t\t\tshellScript = "cd ..\\n', TundraExePath, ' $(CONFIG)-$(VARIANT)-$(SUBVARIANT)";\n') + p:write('\t\t};\n') + end + end + + p:write('/* End PBXShellScriptBuildPhase section */\n') +end + +local function get_full_config_name(config) + return config.Config.Name .. '-' .. config.Variant.Name .. '-' .. config.SubVariant +end + +local function write_configs(p, projects, config_tuples, env, set_env) + + p:write('/* Begin XCBuildConfiguration section */\n') + + -- I wonder if we really need to do it this way for all configs? + + for _, project in ipairs(projects) do + for _, tuple in ipairs(config_tuples) do + local full_config_name = get_full_config_name(tuple) + local is_macosx_native = false + + for _, host in util.nil_ipairs(tuple.Config.SupportedHosts) do + if host == "macosx" then + is_macosx_native = true + end + end + + if "macosx" == tuple.Config.DefaultOnHost then + is_macosx_native = true + end + + local config_id = newid(project.Decl.Name .. full_config_name) + + p:write('\t\t', config_id, ' = {\n') + p:write('\t\t\tisa = XCBuildConfiguration;\n') + + -- Don't add any think extra if subvariant is default + + p:write('\t\t\tbuildSettings = {\n') + + if is_macosx_native then + p:write('\t\t\t\tARCHS = "$(NATIVE_ARCH_ACTUAL)";\n') + end + + p:write('\t\t\t\tVARIANT = "', tuple.Variant.Name, '";\n') + p:write('\t\t\t\tCONFIG = "', tuple.Config.Name, '";\n') + p:write('\t\t\t\tSUBVARIANT = "', tuple.SubVariant, '";\n') + + if is_macosx_native and not project.IsMeta then + p:write('\t\t\t\tCONFIGURATION_BUILD_DIR = "', full_config_name, '";\n') + end + + -- this is a little hack to get xcode to clean the whole output folder when using "FullBuild" + p:write('\t\t\t\tPRODUCT_NAME = "',project.Decl.Name , '";\n') + p:write('\t\t\t\tTARGET_NAME = "',project.Decl.Name , '";\n') + + for i, var in ipairs(set_env) do + p:write('\t\t\t\t', var, ' = "', os.getenv(var), '";\n') + end + + p:write('\t\t\t};\n') + p:write('\t\t\tname = "',full_config_name , '";\n') + p:write('\t\t};\n') + end + end + + -- PBXProject configurations + + for _, tuple in ipairs(config_tuples) do + local full_config_name = get_full_config_name(tuple) + local config_id = newid("ProjectObject" .. full_config_name) + + p:write('\t\t', config_id, ' = {\n') + p:write('\t\t\tisa = XCBuildConfiguration;\n') + + p:write('\t\t\tbuildSettings = {\n') + p:write('\t\t\t};\n') + p:write('\t\t\tname = "',full_config_name , '";\n') + p:write('\t\t};\n') + end + + p:write('/* End XCBuildConfiguration section */\n') + +end + +local function write_config_list(p, projects, config_tuples) + p:write('/* Begin XCConfigurationList section */\n') + + local default_config = ""; + + -- find the default config + + for _, tuple in ipairs(config_tuples) do + local is_macosx_native = tuple.Config.Name:match('^(%macosx)%-') + + if is_macosx_native and tuple.Variant.Name == "debug" then + default_config = get_full_config_name(tuple) + break + end + end + + -- if we did't find a default config just grab the first one + + if default_config == "" then + default_config = get_full_config_name(config_tuples[1]) + end + + for __, project in ipairs(projects) do + local config_id = newid(project.Decl.Name .. 'Config') + + p:write('\t\t', config_id, ' /* Build config list for "', project.Decl.Name, '" */ = {\n') + p:write('\t\t\tisa = XCConfigurationList;\n') + + -- Don't add any think extra if subvariant is default + + p:write('\t\t\tbuildConfigurations = (\n') + + for _, tuple in ipairs(config_tuples) do + local full_config_name = get_full_config_name(tuple) + p:write(string.format('\t\t\t\t%s /* %s */,\n', newid(project.Decl.Name .. full_config_name), full_config_name)) + end + + p:write('\t\t\t);\n') + p:write('\t\t\tdefaultConfigurationIsVisible = 1;\n') + p:write('\t\t\tdefaultConfigurationName = "', default_config, '";\n') + + p:write('\t\t};\n') + end + + -- PBXProject configuration list + + local config_id = newid("ProjectObjectConfigList") + + p:write('\t\t', config_id, ' /* Build config list for PBXProject */ = {\n') + p:write('\t\t\tisa = XCConfigurationList;\n') + + -- Don't add any think extra if subvariant is default + + p:write('\t\t\tbuildConfigurations = (\n') + + for _, tuple in ipairs(config_tuples) do + local full_config_name = get_full_config_name(tuple) + p:write(string.format('\t\t\t\t%s /* %s */,\n', newid("ProjectObject" .. full_config_name), full_config_name)) + end + + p:write('\t\t\t);\n') + p:write('\t\t\tdefaultConfigurationIsVisible = 1;\n') + p:write('\t\t\tdefaultConfigurationName = "', default_config, '";\n') + p:write('\t\t};\n') + + p:write('/* End XCConfigurationList section */\n') + +end + +local function write_footer(p) + p:write('\t};\n') + p:write('\trootObject = ', newid("ProjectObject"), ' /* Project object */;\n') + p:write('}\n') +end + +local function make_meta_projects(ide_script) + local source_list = { + [newid("tundra.lua")] = "tundra.lua" + } + local units = io.open("units.lua") + if units then + source_list[newid("units.lua")] = "units.lua" + io.close(units) + end + + local meta_name1 = "!BuildWorkspace" + local meta_name2 = "!UpdateWorkspace" + return { + { + Decl = { Name = meta_name1, }, + Type = "LegacyTarget", + RelativeFilename = "", + Sources = source_list, + Guid = newid(meta_name1 .. 'ProjectId'), + IsMeta = true, + MetaData = { BuildArgs = "-v $(CONFIG)-$(VARIANT)-$(SUBVARIANT)", BuildTool = TundraExePath }, + }, + { + Decl = { Name = meta_name2, }, + Type = "LegacyTarget", + RelativeFilename = "", + Sources = source_list, + Guid = newid(meta_name2 .. 'ProjectId'), + IsMeta = true, + MetaData = { BuildArgs = "--g " .. ide_script, BuildTool = TundraExePath }, + } + } +end + +function xcode_generator:generate_files(ngen, config_tuples, raw_nodes, env, default_names, hints, ide_script) + assert(config_tuples and #config_tuples > 0) + + hints = hints or {} + hints = hints.Xcode or {} + local base_dir = hints.BaseDir and (hints.BaseDir .. '/') or env:interpolate('$(OBJECTROOT)$(SEP)') + native.mkdir(base_dir) + + local projects = get_projects(raw_nodes, env, hints, ide_script) + + local source_list = { + [newid("tundra.lua")] = "tundra.lua" + } + local units = io.open("units.lua") + if units then + source_list[newid("units.lua")] = "units.lua" + io.close(units) + end + + local meta_name = "!BuildWorkspace" + local build_project = { + Decl = { Name = meta_name, }, + Type = "LegacyTarget", + RelativeFilename = "", + Sources = source_list, + Guid = newid(meta_name .. 'ProjectId'), + IsMeta = true, + MetaData = { BuildArgs = "$(CONFIG)-$(VARIANT)-$(SUBVARIANT)", BuildTool = TundraExePath }, + } + local meta_name = "!UpdateWorkspace" + local generate_project = { + Decl = { Name = meta_name, }, + Type = "LegacyTarget", + RelativeFilename = "", + Sources = source_list, + Guid = newid(meta_name .. 'ProjectId'), + IsMeta = true, + MetaData = { BuildArgs = "--g " .. ide_script, BuildTool = TundraExePath }, + } + + local solution_hints = hints.Projects + if not solution_hints then + print("No IdeGenerationHints.Xcode.Projects specified - using defaults") + solution_hints = { + ['tundra-generated.sln'] = { } + } + end + + for name, data in pairs(solution_hints) do + local sln_projects = { build_project, generate_project } + + if data.Projects then + for _, pname in ipairs(data.Projects) do + local pp = projects[pname] + if not pp then + errorf("can't find project %s for inclusion in %s -- check your Projects data", pname, name) + end + sln_projects[#sln_projects + 1] = pp + end + else + -- All the projects (that are not meta) + for pname, pp in pairs(projects) do + sln_projects[#sln_projects + 1] = pp + end + end + + local proj_dir = base_dir .. path.drop_suffix(name) .. ".xcodeproj/" + native.mkdir(proj_dir) + + local p = io.open(path.join(proj_dir, "project.pbxproj"), 'wb') + + write_header(p) + write_file_refs(p, sln_projects) + write_groups(p, sln_projects) + write_legacy_targets(p, sln_projects, env) + write_native_targes(p, sln_projects) + write_project(p, sln_projects) + write_shellscripts(p, sln_projects, env) + write_configs(p, sln_projects, config_tuples, env, hints.EnvVars or {}) + write_config_list(p, sln_projects, config_tuples) + write_footer(p) + end +end + +nodegen.set_ide_backend(function(...) + local state = setmetatable({}, xcode_generator) + state:generate_files(...) +end) + diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/init.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/init.lua new file mode 100644 index 0000000..5f22ca3 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/init.lua @@ -0,0 +1,34 @@ +module(..., package.seeall) + +init_tundra_lua = [====[ +local CFiles = { ".c", ".h" } +Build { + Configs = { + Config { + Name = "generic-gcc", + DefaultOnHost = "linux", + Tools = { "gcc" }, + }, + Config { + Name = "macosx-gcc", + DefaultOnHost = "macosx", + Tools = { "gcc-osx" }, + }, + Config { + Name = "win64-msvc", + DefaultOnHost = "windows", + Tools = { "msvc-vs2008"; TargetPlatform = "x64" }, + }, + }, + Units = function() + require "tundra.syntax.glob" + Program { + Name = "a.out", + Sources = { Glob { Dir = ".", Extensions = CFiles } }, + } + + Default "a.out" + end, +} +]====] + diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/nodegen.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/nodegen.lua new file mode 100644 index 0000000..e560aa1 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/nodegen.lua @@ -0,0 +1,914 @@ +module(..., package.seeall) + +local unitgen = require "tundra.unitgen" +local util = require "tundra.util" +local path = require "tundra.path" +local depgraph = require "tundra.depgraph" +local buildfile = require "tundra.buildfile" +local native = require "tundra.native" + +local ide_backend = nil + +local current = nil + +local _nodegen = { } +_nodegen.__index = _nodegen + +local function syntax_error(msg, ...) + error { Class = 'syntax error', Message = string.format(msg, ...) } +end + +local function validate_boolean(name, value) + if type(value) == "boolean" then + return value + end + syntax_error("%s: expected boolean value, got %q", name, type(value)) +end + +local function validate_string(name, value) + if type(value) == "string" then + return value + end + syntax_error("%s: expected string value, got %q", name, type(value)) +end + +local function validate_pass(name, value) + if type(value) == "string" then + return value + else + syntax_error("%s: expected pass name, got %q", name, type(value)) + end +end + +local function validate_table(name, value) + -- A single string can be converted into a table value very easily + local t = type(value) + if t == "table" then + return value + elseif t == "string" then + return { value } + else + syntax_error("%s: expected table value, got %q", name, t) + end +end + +local function validate_config(name, value) + if type(value) == "table" or type(value) == "string" then + return value + end + syntax_error("%s: expected config, got %q", name, type(value)) +end + +local validators = { + ["string"] = validate_string, + ["pass"] = validate_pass, + ["table"] = validate_table, + ["filter_table"] = validate_table, + ["source_list"] = validate_table, + ["boolean"] = validate_boolean, + ["config"] = validate_config, +} + +function _nodegen:validate() + local decl = self.Decl + for name, detail in pairs(assert(self.Blueprint)) do + local val = decl[name] + if not val then + if detail.Required then + syntax_error("%s: missing argument: '%s'", self.Keyword, name) + end + -- ok, optional value + else + local validator = validators[detail.Type] + decl[name] = validator(name, val) + end + end + for name, detail in pairs(decl) do + if not self.Blueprint[name] then + syntax_error("%s: unsupported argument: '%s'", self.Keyword, name) + end + end +end + +function _nodegen:customize_env(env, raw_data) + -- available for subclasses +end + +function _nodegen:configure_env(env, deps) + local build_id = env:get('BUILD_ID') + local propagate_blocks = {} + local decl = self.Decl + + for _, dep_obj in util.nil_ipairs(deps) do + local data = dep_obj.Decl.Propagate + if data then + propagate_blocks[#propagate_blocks + 1] = data + end + end + + local function push_bindings(env_key, data) + if data then + for _, item in util.nil_ipairs(flatten_list(build_id, data)) do + env:append(env_key, item) + end + end + end + + local function replace_bindings(env_key, data) + if data then + local first = true + for _, item in util.nil_ipairs(flatten_list(build_id, data)) do + if first then + env:replace(env_key, item) + first = false + else + env:append(env_key, item) + end + end + end + end + + -- Push Libs, Defines and so in into the environment of this unit. + -- These are named for convenience but are aliases for syntax niceness. + for decl_key, env_key in util.nil_pairs(self.DeclToEnvMappings) do + -- First pick settings from our own unit. + push_bindings(env_key, decl[decl_key]) + + for _, data in ipairs(propagate_blocks) do + push_bindings(env_key, data[decl_key]) + end + end + + -- Push Env blocks as is + for k, v in util.nil_pairs(decl.Env) do + push_bindings(k, v) + end + + for k, v in util.nil_pairs(decl.ReplaceEnv) do + replace_bindings(k, v) + end + + for _, block in util.nil_ipairs(propagate_blocks) do + for k, v in util.nil_pairs(block.Env) do + push_bindings(k, v) + end + + for k, v in util.nil_pairs(block.ReplaceEnv) do + replace_bindings(k, v) + end + end +end + +local function resolve_sources(env, items, accum, base_dir) + local ignored_exts = util.make_lookup_table(env:get_list("IGNORED_AUTOEXTS", {})) + for _, item in util.nil_ipairs(items) do + local type_name = type(item) + + assert(type_name ~= "function") + + if type_name == "userdata" then + accum[#accum + 1] = item + elseif type_name == "table" then + if depgraph.is_node(item) then + accum[#accum + 1] = item + elseif getmetatable(item) then + accum[#accum + 1] = item:get_dag(env) + else + resolve_sources(env, item, accum, item.SourceDir or base_dir) + end + else + assert(type_name == "string") + local ext = path.get_extension(item) + if not ignored_exts[ext] then + if not base_dir or path.is_absolute(item) then + accum[#accum + 1] = item + else + local p = path.join(base_dir, item) + accum[#accum + 1] = p + end + end + end + end + return accum +end + +-- Analyze source list, returning list of input files and list of dependencies. +-- +-- This is so you can pass a mix of actions producing files and regular +-- filenames as inputs to the next step in the chain and the output files of +-- such nodes will be used automatically. +-- +-- list - list of source files and nodes that produce source files +-- suffixes - acceptable source suffixes to pick up from nodes in source list +local function analyze_sources(env, pass, list, suffixes) + if not list then + return nil + end + + list = util.flatten(list) + local deps = {} + + local function implicit_make(source_file) + local t = type(source_file) + if t == "table" then + return source_file + end + assert(t == "string") + + local make = env:get_implicit_make_fn(source_file) + if make then + return make(env, pass, source_file) + else + return nil + end + end + + local function transform(output, fn) + if type(fn) ~= "string" then + error(util.tostring(fn) .. " is not a string", 2) + end + + local t = implicit_make(fn) + if t then + deps[#deps + 1] = t + t:insert_output_files(output, suffixes) + else + output[#output + 1] = fn + end + end + + local files = {} + for _, src in ipairs(list) do + if depgraph.is_node(src) then + deps[#deps + 1] = src + src:insert_output_files(files, suffixes) + elseif type(src) == "table" then + error("non-DAG node in source list at this point") + else + files[#files + 1] = src + end + end + + while true do + local result = {} + local old_dep_count = #deps + for _, src in ipairs(files) do + transform(result, src) + end + files = result + if #deps == old_dep_count then + --print("scan", util.tostring(list), util.tostring(suffixes), util.tostring(result)) + return result, deps + end + end +end + +local function x_identity(self, name, info, value, env, out_deps) + return value +end + +local function x_source_list(self, name, info, value, env, out_deps) + local build_id = env:get('BUILD_ID') + local source_files + if build_id then + source_files = filter_structure(build_id, value) + else + source_files = value + end + local sources = resolve_sources(env, source_files, {}, self.Decl.SourceDir) + local source_exts = env:get_list(info.ExtensionKey) + local inputs, ideps = analyze_sources(env, resolve_pass(self.Decl.Pass), sources, source_exts) + if ideps then + util.append_table(out_deps, ideps) + end + return inputs +end + +local function x_filter_table(self, name, info, value, env, out_deps) + local build_id = env:get('BUILD_ID') + return flatten_list(build_id, value) +end + +local function find_named_node(name_or_dag) + if type(name_or_dag) == "table" then + return name_or_dag:get_dag(current.default_env) + elseif type(name_or_dag) == "string" then + local generator = current.units[name_or_dag] + if not generator then + errorf("unknown node specified: %q", tostring(name_or_dag)) + end + return generator:get_dag(current.default_env) + else + errorf("illegal node specified: %q", tostring(name_or_dag)) + end +end + +-- Special resolver for dependencies in a nested (config-filtered) list. +local function resolve_dependencies(decl, raw_deps, env) + if not raw_deps then + return {} + end + + local build_id = env:get('BUILD_ID') + local deps = flatten_list(build_id, raw_deps) + return util.map_in_place(deps, function (i) + if type(i) == "string" then + local n = current.units[i] + if not n then + errorf("%s: Unknown 'Depends' target %q", decl.Name, i) + end + return n + elseif type(i) == "table" and getmetatable(i) and i.Decl then + return i + else + errorf("bad 'Depends' value of type %q", type(i)) + end + end) +end + +local function x_pass(self, name, info, value, env, out_deps) + return resolve_pass(value) +end + +local decl_transformers = { + -- the x_identity data types have already been checked at script time through validate_xxx + ["string"] = x_identity, + ["table"] = x_identity, + ["config"] = x_identity, + ["boolean"] = x_identity, + ["pass"] = x_pass, + ["source_list"] = x_source_list, + ["filter_table"] = x_filter_table, +} + +-- Create input data for the generator's DAG creation function based on the +-- blueprint passed in when the generator was registered. This is done here +-- centrally rather than in all the different node generators to reduce code +-- duplication and keep the generators miminal. If you need to do something +-- special, you can override create_input_data() in your subclass. +function _nodegen:create_input_data(env) + local decl = self.Decl + local data = {} + local deps = {} + + for name, detail in pairs(assert(self.Blueprint)) do + local val = decl[name] + if val then + local xform = decl_transformers[detail.Type] + data[name] = xform(self, name, detail, val, env, deps) + end + end + + return data, deps +end + +function get_pass(self, name) + if not name then + return nil + end + +end + +local pattern_cache = {} +local function get_cached_pattern(p) + local v = pattern_cache[p] + if not v then + local comp = '[%w_]+' + local sub_pattern = p:gsub('*', '[%%w_]+') + local platform, tool, variant, subvariant = unitgen.match_build_id(sub_pattern, comp) + v = string.format('^%s%%-%s%%-%s%%-%s$', platform, tool, variant, subvariant) + pattern_cache[p] = v + end + return v +end + +local function config_matches(pattern, build_id) + local ptype = type(pattern) + if ptype == "nil" then + return true + elseif ptype == "string" then + local fpattern = get_cached_pattern(pattern) + return build_id:match(fpattern) + elseif ptype == "table" then + for _, pattern_item in ipairs(pattern) do + if config_matches(pattern_item, build_id) then + return true + end + end + return false + else + error("bad 'Config' pattern type: " .. ptype) + end +end + +local function make_unit_env(unit) + -- Select an environment for this unit based on its SubConfig tag + -- to support cross compilation. + local env + local subconfig = unit.Decl.SubConfig or current.default_subconfig + if subconfig and current.base_envs then + env = current.base_envs[subconfig] + if Options.VeryVerbose then + if env then + printf("%s: using subconfig %s (%s)", unit.Decl.Name, subconfig, env:get('BUILD_ID')) + else + if current.default_subconfig then + errorf("%s: couldn't find a subconfig env", unit.Decl.Name) + else + printf("%s: no subconfig %s found; using default env", unit.Decl.Name, subconfig) + end + end + end + end + + if not env then + env = current.default_env + end + + return env:clone() +end + +local anon_count = 1 +function _nodegen:get_dag(parent_env) + local build_id = parent_env:get('BUILD_ID') + local dag = self.DagCache[build_id] + + if not dag then + if build_id:len() > 0 and not config_matches(self.Decl.Config, build_id) then + -- Unit has been filtered out via Config attribute. + -- Create a fresh dummy node for it. + local name + if not self.Decl.Name then + name = string.format("Dummy node %d", anon_count) + else + name = string.format("Dummy node %d for %s", anon_count, self.Decl.Name) + end + anon_count = anon_count + 1 + + dag = depgraph.make_node { + Env = parent_env, + Pass = resolve_pass(self.Decl.Pass), + Label = name, + } + else + local unit_env = make_unit_env(self) + + if self.Decl.Name then + unit_env:set('UNIT_PREFIX', '__' .. self.Decl.Name) + end + + -- Before accessing the unit's dependencies, resolve them via filtering. + local deps = resolve_dependencies(self.Decl, self.Decl.Depends, unit_env) + + self:configure_env(unit_env, deps) + self:customize_env(unit_env, self.Decl, deps) + + local input_data, input_deps = self:create_input_data(unit_env, parent_env) + -- Copy over dependencies which have been pre-resolved + input_data.Depends = deps + + for _, dep in util.nil_ipairs(deps) do + input_deps[#input_deps + 1] = dep:get_dag(parent_env) + end + + dag = self:create_dag(unit_env, input_data, input_deps, parent_env) + + if not dag then + error("create_dag didn't generate a result node") + end + end + self.DagCache[build_id] = dag + end + + return dag +end + +local _generator = { + Evaluators = {}, +} +_generator.__index = _generator + +local function new_generator(s) + s = s or {} + s.units = {} + return setmetatable(s, _generator) +end + +local function create_unit_map(state, raw_nodes) + -- Build name=>decl mapping + for _, unit in ipairs(raw_nodes) do + assert(unit.Decl) + local name = unit.Decl.Name + if name and type(name) == "string" then + if state.units[name] then + errorf("duplicate unit name: %s", name) + end + state.units[name] = unit + end + end +end + +function _generate_dag(args) + local envs = assert(args.Envs) + local raw_nodes = assert(args.Declarations) + + local state = new_generator { + base_envs = envs, + root_env = envs["__default"], -- the outmost config's env in a cross-compilation scenario + config = assert(args.Config), + variant = assert(args.Variant), + passes = assert(args.Passes), + } + + current = state + + create_unit_map(state, raw_nodes) + + local subconfigs = state.config.SubConfigs + + -- Pick a default environment which is used for + -- 1. Nodes without a SubConfig declaration + -- 2. Nodes with a missing SubConfig declaration + -- 3. All nodes if there are no SubConfigs set for the current config + if subconfigs then + state.default_subconfig = assert(state.config.DefaultSubConfig) + state.default_env = assert(envs[state.default_subconfig], "unknown DefaultSubConfig specified") + else + state.default_env = assert(envs["__default"]) + end + + + local always_lut = util.make_lookup_table(args.AlwaysNodes) + local default_lut = util.make_lookup_table(args.DefaultNodes) + + local always_nodes = util.map(args.AlwaysNodes, find_named_node) + local default_nodes = util.map(args.DefaultNodes, find_named_node) + + local named_nodes = {} + for name, _ in pairs(state.units) do + named_nodes[name] = find_named_node(name) + end + + current = nil + + return { always_nodes, default_nodes, named_nodes } +end + +function generate_dag(args) + local success, result = xpcall(function () return _generate_dag(args) end, buildfile.syntax_error_catcher) + + if success then + return result[1], result[2], result[3] + else + croak("%s", result) + end + +end + +function resolve_pass(name) + assert(current) + if name then + local p = current.passes[name] + if not p then + syntax_error("%q is not a valid pass name", name) + end + return p + else + return nil + end +end + +function get_target(data, suffix, prefix) + local target = data.Target + if not target then + assert(data.Name) + target = "$(OBJECTDIR)/" .. (prefix or "") .. data.Name .. (suffix or "") + end + return target +end + +function get_evaluator(name) + return _generator.Evaluators[name] +end + +function is_evaluator(name) + if _generator.Evaluators[name] then return true else return false end +end + +local common_blueprint = { + Propagate = { + Help = "Declarations to propagate to dependent units", + Type = "filter_table", + }, + Depends = { + Help = "Dependencies for this node", + Type = "table", -- handled specially + }, + Env = { + Help = "Data to append to the environment for the unit", + Type = "filter_table", + }, + ReplaceEnv = { + Help = "Data to replace in the environment for the unit", + Type = "filter_table", + }, + Pass = { + Help = "Specify build pass", + Type = "pass", + }, + SourceDir = { + Help = "Specify base directory for source files", + Type = "string", + }, + Config = { + Help = "Specify configuration this unit will build in", + Type = "config", + }, + SubConfig = { + Help = "Specify sub-configuration this unit will build in", + Type = "config", + }, + __DagNodes = { + Help = "Internal node to keep track of DAG nodes generated so far", + Type = "table", + } +} + +function create_eval_subclass(meta_tbl, base) + base = base or _nodegen + setmetatable(meta_tbl, base) + meta_tbl.__index = meta_tbl + return meta_tbl +end + +function add_evaluator(name, meta_tbl, blueprint) + assert(type(name) == "string") + assert(type(meta_tbl) == "table") + assert(type(blueprint) == "table") + + -- Set up this metatable as a subclass of _nodegen unless it is already + -- configured. + if not getmetatable(meta_tbl) then + setmetatable(meta_tbl, _nodegen) + meta_tbl.__index = meta_tbl + end + + -- Install common blueprint items. + for name, val in pairs(common_blueprint) do + if not blueprint[name] then + blueprint[name] = val + end + end + + -- Expand environment shortcuts into options. + for decl_key, env_key in util.nil_pairs(meta_tbl.DeclToEnvMappings) do + blueprint[decl_key] = { + Type = "filter_table", + Help = "Shortcut for environment key " .. env_key, + } + end + + for name, val in pairs(blueprint) do + local type_ = assert(val.Type) + if not validators[type_] then + errorf("unsupported blueprint type %q", type_) + end + + if val.Type == "source_list" and not val.ExtensionKey then + errorf("%s: source_list must provide ExtensionKey", name) + end + end + + -- Record blueprint for use when validating user constructs. + meta_tbl.Keyword = name + meta_tbl.Blueprint = blueprint + + -- Store this evaluator under the keyword that will trigger it. + _generator.Evaluators[name] = meta_tbl +end + +-- Called when processing build scripts, keywords is something previously +-- registered as an evaluator here. +function evaluate(eval_keyword, data) + local meta_tbl = assert(_generator.Evaluators[eval_keyword]) + + -- Give the evaluator change to fix up the data before we validate it. + data = meta_tbl:preprocess_data(data) + + local object = setmetatable({ + DagCache = {}, -- maps BUILD_ID -> dag node + Decl = data + }, meta_tbl) + + -- Expose the dag cache to the raw input data so the IDE generator can find it later + data.__DagNodes = object.DagCache + object.__index = object + + -- Validate data according to Blueprint settings + object:validate() + return object +end + +-- Given a list of strings or nested lists, flatten the structure to a single +-- list of strings while applying configuration filters. Configuration filters +-- match against the current build identifier like this: +-- +-- { "a", "b", { "nixfile1", "nixfile2"; Config = "unix-*-*" }, "bar", { "debugfile"; Config = "*-*-debug" }, } +-- +-- If 'exclusive' is set, then: +-- If 'build_id' is set, only values _with_ a 'Config' filter are included. +-- If 'build_id' is nil, only values _without_ a 'Config' filter are included. +function flatten_list(build_id, list, exclusive) + if not list then return nil end + local filter_defined = build_id ~= nil + + -- Helper function to apply filtering recursively and append results to an + -- accumulator table. + local function iter(node, accum, filtered) + local node_type = type(node) + if node_type == "table" and not getmetatable(node) then + if node.Config then filtered = true end + if not filter_defined or config_matches(node.Config, build_id) then + for _, item in ipairs(node) do + iter(item, accum, filtered) + end + end + elseif not exclusive or (filtered == filter_defined) then + accum[#accum + 1] = node + end + end + + local results = {} + iter(list, results, false) + return results +end + +-- Conceptually similar to flatten_list(), but retains table structure. +-- Use to keep source tables as they are passed in, to retain nested SourceDir attributes. +local empty_leaf = {} -- constant +function filter_structure(build_id, data, exclusive) + if type(data) == "table" then + if getmetatable(data) then + return data -- it's already a DAG node; use as-is + end + + local filtered = data.Config and true or false + + if not data.Config or config_matches(data.Config, build_id) then + local result = {} + for k, item in pairs(data) do + if type(k) == "number" then + -- Filter array elements. + result[#result + 1] = filter_structure(build_id, item, filtered) + elseif k ~= "Config" then + -- Copy key-value data through. + result[k] = item + end + end + return result + else + return empty_leaf + end + else + return data + end +end + +-- Processes an "Env" table. For each value, the corresponding variable in +-- 'env' is appended to if its "Config" filter matches 'build_id'. If +-- 'build_id' is nil, filtered values are skipped. +function append_filtered_env_vars(env, values_to_append, build_id, exclusive) + for key, val in util.pairs(values_to_append) do + if type(val) == "table" then + local list = flatten_list(build_id, val, exclusive) + for _, subvalue in ipairs(list) do + env:append(key, subvalue) + end + elseif not (exclusive and build_id) then + env:append(key, val) + end + end +end + +-- Like append_filtered_env_vars(), but replaces existing variables instead +-- of appending to them. +function replace_filtered_env_vars(env, values_to_replace, build_id, exclusive) + for key, val in util.pairs(values_to_replace) do + if type(val) == "table" then + local list = flatten_list(build_id, val, exclusive) + if #list > 0 then + env:replace(key, list) + end + elseif not (exclusive and build_id) then + env:replace(key, val) + end + end +end + +function generate_ide_files(config_tuples, default_names, raw_nodes, env, hints, ide_script) + local state = new_generator { default_env = env } + assert(state.default_env) + create_unit_map(state, raw_nodes) + local backend_fn = assert(ide_backend) + backend_fn(state, config_tuples, raw_nodes, env, default_names, hints, ide_script) +end + +function set_ide_backend(backend_fn) + ide_backend = backend_fn +end + +-- Expose the DefRule helper which is used to register builder syntax in a +-- simplified way. + +function _G.DefRule(ruledef) + local name = assert(ruledef.Name, "Missing Name string in DefRule") + local setup_fn = assert(ruledef.Setup, "Missing Setup function in DefRule " .. name) + local cmd = assert(ruledef.Command, "Missing Command string in DefRule " .. name) + local blueprint = assert(ruledef.Blueprint, "Missing Blueprint in DefRule " .. name) + local mt = create_eval_subclass {} + local annot = ruledef.Annotation + + if not annot then + annot = name .. " $(<)" + end + + local preproc = ruledef.Preprocess + + local function verify_table(v, tag) + if not v then + errorf("No %s returned from DefRule %s", tag, name) + end + + if type(v) ~= "table" then + errorf("%s returned from DefRule %s is not a table", tag, name) + end + end + + local function make_node(input_files, output_files, env, data, deps, scanner) + return depgraph.make_node { + Env = env, + Label = annot, + Action = cmd, + Pass = data.Pass or resolve_pass(ruledef.Pass), + InputFiles = input_files, + OutputFiles = output_files, + ImplicitInputs = ruledef.ImplicitInputs, + Scanner = scanner, + Dependencies = deps, + } + end + + if ruledef.ConfigInvariant then + local cache = {} + + function mt:create_dag(env, data, deps) + local setup_data = setup_fn(env, data) + local input_files = setup_data.InputFiles + local output_files = setup_data.OutputFiles + verify_table(input_files, "InputFiles") + verify_table(output_files, "OutputFiles") + + local mashup = { } + for _, input in util.nil_ipairs(input_files) do + mashup[#mashup + 1] = input + end + mashup[#mashup + 1] = "@@" + for _, output in util.nil_ipairs(output_files) do + mashup[#mashup + 1] = output + end + mashup[#mashup + 1] = "@@" + for _, implicit_input in util.nil_ipairs(setup_data.ImplicitInputs) do + mashup[#mashup + 1] = implicit_input + end + local key = native.digest_guid(table.concat(mashup, ';')) + + local key = util.tostring(key) + if cache[key] then + return cache[key] + else + local node = make_node(input_files, output_files, env, data, deps, setup_data.Scanner) + cache[key] = node + return node + end + end + else + function mt:create_dag(env, data, deps) + local setup_data = setup_fn(env, data) + verify_table(setup_data.InputFiles, "InputFiles") + verify_table(setup_data.OutputFiles, "OutputFiles") + return make_node(setup_data.InputFiles, setup_data.OutputFiles, env, data, deps, setup_data.Scanner) + end + end + + if preproc then + function mt:preprocess_data(raw_data) + return preproc(raw_data) + end + end + + add_evaluator(name, mt, blueprint) +end + +function _nodegen:preprocess_data(data) + return data +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/path.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/path.lua new file mode 100644 index 0000000..f5d7068 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/path.lua @@ -0,0 +1,50 @@ +module(..., package.seeall) + +local npath = require "tundra.native.path" + +split = npath.split +normalize = npath.normalize +join = npath.join +get_filename_dir = npath.get_filename_dir +get_filename = npath.get_filename +get_extension = npath.get_extension +drop_suffix = npath.drop_suffix +get_filename_base = npath.get_filename_base +is_absolute = npath.is_absolute + +function remove_prefix(prefix, fn) + if fn:find(prefix, 1, true) == 1 then + return fn:sub(#prefix + 1) + else + return fn + end +end + +function make_object_filename(env, src_fn, suffix) + local object_fn + + local src_suffix = get_extension(src_fn):sub(2) + + -- Drop leading $(OBJECTDIR)[/\\] in the input filename. + do + local pname = src_fn:match("^%$%(OBJECTDIR%)[/\\](.*)$") + if pname then + object_fn = pname + else + object_fn = src_fn + end + end + + -- Compute path under OBJECTDIR we want for the resulting object file. + -- Replace ".." with "dotdot" to avoid creating files outside the + -- object directory. Also salt the generated object name with the source + -- suffix, so that multiple source files with the same base name don't end + -- up clobbering each other (Tundra emits an error for this when checking + -- the DAG) + do + local relative_name = drop_suffix(object_fn:gsub("%.%.", "dotdot")) + object_fn = "$(OBJECTDIR)/$(UNIT_PREFIX)/" .. relative_name .. "__" .. src_suffix .. suffix + end + + return object_fn +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/platform.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/platform.lua new file mode 100644 index 0000000..402b79d --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/platform.lua @@ -0,0 +1,7 @@ +module(..., package.seeall) + +local native = require "tundra.native" + +function host_platform() + return native.host_platform +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/scanner.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/scanner.lua new file mode 100644 index 0000000..8750627 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/scanner.lua @@ -0,0 +1,57 @@ +module(..., package.seeall) + +local util = require "tundra.util" +local native = require "tundra.native" + +local _scanner_mt = {} +setmetatable(_scanner_mt, { __index = _scanner_mt }) + +local cpp_scanner_cache = {} +local generic_scanner_cache = {} + +function make_cpp_scanner(paths) + local key = table.concat(paths, '\0') + + if not cpp_scanner_cache[key] then + local data = { Kind = 'cpp', Paths = paths, Index = #cpp_scanner_cache } + cpp_scanner_cache[key] = setmetatable(data, _scanner_mt) + end + + return cpp_scanner_cache[key] +end + +function make_generic_scanner(data) + data.Kind = 'generic' + local mashup = { } + local function add_all(l) + for _, value in util.nil_ipairs(l) do + mashup[#mashup + 1] = value + end + end + add_all(data.Paths) + add_all(data.Keywords) + add_all(data.KeywordsNoFollow) + mashup[#mashup + 1] = '!!' + mashup[#mashup + 1] = data.RequireWhitespace and 'y' or 'n' + mashup[#mashup + 1] = data.UseSeparators and 'y' or 'n' + mashup[#mashup + 1] = data.BareMeansSystem and 'y' or 'n' + local key_str = table.concat(mashup, '\001') + local key = native.digest_guid(key_str) + local value = generic_scanner_cache[key] + if not value then + value = data + generic_scanner_cache[key] = data + end + return value +end + +function all_scanners() + local scanners = {} + for k, v in pairs(cpp_scanner_cache) do + scanners[v.Index + 1] = v + end + for k, v in pairs(generic_scanner_cache) do + scanners[v.Index + 1] = v + end + return scanners +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/selftest.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/selftest.lua new file mode 100644 index 0000000..f506f92 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/selftest.lua @@ -0,0 +1,37 @@ +module(..., package.seeall) + +local error_count = 0 + +function _G.unit_test(label, fn) + local t_mt = { + check_equal = function (obj, a, b) + if a ~= b then + error { Message = "Equality test failed: " .. tostring(a) .. " != " .. tostring(b) } + end + end + } + t_mt.__index = t_mt + + local t = setmetatable({}, t_mt) + local function stack_dumper(err_obj) + if type(err_obj) == "table" then + return err_obj.Message + end + local debug = require 'debug' + return debug.traceback(err_obj, 2) + end + + io.stdout:write("Testing ", label, ": ") + io.stdout:flush() + local ok, err = xpcall(function () fn(t) end, stack_dumper) + if not ok then + io.stdout:write("failed\n") + io.stdout:write(tostring(err), "\n") + error_count = error_count + 1 + else + io.stderr:write("OK\n") + end +end + +require "tundra.test.t_env" +require "tundra.test.t_path" diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/alias.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/alias.lua new file mode 100644 index 0000000..361c07a --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/alias.lua @@ -0,0 +1,40 @@ +-- alias.lua -- support for named aliases in the DAG + +module(..., package.seeall) + +local nodegen = require "tundra.nodegen" +local depgraph = require "tundra.depgraph" +local util = require "tundra.util" + +local _alias_mt = nodegen.create_eval_subclass {} + +function _alias_mt:create_dag(env, data, input_deps) + + local deps = util.clone_table(input_deps) + + for _, dep in util.nil_ipairs(data.Depends) do + deps[#deps+1] = dep:get_dag(env:get_parent()) + end + + local dag = depgraph.make_node { + Env = env, + Label = "Named alias " .. data.Name .. " for " .. env:get('BUILD_ID'), + Pass = data.Pass, + Dependencies = deps, + } + + -- Remember this dag node for IDE file generation purposes + data.__DagNode = dag + + return dag +end + +local alias_blueprint = { + Name = { + Required = true, + Help = "Set alias name", + Type = "string", + }, +} + +nodegen.add_evaluator("Alias", _alias_mt, alias_blueprint) diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/bison.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/bison.lua new file mode 100644 index 0000000..a1bcd3c --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/bison.lua @@ -0,0 +1,42 @@ +module(..., package.seeall) + +local nodegen = require "tundra.nodegen" +local path = require "tundra.path" +local depgraph = require "tundra.depgraph" + +local _bison_mt = nodegen.create_eval_subclass {} + +local bison_blueprint = { + Source = { Required = true, Type = "string" }, + OutputFile = { Required = false, Type = "string" }, + TokenDefines = { Required = false, Type = "boolean" }, +} + +function _bison_mt:create_dag(env, data, deps) + local src = data.Source + local out_src + if data.OutputFile then + out_src = "$(OBJECTDIR)$(SEP)" .. data.OutputFile + else + local targetbase = "$(OBJECTDIR)$(SEP)bisongen_" .. path.get_filename_base(src) + out_src = targetbase .. ".c" + end + local defopt = "" + local outputs = { out_src } + if data.TokenDefines then + local out_hdr = path.drop_suffix(out_src) .. ".h" + defopt = "--defines=" .. out_hdr + outputs[#outputs + 1] = out_hdr + end + return depgraph.make_node { + Env = env, + Pass = data.Pass, + Label = "Bison $(@)", + Action = "$(BISON) $(BISONOPT) " .. defopt .. " --output-file=$(@:[1]) $(<)", + InputFiles = { src }, + OutputFiles = outputs, + Dependencies = deps, + } +end + +nodegen.add_evaluator("Bison", _bison_mt, bison_blueprint) diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/dotnet.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/dotnet.lua new file mode 100644 index 0000000..eef4722 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/dotnet.lua @@ -0,0 +1,117 @@ +module(..., package.seeall) + +local util = require "tundra.util" +local nodegen = require "tundra.nodegen" +local depgraph = require "tundra.depgraph" + +local _csbase_mt = nodegen.create_eval_subclass { + DeclToEnvMappings = { + References = "CSLIBS", + RefPaths = "CSLIBPATH", + }, +} + +local _csexe_mt = nodegen.create_eval_subclass({ + Label = "CSharpExe $(@)", + Suffix = "$(CSPROGSUFFIX)", + Action = "$(CSCEXECOM)" +}, _csbase_mt) + +local _cslib_mt = nodegen.create_eval_subclass({ + Label = "CSharpLib $(@)", + Suffix = "$(CSLIBSUFFIX)", + Action = "$(CSCLIBCOM)" +}, _csbase_mt) + + +local csSourceExts = { ".cs" } +local csResXExts = { ".resx" } + +local function setup_refs_from_dependencies(env, dep_nodes, deps) + local dll_exts = { env:interpolate("$(CSLIBSUFFIX)") } + local refs = {} + local parent_env = env:get_parent() + for _, x in util.nil_ipairs(dep_nodes) do + if x.Keyword == "CSharpLib" then + local outputs = {} + local dag = x:get_dag(parent_env) + deps[#deps + 1] = dag + dag:insert_output_files(refs, dll_exts) + end + end + for _, r in ipairs(refs) do + env:append("CSLIBS", r) + end +end + +local function setup_resources(generator, env, assembly_name, resx_files, pass) + local result_files = {} + local deps = {} + local i = 1 + for _, resx in util.nil_ipairs(resx_files) do + local basename = path.get_filename_base(resx) + local result_file = string.format("$(OBJECTDIR)/_rescompile/%s.%s.resources", assembly_name, basename) + result_files[i] = result_file + deps[i] = depgraph.make_node { + Env = env, + Pass = pass, + Label = "resgen $(@)", + Action = "$(CSRESGEN)", + InputFiles = { resx }, + OutputFiles = { result_file }, + } + env:append("CSRESOURCES", result_file) + i = i + 1 + end + return result_files, deps +end + +function _csbase_mt:create_dag(env, data, deps) + local sources = data.Sources + local resources = data.Resources or {} + for _, r in util.nil_ipairs(resources) do + env:append("CSRESOURCES", r) + end + + sources = util.merge_arrays_2(sources, resources) + + setup_refs_from_dependencies(env, data.Depends, deps) + + return depgraph.make_node { + Env = env, + Pass = data.Pass, + Label = self.Label, + Action = self.Action, + InputFiles = sources, + OutputFiles = { nodegen.get_target(data, self.Suffix, self.Prefix) }, + Dependencies = util.uniq(deps), + } +end + +do + local csblueprint = { + Name = { + Required = true, + Help = "Set output (base) filename", + Type = "string", + }, + Sources = { + Required = true, + Help = "List of source files", + Type = "source_list", + ExtensionKey = "DOTNET_SUFFIXES", + }, + Resources = { + Help = "List of resource files", + Type = "source_list", + ExtensionKey = "DOTNET_SUFFIXES_RESOURCE", + }, + Target = { + Help = "Override target location", + Type = "string", + }, + } + + nodegen.add_evaluator("CSharpExe", _csexe_mt, csblueprint) + nodegen.add_evaluator("CSharpLib", _cslib_mt, csblueprint) +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/embed_lua.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/embed_lua.lua new file mode 100644 index 0000000..9bc49c6 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/embed_lua.lua @@ -0,0 +1,65 @@ +module(..., package.seeall) + +local util = require "tundra.util" +local path = require "tundra.path" +local glob = require "tundra.syntax.glob" +local nodegen = require "tundra.nodegen" +local depgraph = require "tundra.depgraph" + +local lua_exts = { ".lua" } +local luac_mt_ = nodegen.create_eval_subclass {} + +local function luac(env, src, pass) + local target = "$(OBJECTDIR)/" .. path.drop_suffix(src) .. ".luac" + return target, depgraph.make_node { + Env = env, + Pass = pass, + Label = "LuaC $(@)", + Action = "$(LUAC) -o $(@) -- $(<)", + InputFiles = { src }, + OutputFiles = { target }, + ImplicitInputs = { "$(LUAC)" }, + } +end + +function luac_mt_:create_dag(env, data, deps) + local files = {} + local deps = {} + local inputs = {} + local action_fragments = {} + + for _, base_dir in ipairs(data.Dirs) do + local lua_files = glob.Glob { Dir = base_dir, Extensions = lua_exts } + local dir_len = base_dir:len() + for _, filename in pairs(lua_files) do + local rel_name = filename:sub(dir_len+2) + local pkg_name = rel_name:gsub("[/\\]", "."):gsub("%.lua$", "") + inputs[#inputs + 1] = filename + if env:get("LUA_EMBED_ASCII", "no") == "no" then + files[#files + 1], deps[#deps + 1] = luac(env, filename, data.Pass) + else + files[#files + 1] = filename + end + action_fragments[#action_fragments + 1] = pkg_name + action_fragments[#action_fragments + 1] = files[#files] + end + end + + return depgraph.make_node { + Env = env, + Label = "EmbedLuaSources $(@)", + Pass = data.Pass, + Action = "$(GEN_LUA_DATA) " .. table.concat(action_fragments, " ") .. " > $(@)", + InputFiles = inputs, + OutputFiles = { "$(OBJECTDIR)/" .. data.OutputFile }, + Dependencies = deps, + ImplicitInputs = { "$(GEN_LUA_DATA)" }, + } +end + +local blueprint = { + Dirs = { Type = "table", Required = "true" }, + OutputFile = { Type = "string", Required = "true" }, +} + +nodegen.add_evaluator("EmbedLuaSources", luac_mt_, blueprint) diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/files.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/files.lua new file mode 100644 index 0000000..05cdb40 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/files.lua @@ -0,0 +1,50 @@ +module(..., package.seeall) + +local decl = require "tundra.decl" +local depgraph = require "tundra.depgraph" + +local common_blueprint = { + Source = { + Required = true, + Help = "Source filename", + Type = "string", + }, + Target = { + Required = true, + Help = "Target filename", + Type = "string", + }, +} + +local function def_copy_rule(name, command, cfg_invariant) + DefRule { + Name = name, + ConfigInvariant = cfg_invariant, + Blueprint = common_blueprint, + Command = command, + Setup = function (env, data) + return { + InputFiles = { data.Source }, + OutputFiles = { data.Target }, + } + end, + } +end + +def_copy_rule('CopyFile', '$(_COPY_FILE)') +def_copy_rule('CopyFileInvariant', '$(_COPY_FILE)', true) +def_copy_rule('HardLinkFile', '$(_HARDLINK_FILE)') +def_copy_rule('HardLinkFileInvariant', '$(_HARDLINK_FILE)', true) + + +function hardlink_file(env, src, dst, pass, deps) + return depgraph.make_node { + Env = env, + Annotation = "HardLink $(<)", + Action = "$(_HARDLINK_FILE)", + InputFiles = { src }, + OutputFiles = { dst }, + Dependencies = deps, + Pass = pass, + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/flex.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/flex.lua new file mode 100644 index 0000000..6e796a9 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/flex.lua @@ -0,0 +1,28 @@ +-- flex.lua - Support for FLEX + +module(..., package.seeall) + +local path = require "tundra.path" + +DefRule { + Name = "Flex", + Command = "flex --outfile=$(@:[1]) --header-file=$(@:[2]) $(<)", + ConfigInvariant = true, + + Blueprint = { + Source = { Required = true, Type = "string" }, + OutputCFile = { Required = false, Type = "string" }, + OutputHeaderFile = { Required = false, Type = "string" }, + }, + + Setup = function (env, data) + local src = data.Source + local base_name = path.drop_suffix(src) + local gen_c = data.OutputCFile or (base_name .. '.c') + local gen_h = data.OutputHeaderFileFile or (base_name .. '.h') + return { + InputFiles = { src }, + OutputFiles = { gen_c, gen_h }, + } + end, +} diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/glob.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/glob.lua new file mode 100644 index 0000000..02a623f --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/glob.lua @@ -0,0 +1,122 @@ +-- glob.lua - Glob syntax elements for declarative tundra.lua usage + +module(..., package.seeall) + +local util = require "tundra.util" +local path = require "tundra.path" +local decl = require "tundra.decl" +local dirwalk = require "tundra.dirwalk" + +local ignored_dirs = util.make_lookup_table { ".git", ".svn", "CVS" } + +local function glob(directory, recursive, filter_fn) + local result = {} + + local function dir_filter(dir_name) + if not recursive or ignored_dirs[dir_name] then + return false + end + return true + end + + for _, path in ipairs(dirwalk.walk(directory, dir_filter)) do + if filter_fn(path) then + result[#result + 1] = path + end + end + return result +end + +-- Glob syntax - Search for source files matching extension list +-- +-- Synopsis: +-- Glob { +-- Dir = "...", +-- Extensions = { ".ext", ... }, +-- [Recursive = false,] +-- } +-- +-- Options: +-- Dir = "directory" (required) +-- - Base directory to search in +-- +-- Extensions = { ".ext1", ".ext2" } (required) +-- - List of file extensions to include +-- +-- Recursive = boolean (optional, default: true) +-- - Specified whether to recurse into subdirectories +function Glob(args) + local recursive = args.Recursive + if type(recursive) == "nil" then + recursive = true + end + if not args.Extensions then + croak("no 'Extensions' specified in Glob (Dir is '%s')", args.Dir) + end + local extensions = assert(args.Extensions) + local ext_lookup = util.make_lookup_table(extensions) + return glob(args.Dir, recursive, function (fn) + local ext = path.get_extension(fn) + return ext_lookup[ext] + end) +end + +-- FGlob syntax - Search for source files matching extension list with +-- configuration filtering +-- +-- Usage: +-- FGlob { +-- Dir = "...", +-- Extensions = { ".ext", .... }, +-- Filters = { +-- { Pattern = "/[Ww]in32/", Config = "win32-*-*" }, +-- { Pattern = "/[Dd]ebug/", Config = "*-*-debug" }, +-- ... +-- }, +-- [Recursive = false], +-- } +local function FGlob(args) + -- Use the regular glob to fetch the file list. + local files = Glob(args) + local pats = {} + local result = {} + + -- Construct a mapping from { Pattern = ..., Config = ... } + -- to { Pattern = { Config = ... } } with new arrays per config that can be + -- embedded in the source result. + for _, fitem in ipairs(args.Filters) do + if not fitem.Config then + croak("no 'Config' specified in FGlob (Pattern is '%s')", fitem.Pattern) + end + local tab = { Config = assert(fitem.Config) } + pats[assert(fitem.Pattern)] = tab + result[#result + 1] = tab + end + + -- Traverse all files and see if they match any configuration filters. If + -- they do, stick them in matching list. Otherwise, just keep them in the + -- main list. This has the effect of returning an array such as this: + -- { + -- { "foo.c"; Config = "abc-*-*" }, + -- { "bar.c"; Config = "*-*-def" }, + -- "baz.c", "qux.m" + -- } + for _, f in ipairs(files) do + local filtered = false + for filter, list in pairs(pats) do + if f:match(filter) then + filtered = true + list[#list + 1] = f + break + end + end + if not filtered then + result[#result + 1] = f + end + end + return result +end + +decl.add_function("Glob", Glob) +decl.add_function("FGlob", FGlob) + diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/install.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/install.lua new file mode 100644 index 0000000..c8dedcd --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/install.lua @@ -0,0 +1,40 @@ +-- install.lua - Express file copying in unit form. + +module(..., package.seeall) + +local nodegen = require "tundra.nodegen" +local files = require "tundra.syntax.files" +local path = require "tundra.path" +local util = require "tundra.util" +local depgraph = require "tundra.depgraph" + +local _mt = nodegen.create_eval_subclass {} + +local blueprint = { + Sources = { Type = "source_list", Required = true }, + TargetDir = { Type = "string", Required = true }, +} + +function _mt:create_dag(env, data, deps) + local my_pass = data.Pass + local sources = data.Sources + local target_dir = data.TargetDir + + local copies = {} + + -- all the copy operations will depend on all the incoming deps + for _, src in util.nil_ipairs(sources) do + local base_fn = select(2, path.split(src)) + local target = target_dir .. '/' .. base_fn + copies[#copies + 1] = files.copy_file(env, src, target, my_pass, deps) + end + + return depgraph.make_node { + Env = env, + Label = "Install group for " .. decl.Name, + Pass = my_pass, + Dependencies = copies + } +end + +nodegen.add_evaluator("Install", _mt, blueprint) diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/ispc.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/ispc.lua new file mode 100644 index 0000000..5c212b8 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/ispc.lua @@ -0,0 +1,25 @@ +-- ispc.lua - Support for Intel SPMD Program Compiler + +module(..., package.seeall) + +local path = require "tundra.path" + +DefRule { + Name = "ISPC", + Command = "$(ISPCCOM)", + + Blueprint = { + Source = { Required = true, Type = "string" }, + }, + + Setup = function (env, data) + local src = data.Source + local base_name = path.drop_suffix(src) + local objFile = "$(OBJECTDIR)$(SEP)" .. base_name .. "__" .. path.get_extension(src):sub(2) .. "$(OBJECTSUFFIX)" + local hFile = "$(OBJECTDIR)$(SEP)" .. base_name .. "_ispc.h" + return { + InputFiles = { src }, + OutputFiles = { objFile, hFile }, + } + end, +} diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/lemon.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/lemon.lua new file mode 100644 index 0000000..4cf173f --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/lemon.lua @@ -0,0 +1,27 @@ +-- lemon.lua - Support for the Lemon parser generator + +module(..., package.seeall) + +local path = require "tundra.path" + +DefRule { + Name = "Lemon", + Command = "lemon $(<)", + ConfigInvariant = true, + + Blueprint = { + Source = { Required = true, Type = "string" }, + }, + + Setup = function (env, data) + local src = data.Source + local base_name = path.drop_suffix(src) + local gen_c = base_name .. '.c' + local gen_h = base_name .. '.h' + local gen_out = base_name .. '.out' + return { + InputFiles = { src }, + OutputFiles = { gen_c, gen_h, gen_out }, + } + end, +} diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/native.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/native.lua new file mode 100644 index 0000000..e57c65c --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/native.lua @@ -0,0 +1,312 @@ +-- native.lua -- support for programs, static libraries and such + +module(..., package.seeall) + +local util = require "tundra.util" +local nodegen = require "tundra.nodegen" +local path = require "tundra.path" +local depgraph = require "tundra.depgraph" + +local _native_mt = nodegen.create_eval_subclass { + DeclToEnvMappings = { + Libs = "LIBS", + Defines = "CPPDEFS", + Includes = "CPPPATH", + Frameworks = "FRAMEWORKS", + LibPaths = "LIBPATH", + }, +} + +local _object_mt = nodegen.create_eval_subclass({ + Suffix = "$(OBJECTSUFFIX)", + Prefix = "", + Action = "$(OBJCOM)", + Label = "Object $(<)", + OverwriteOutputs = true, +}, _native_mt) + +local _program_mt = nodegen.create_eval_subclass({ + Suffix = "$(PROGSUFFIX)", + Prefix = "$(PROGPREFIX)", + Action = "$(PROGCOM)", + Label = "Program $(@)", + PreciousOutputs = true, + OverwriteOutputs = true, + Expensive = true, +}, _native_mt) + +local _staticlib_mt = nodegen.create_eval_subclass({ + Suffix = "$(LIBSUFFIX)", + Prefix = "$(LIBPREFIX)", + Action = "$(LIBCOM)", + Label = "StaticLibrary $(@)", + -- Play it safe and delete the output files of this node before re-running it. + -- Solves iterative issues with e.g. AR + OverwriteOutputs = false, + IsStaticLib = true, +}, _native_mt) + +local _objgroup_mt = nodegen.create_eval_subclass({ + Label = "ObjGroup $(<)", +}, _native_mt) + +local _shlib_mt = nodegen.create_eval_subclass({ + Suffix = "$(SHLIBSUFFIX)", + Prefix = "$(SHLIBPREFIX)", + Action = "$(SHLIBCOM)", + Label = "SharedLibrary $(@)", + PreciousOutputs = true, + OverwriteOutputs = true, + Expensive = true, +}, _native_mt) + +local _extlib_mt = nodegen.create_eval_subclass({ + Suffix = "", + Prefix = "", + Label = "", +}, _native_mt) + +local cpp_exts = util.make_lookup_table { ".cpp", ".cc", ".cxx", ".C" } + +local _is_native_mt = util.make_lookup_table { _object_mt, _program_mt, _staticlib_mt, _shlib_mt, _extlib_mt, _objgroup_mt } + +function _native_mt:customize_env(env, raw_data) + if env:get('GENERATE_PDB', '0') ~= '0' then + -- Figure out the final linked PDB (the one next to the dll or exe) + if raw_data.Target then + local target = env:interpolate(raw_data.Target) + local link_pdb = path.drop_suffix(target) .. '.pdb' + env:set('_PDB_LINK_FILE', link_pdb) + else + env:set('_PDB_LINK_FILE', "$(OBJECTDIR)/" .. raw_data.Name .. ".pdb") + end + -- Keep the compiler's idea of the PDB file separate + env:set('_PDB_CC_FILE', "$(OBJECTDIR)/" .. raw_data.Name .. "_ccpdb.pdb") + env:set('_USE_PDB_CC', '$(_USE_PDB_CC_OPT)') + env:set('_USE_PDB_LINK', '$(_USE_PDB_LINK_OPT)') + end + + local pch = raw_data.PrecompiledHeader + + if pch and env:get('_PCH_SUPPORTED', '0') ~= '0' then + assert(pch.Header) + if not nodegen.resolve_pass(pch.Pass) then + croak("%s: PrecompiledHeader requires a valid Pass", raw_data.Name) + end + env:set('_PCH_FILE', "$(OBJECTDIR)/" .. raw_data.Name .. ".pch") + env:set('_USE_PCH', '$(_USE_PCH_OPT)') + env:set('_PCH_SOURCE', path.normalize(pch.Source)) + env:set('_PCH_HEADER', pch.Header) + env:set('_PCH_PASS', pch.Pass) + if cpp_exts[path.get_extension(pch.Source)] then + env:set('PCHCOMPILE', '$(PCHCOMPILE_CXX)') + else + env:set('PCHCOMPILE', '$(PCHCOMPILE_CC)') + end + local pch_source = path.remove_prefix(raw_data.SourceDir or '', pch.Source) + if not util.array_contains(raw_data.Sources, pch_source) then + raw_data.Sources[#raw_data.Sources + 1] = pch_source + end + end + + if env:has_key('MODDEF') then + env:set('_USE_MODDEF', '$(_USE_MODDEF_OPT)') + end +end + +function _native_mt:create_dag(env, data, input_deps) + + local build_id = env:get("BUILD_ID") + local my_pass = data.Pass + local sources = data.Sources + local libsuffix = { env:get("LIBSUFFIX") } + local shlibsuffix = { env:get("SHLIBLINKSUFFIX") } + local my_extra_deps = {} + + -- Link with libraries in dependencies. + for _, dep in util.nil_ipairs(data.Depends) do + + if dep.Keyword == "SharedLibrary" then + -- On Win32 toolsets, we need foo.lib + -- On UNIX toolsets, we need -lfoo + -- + -- We only want to add this if the node actually produced any output (i.e + -- it's not completely filtered out.) + local node = dep:get_dag(env:get_parent()) + if #node.outputs > 0 then + my_extra_deps[#my_extra_deps + 1] = node + local target = dep.Decl.Target or dep.Decl.Name + target = target .. "$(SHLIBLINKSUFFIX)" + env:append('LIBS', target) + end + elseif dep.Keyword == "StaticLibrary" then + local node = dep:get_dag(env:get_parent()) + my_extra_deps[#my_extra_deps + 1] = node + if not self.IsStaticLib then + node:insert_output_files(sources, libsuffix) + end + elseif dep.Keyword == "ObjGroup" then + -- We want all .obj files + local objsuffix = { env:get("OBJECTSUFFIX") } + + -- And also .res files, if we know what that is + if env:has_key("W32RESSUFFIX") then + objsuffix[#objsuffix + 1] = env:get("W32RESSUFFIX") + end + + local node = dep:get_dag(env:get_parent()) + my_extra_deps[#my_extra_deps + 1] = node + if not sources then sources = {} end + for _, dep in util.nil_ipairs(node.deps) do + my_extra_deps[#my_extra_deps + 1] = dep + dep:insert_output_files(sources, objsuffix) + end + else + + --[[ + + A note about win32 import libraries: + + It is tempting to add an implicit input dependency on the import + library of the linked-to shared library here; but this would be + suboptimal: + + 1. Because there is a dependency between the nodes themselves, + the import library generation will always run before this link + step is run. Therefore, the import lib will always exist and be + updated before this link step runs. + + 2. Because the import library is regenerated whenever the DLL is + relinked we would have to custom-sign it (using a hash of the + DLLs export list) to avoid relinking the executable all the + time when only the DLL's internals change. + + 3. The DLL's export list should be available in headers anyway, + which is already covered in the compilation of the object files + that actually uses those APIs. + + Therefore the best way right now is to not tell Tundra about the + import lib at all and rely on header scanning to pick up API + changes. + + An implicit input dependency would be needed however if someone + is doing funky things with their import library (adding + non-linker-generated code for example). These cases are so rare + that we can safely put them off. + + ]]-- + end + end + + -- Make sure sources are not specified more than once. This can happen when + -- there are recursive dependencies on object groups. + if data.Sources and #data.Sources > 0 then + data.Sources = util.uniq(data.Sources) + end + + local aux_outputs = env:get_list("AUX_FILES_" .. self.Keyword:upper(), {}) + + if env:get('GENERATE_PDB', '0') ~= '0' then + aux_outputs[#aux_outputs + 1] = "$(_PDB_LINK_FILE)" + aux_outputs[#aux_outputs + 1] = "$(_PDB_CC_FILE)" + end + + local extra_inputs = {} + + if env:has_key('MODDEF') then + extra_inputs[#extra_inputs + 1] = "$(MODDEF)" + end + + local targets = nil + + if self.Action then + targets = { nodegen.get_target(data, self.Suffix, self.Prefix) } + end + + local deps = util.merge_arrays(input_deps, my_extra_deps) + + local dag = depgraph.make_node { + Env = env, + Label = self.Label, + Pass = data.Pass, + Action = self.Action, + PreAction = data.PreAction, + InputFiles = data.Sources, + InputFilesUntracked = data.UntrackedSources, + OutputFiles = targets, + AuxOutputFiles = aux_outputs, + ImplicitInputs = extra_inputs, + Dependencies = deps, + OverwriteOutputs = self.OverwriteOutputs, + PreciousOutputs = self.PreciousOutputs, + Expensive = self.Expensive, + } + + -- Remember this dag node for IDE file generation purposes + data.__DagNode = dag + + return dag +end + +local native_blueprint = { + Name = { + Required = true, + Help = "Set output (base) filename", + Type = "string", + }, + Sources = { + Required = true, + Help = "List of source files", + Type = "source_list", + ExtensionKey = "NATIVE_SUFFIXES", + }, + UntrackedSources = { + Help = "List of input files that are not tracked", + Type = "source_list", + ExtensionKey = "NATIVE_SUFFIXES", + }, + Target = { + Help = "Override target location", + Type = "string", + }, + PreAction = { + Help = "Optional action to run before main action.", + Type = "string", + }, + PrecompiledHeader = { + Help = "Enable precompiled header (if supported)", + Type = "table", + }, + IdeGenerationHints = { + Help = "Data to support control IDE file generation", + Type = "table", + }, +} + +local external_blueprint = { + Name = { + Required = true, + Help = "Set name of the external library", + Type = "string", + }, +} + +local external_counter = 1 + +function _extlib_mt:create_dag(env, data, input_deps) + local name = string.format("dummy node for %s (%d)", data.Name, external_counter) + external_counter = external_counter + 1 + return depgraph.make_node { + Env = env, + Label = name, + Pass = data.Pass, + Dependencies = input_deps, + } +end + +nodegen.add_evaluator("Object", _object_mt, native_blueprint) +nodegen.add_evaluator("Program", _program_mt, native_blueprint) +nodegen.add_evaluator("StaticLibrary", _staticlib_mt, native_blueprint) +nodegen.add_evaluator("SharedLibrary", _shlib_mt, native_blueprint) +nodegen.add_evaluator("ExternalLibrary", _extlib_mt, external_blueprint) +nodegen.add_evaluator("ObjGroup", _objgroup_mt, native_blueprint) diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/osx-bundle.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/osx-bundle.lua new file mode 100644 index 0000000..db1e052 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/osx-bundle.lua @@ -0,0 +1,93 @@ +-- osx-bundle.lua - Support for Max OS X bundles + +module(..., package.seeall) + +local nodegen = require "tundra.nodegen" +local files = require "tundra.syntax.files" +local path = require "tundra.path" +local util = require "tundra.util" +local depgraph = require "tundra.depgraph" + +_osx_bundle_mt = nodegen.create_eval_subclass { } +_compile_nib_mt = nodegen.create_eval_subclass { } + +function _osx_bundle_mt:create_dag(env, data, deps) + local bundle_dir = data.Target + local pass = data.Pass + local contents = bundle_dir .. "/Contents" + local copy_deps = {} + + local infoplist = data.InfoPList + copy_deps[#copy_deps+1] = files.hardlink_file(env, data.InfoPList, contents .. "/Info.plist", pass, deps) + + if data.PkgInfo then + copy_deps[#copy_deps+1] = files.hardlink_file(env, data.PkgInfo, contents .. "/PkgInfo", pass, deps) + end + + if data.Executable then + local basename = select(2, path.split(data.Executable)) + copy_deps[#copy_deps+1] = files.hardlink_file(env, data.Executable, contents .. "/MacOS/" .. basename, pass, deps) + end + + local dirs = { + { Tag = "Resources", Dir = contents .. "/Resources/" }, + { Tag = "MacOSFiles", Dir = contents .. "/MacOS/" }, + } + + for _, params in ipairs(dirs) do + local function do_copy(fn) + local basename = select(2, path.split(fn)) + copy_deps[#copy_deps+1] = files.hardlink_file(env, fn, params.Dir .. basename, pass, deps) + end + + local items = data[params.Tag] + for _, dep in util.nil_ipairs(nodegen.flatten_list(env:get('BUILD_ID'), items)) do + if type(dep) == "string" then + do_copy(dep) + else + local node = dep:get_dag(env) + print(node) + deps[#deps+1] = node + local files = {} + node:insert_output_files(files) + for _, fn in ipairs(files) do + do_copy(fn) + end + end + end + end + + return depgraph.make_node { + Env = env, + Pass = pass, + Label = "OsxBundle " .. data.Target, + Dependencies = util.merge_arrays_2(deps, copy_deps), + } +end + +function _compile_nib_mt:create_dag(env, data, deps) + return depgraph.make_node { + Env = env, + Pass = data.Pass, + Label = "CompileNib $(@)", + Action = "$(NIBCC)", + Dependencies = deps, + InputFiles = { data.Source }, + OutputFiles = { "$(OBJECTDIR)/" .. data.Target }, + } +end + +nodegen.add_evaluator("OsxBundle", _osx_bundle_mt, { + Target = { Type = "string", Required = true, Help = "Target .app directory name" }, + Executable = { Type = "string", Help = "Executable to embed" }, + InfoPList = { Type = "string", Required = true, Help = "Info.plist file" }, + PkgInfo = { Type = "string", Help = "PkgInfo file" }, + Resources = { Type = "filter_table", Help = "Files to copy to 'Resources'" }, + MacOSFiles = { Type = "filter_table", Help = "Files to copy to 'MacOS'" }, +}) + +nodegen.add_evaluator("CompileNib", _compile_nib_mt, { + Source = { Type = "string", Required = true }, + Target = { Type = "string", Required = true }, +}) + diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/pkgconfig.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/pkgconfig.lua new file mode 100644 index 0000000..485291c --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/pkgconfig.lua @@ -0,0 +1,51 @@ +module(..., package.seeall) + +function ConfigureRaw(cmdline, name, constructor) + local fh = assert(io.popen(cmdline)) + local data = fh:read("*all") + fh:close() + + local cpppath = {} + local libpath = {} + local libs = {} + local defines = {} + local frameworks = {} + + for kind, value in data:gmatch("-([ILlD])([^ \n\r]+)") do + if kind == "I" then + cpppath[#cpppath + 1] = value + elseif kind == "D" then + defines[#defines + 1] = value + elseif kind == "L" then + libpath[#libpath + 1] = value + elseif kind == "l" then + libs[#libs + 1] = value + end + end + + for value in data:gmatch("-framework ([^ \n\r]+)") do + frameworks[#frameworks + 1] = value + end + + -- We don't have access to ExternalLibrary here - user has to pass it in. + return constructor({ + Name = name, + Propagate = { + Env = { + FRAMEWORKS = frameworks, + CPPDEFS = defines, + CPPPATH = cpppath, + LIBS = libs, + LIBPATH = libpath + } + } + }) +end + +function Configure(name, ctor) + return internal_cfg("pkg-config " .. name .. " --cflags --libs", name, ctor) +end + +function ConfigureWithTool(tool, name, ctor) + return internal_cfg(tool .. " --cflags --libs", name, ctor) +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/testsupport.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/testsupport.lua new file mode 100644 index 0000000..d79dd0f --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/syntax/testsupport.lua @@ -0,0 +1,29 @@ +-- testsupport.lua: A simple UpperCaseFile unit used for Tundra's test harness + +module(..., package.seeall) + +local util = require 'tundra.util' +local nodegen = require 'tundra.nodegen' +local depgraph = require 'tundra.depgraph' + +local mt = nodegen.create_eval_subclass {} + +function mt:create_dag(env, data, deps) + return depgraph.make_node { + Env = env, + Pass = data.Pass, + Label = "UpperCaseFile \$(@)", + Action = "tr a-z A-Z < \$(<) > \$(@)", + InputFiles = { data.InputFile }, + OutputFiles = { data.OutputFile }, + Dependencies = deps, + } +end + +nodegen.add_evaluator("UpperCaseFile", mt, { + Name = { Type = "string", Required = "true" }, + InputFile = { Type = "string", Required = "true" }, + OutputFile = { Type = "string", Required = "true" }, +}) + + diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/test/t_env.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/test/t_env.lua new file mode 100644 index 0000000..1209e91 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/test/t_env.lua @@ -0,0 +1,62 @@ + +module(..., package.seeall) + +unit_test('scalar interpolation', function (t) + local e = require 'tundra.environment' + local e1, e2, e3 + e1 = e.create(nil, { Foo="Foo", Baz="Strut" }) + e2 = e1:clone({ Foo="Bar" }) + e3 = e1:clone({ Baz="c++" }) + + t:check_equal(e1:get("Foo"), "Foo") + t:check_equal(e1:get("Baz"), "Strut") + t:check_equal(e2:get("Foo"), "Bar") + t:check_equal(e2:get("Baz"), "Strut") + t:check_equal(e3:get("Fransos", "Ost"), "Ost") + + e1:set("Foo", "Foo") + t:check_equal(e1:interpolate("$(Foo)"), "Foo") + t:check_equal(e1:interpolate("$(Foo:u)"), "FOO") + t:check_equal(e1:interpolate("$(Foo:l)"), "foo") + + t:check_equal(e1:interpolate("$(Foo) $(Baz)"), "Foo Strut") + t:check_equal(e2:interpolate("$(Foo) $(Baz)"), "Bar Strut") + t:check_equal(e3:interpolate("$(Foo) $(Baz)"), "Foo c++") + t:check_equal(e1:interpolate("a $(<)", { ['<'] = "foo" }), "a foo") + + e1:set("FILE", "foo/bar.txt") + t:check_equal(e1:interpolate("$(FILE:B)"), "foo/bar") + t:check_equal(e1:interpolate("$(FILE:F)"), "bar.txt") + t:check_equal(e1:interpolate("$(FILE:D)"), "foo") +end) + +unit_test('list interpolation', function (t) + local e = require 'tundra.environment' + local e1 = e.create() + + e1:set("Foo", { "Foo" }) + t:check_equal(e1:interpolate("$(Foo)"), "Foo") + + e1:set("Foo", { "Foo", "Bar" } ) + t:check_equal(e1:interpolate("$(Foo)") , "Foo Bar") + t:check_equal(e1:interpolate("$(Foo:j,)"), "Foo,Bar") + t:check_equal(e1:interpolate("$(Foo:p!)") , "!Foo !Bar") + t:check_equal(e1:interpolate("$(Foo:a!)") , "Foo! Bar!") + t:check_equal(e1:interpolate("$(Foo:p-I:j__)") , "-IFoo__-IBar") + t:check_equal(e1:interpolate("$(Foo:j\\:)"), "Foo:Bar") + t:check_equal(e1:interpolate("$(Foo:u)"), "FOO BAR") + t:check_equal(e1:interpolate("$(Foo:[2])"), "Bar") + t:check_equal(e1:interpolate("$(Foo:Aoo)"), "Foo Baroo") + t:check_equal(e1:interpolate("$(Foo:PF)"), "Foo FBar") + + local lookaside = { + ['@'] = 'output', + ['<'] = { 'a', 'b' }, + } + + t:check_equal(e1:interpolate("$(Foo) $(<)=$(@)", lookaside), "Foo Bar a b=output") + + -- Verify interpolation caching is cleared when keys change. + e1:set("Foo", { "Baz" }) + t:check_equal(e1:interpolate("$(Foo) $(<)=$(@)", lookaside), "Baz a b=output") +end) diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/test/t_path.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/test/t_path.lua new file mode 100644 index 0000000..087bb99 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/test/t_path.lua @@ -0,0 +1,81 @@ +module(..., package.seeall) + +local path = require "tundra.path" +local native = require "tundra.native" + +local function check_path(t, p, expected) + p = p:gsub('\\', '/') + t:check_equal(p, expected) +end + +unit_test('path.normalize', function (t) + check_path(t, path.normalize("foo"), "foo") + check_path(t, path.normalize("foo/bar"), "foo/bar") + check_path(t, path.normalize("foo//bar"), "foo/bar") + check_path(t, path.normalize("foo/./bar"), "foo/bar") + check_path(t, path.normalize("foo/../bar"), "bar") + check_path(t, path.normalize("../bar"), "../bar") + check_path(t, path.normalize("foo/../../bar"), "../bar") +end) + +unit_test('path.join', function (t) + check_path(t, path.join("foo", "bar"), "foo/bar") + check_path(t, path.join("foo", "../bar"), "bar") + check_path(t, path.join("/foo", "bar"), "/foo/bar") +end) + +unit_test('path.split', function (t) + local function check_split(p, expected_dir, expected_fn) + local dir, fn = path.split(p) + dir = dir:gsub('\\', '/') + fn = fn:gsub('\\', '/') + t:check_equal(dir, expected_dir) + t:check_equal(fn, expected_fn) + end + + check_split("", ".", "") + check_split("foo", ".", "foo") + check_split("foo/bar", "foo", "bar") + check_split("/foo/bar", "/foo", "bar") + check_split("x:\\foo\\bar", "x:/foo", "bar") +end) + + +unit_test('path.get_filename_dir', function (t) + t:check_equal(path.get_filename_dir("foo/bar"), "foo") + t:check_equal(path.get_filename_dir("foo"), "") +end) + +unit_test('path.get_filename', function (t) + t:check_equal(path.get_filename("foo/bar"), "bar") + t:check_equal(path.get_filename("foo"), "foo") +end) + +unit_test('path.get_extension', function (t) + t:check_equal(path.get_extension("foo"), "") + t:check_equal(path.get_extension("foo."), ".") + t:check_equal(path.get_extension("foo.c"), ".c") + t:check_equal(path.get_extension("foo/bar/.c"), ".c") + t:check_equal(path.get_extension("foo/bar/baz.cpp"), ".cpp") +end) + +unit_test('path.drop_suffix', function (t) + t:check_equal(path.drop_suffix("foo.c"), "foo") + t:check_equal(path.drop_suffix("foo/bar.c"), "foo/bar") + t:check_equal(path.drop_suffix("/foo/bar.c"), "/foo/bar") +end) + +unit_test('path.get_filename_base', function (t) + t:check_equal(path.get_filename_base("foo1"), "foo1") + t:check_equal(path.get_filename_base("foo2.c"), "foo2") + t:check_equal(path.get_filename_base("/path/to/foo3"), "foo3") + t:check_equal(path.get_filename_base("/path/to/foo4.c"), "foo4") +end) + +unit_test('path.is_absolute', function (t) + t:check_equal(path.is_absolute("/foo") and "true" or "false", "true") + t:check_equal(path.is_absolute("foo") and "true" or "false", "false") + if native.host_platform == "windows" then + t:check_equal(path.is_absolute("x:\\foo") and "true" or "false", "true") + end +end) diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/clang-osx.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/clang-osx.lua new file mode 100644 index 0000000..bd5b66b --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/clang-osx.lua @@ -0,0 +1,11 @@ +module(..., package.seeall) + +function apply(env, options) + tundra.unitgen.load_toolset("gcc-osx", env) + + env:set_many { + ["CC"] = "clang", + ["CXX"] = "clang++", + ["LD"] = "clang", + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/dotnet.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/dotnet.lua new file mode 100644 index 0000000..e669e25 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/dotnet.lua @@ -0,0 +1,28 @@ +module(..., package.seeall) + +local frameworkDir = "c:\\Windows\\Microsoft.NET\\Framework" +local defaultFrameworkVersion = "v3.5" + +function apply(env, options) + tundra.unitgen.load_toolset("generic-dotnet", env) + + local version = options and assert(options.Version) or defaultFrameworkVersion + env:set_external_env_var('FrameworkDir', frameworkDir) + env:set_external_env_var('FrameworkVersion', version) + + local binPath = frameworkDir .. "\\" .. version + env:set_external_env_var('PATH', binPath .. ";" .. env:get_external_env_var('PATH')) + + -- C# support + env:set_many { + ["DOTNET_SUFFIXES"] = { ".cs" }, + ["DOTNET_SUFFIXES_RESOURCE"] = { ".resource" }, + ["CSC"] = "csc.exe", + ["CSPROGSUFFIX"] = ".exe", + ["CSLIBSUFFIX"] = ".dll", + ["CSRESGEN"] = "resgen $(<) $(@)", + ["_CSC_COMMON"] = "-warn:$(CSC_WARNING_LEVEL) /nologo $(CSLIBPATH:b:p/lib\\:) $(CSRESOURCES:b:p/resource\\:) $(CSLIBS:p/reference\\::A.dll)", + ["CSCLIBCOM"] = "$(CSC) $(_CSC_COMMON) $(CSCOPTS) -target:library -out:$(@:b) $(<:b)", + ["CSCEXECOM"] = "$(CSC) $(_CSC_COMMON) $(CSCOPTS) -target:exe -out:$(@:b) $(<:b)", + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/gas.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/gas.lua new file mode 100644 index 0000000..59a655c --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/gas.lua @@ -0,0 +1,12 @@ +module(..., package.seeall) + +function apply(env, options) + -- load the generic assembly toolset first + tundra.unitgen.load_toolset("generic-asm", env) + + env:set_many { + ["ASM"] = "as", + ["ASMCOM"] = "$(ASM) -o $(@) $(ASMDEFS:p-D) $(ASMOPTS) $(<)", + ["ASMINC_KEYWORDS"] = { ".include" }, + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/gcc-osx.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/gcc-osx.lua new file mode 100644 index 0000000..fb12ddd --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/gcc-osx.lua @@ -0,0 +1,19 @@ +module(..., package.seeall) + +function apply(env, options) + -- load the generic GCC toolset first + tundra.unitgen.load_toolset("gcc", env) + + env:set_many { + ["NATIVE_SUFFIXES"] = { ".c", ".cpp", ".cc", ".cxx", ".m", ".mm", ".a", ".o" }, + ["CXXEXTS"] = { "cpp", "cxx", "cc", "mm" }, + ["FRAMEWORKS"] = "", + ["SHLIBPREFIX"] = "lib", + ["SHLIBOPTS"] = "-shared", + ["_OS_CCOPTS"] = "$(FRAMEWORKS:p-F)", + ["SHLIBCOM"] = "$(LD) $(SHLIBOPTS) $(LIBPATH:p-L) $(LIBS:p-l) $(FRAMEWORKS:p-framework ) -o $(@) $(<)", + ["PROGCOM"] = "$(LD) $(PROGOPTS) $(LIBPATH:p-L) $(LIBS:p-l) $(FRAMEWORKS:p-framework ) -o $(@) $(<)", + ["OBJCCOM"] = "$(CCCOM)", -- objc uses same commandline + ["NIBCC"] = "ibtool --output-format binary1 --compile $(@) $(<)", + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/gcc.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/gcc.lua new file mode 100644 index 0000000..7849750 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/gcc.lua @@ -0,0 +1,30 @@ +module(..., package.seeall) + +function apply(env, options) + -- load the generic C toolset first + tundra.unitgen.load_toolset("generic-cpp", env) + + env:set_many { + ["NATIVE_SUFFIXES"] = { ".c", ".cpp", ".cc", ".cxx", ".a", ".o" }, + ["OBJECTSUFFIX"] = ".o", + ["LIBPREFIX"] = "lib", + ["LIBSUFFIX"] = ".a", + ["_GCC_BINPREFIX"] = "", + ["CC"] = "$(_GCC_BINPREFIX)gcc", + ["CXX"] = "$(_GCC_BINPREFIX)g++", + ["LIB"] = "$(_GCC_BINPREFIX)ar", + ["LD"] = "$(_GCC_BINPREFIX)gcc", + ["_OS_CCOPTS"] = "", + ["_OS_CXXOPTS"] = "", + ["CCCOM"] = "$(CC) $(_OS_CCOPTS) -c $(CPPDEFS:p-D) $(CPPPATH:f:p-I) $(CCOPTS) $(CCOPTS_$(CURRENT_VARIANT:u)) -o $(@) $(<)", + ["CXXCOM"] = "$(CXX) $(_OS_CXXOPTS) -c $(CPPDEFS:p-D) $(CPPPATH:f:p-I) $(CXXOPTS) $(CXXOPTS_$(CURRENT_VARIANT:u)) -o $(@) $(<)", + ["PROGOPTS"] = "", + ["PROGCOM"] = "$(LD) $(PROGOPTS) $(LIBPATH:p-L) -o $(@) $(<) $(LIBS:p-l)", + ["PROGPREFIX"] = "", + ["LIBOPTS"] = "", + ["LIBCOM"] = "$(LIB) -rs $(LIBOPTS) $(@) $(<)", + ["SHLIBPREFIX"] = "lib", + ["SHLIBOPTS"] = "-shared", + ["SHLIBCOM"] = "$(LD) $(SHLIBOPTS) $(LIBPATH:p-L) -o $(@) $(<) $(LIBS:p-l)", + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/generic-asm.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/generic-asm.lua new file mode 100644 index 0000000..e542eee --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/generic-asm.lua @@ -0,0 +1,78 @@ +module(..., package.seeall) + +local path = require "tundra.path" +local util = require "tundra.util" +local boot = require "tundra.boot" +local scanner = require "tundra.scanner" +local depgraph = require "tundra.depgraph" + +local default_keywords = { "include" } +local default_bin_keywords = { "incbin" } + +local function get_asm_scanner(env, fn) + local function test_bool(name, default) + val = env:get(name, default) + if val == "yes" or val == "true" or val == "1" then + return 1 + else + return 0 + end + end + local function new_scanner() + local paths = util.map(env:get_list("ASMINCPATH"), function (v) return env:interpolate(v) end) + local data = { + Paths = paths, + Keywords = env:get_list("ASMINC_KEYWORDS", default_keywords), + KeywordsNoFollow = env:get_list("ASMINC_BINARY_KEYWORDS", default_bin_keywords), + RequireWhitespace = test_bool("ASMINC_REQUIRE_WHITESPACE", "yes"), + UseSeparators = test_bool("ASMINC_USE_SEPARATORS", "yes"), + BareMeansSystem = test_bool("ASMINC_BARE_MEANS_SYSTEM", "no"), + } + return scanner.make_generic_scanner(data) + end + return env:memoize("ASMINCPATH", "_asm_scanner", new_scanner) +end + +-- Register implicit make functions for assembly files. +-- These functions are called to transform source files in unit lists into +-- object files. This function is registered as a setup function so it will be +-- run after user modifications to the environment, but before nodes are +-- processed. This way users can override the extension lists. +local function generic_asm_setup(env) + local _assemble = function(env, pass, fn) + local object_fn = path.make_object_filename(env, fn, '$(OBJECTSUFFIX)') + + return depgraph.make_node { + Env = env, + Label = 'Asm $(@)', + Pass = pass, + Action = "$(ASMCOM)", + InputFiles = { fn }, + OutputFiles = { object_fn }, + Scanner = get_asm_scanner(env, fn), + } + end + + for _, ext in ipairs(env:get_list("ASM_EXTS")) do + env:register_implicit_make_fn(ext, _assemble) + end +end + +function apply(_outer_env, options) + + _outer_env:add_setup_function(generic_asm_setup) + + _outer_env:set_many { + ["ASM_EXTS"] = { ".s", ".asm" }, + ["ASMINCPATH"] = {}, + ["ASMDEFS"] = "", + ["ASMDEFS_DEBUG"] = "", + ["ASMDEFS_PRODUCTION"] = "", + ["ASMDEFS_RELEASE"] = "", + ["ASMOPTS"] = "", + ["ASMOPTS_DEBUG"] = "", + ["ASMOPTS_PRODUCTION"] = "", + ["ASMOPTS_RELEASE"] = "", + } +end + diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/generic-cpp.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/generic-cpp.lua new file mode 100644 index 0000000..548a61c --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/generic-cpp.lua @@ -0,0 +1,103 @@ +module(..., package.seeall) + +local nodegen = require "tundra.nodegen" +local boot = require "tundra.boot" +local util = require "tundra.util" +local path = require "tundra.path" +local scanner = require "tundra.scanner" +local depgraph = require "tundra.depgraph" + +local scanner_cache = {} + +function get_cpp_scanner(env, fn) + local paths = util.map(env:get_list("CPPPATH"), function (v) return env:interpolate(v) end) + return scanner.make_cpp_scanner(paths) +end + +-- Register implicit make functions for C, C++ and Objective-C files. +-- These functions are called to transform source files in unit lists into +-- object files. This function is registered as a setup function so it will be +-- run after user modifications to the environment, but before nodes are +-- processed. This way users can override the extension lists. +local function generic_cpp_setup(env) + local _anyc_compile = function(env, pass, fn, label, action) + local object_fn = path.make_object_filename(env, fn, '$(OBJECTSUFFIX)') + + local output_files = { object_fn } + + local pch_source = env:get('_PCH_SOURCE', '') + local implicit_inputs = nil + + if fn == pch_source then + + label = 'Precompiled header' + pass = nodegen.resolve_pass(env:get('_PCH_PASS', '')) + action = "$(PCHCOMPILE)" + output_files = { "$(_PCH_FILE)", object_fn } + + elseif pch_source ~= '' and fn ~= pch_source then + + -- It would be good to make all non-pch source files dependent upon the .pch node. + -- That would require that we generate the .pch node before generating these nodes. + -- As it stands presently, when .pch compilation fails, the remaining sources + -- fail to compile, but if the dependencies were correctly setup, then they wouldn't + -- even try to compile. + + end + + return depgraph.make_node { + Env = env, + Label = label .. ' $(<)', + Pass = pass, + Action = action, + InputFiles = { fn }, + OutputFiles = output_files, + ImplicitInputs = implicit_inputs, + Scanner = get_cpp_scanner(env, fn), + } + end + + local mappings = { + ["CCEXTS"] = { Label="Cc", Action="$(CCCOM)" }, + ["CXXEXTS"] = { Label="C++", Action="$(CXXCOM)" }, + ["OBJCEXTS"] = { Label="ObjC", Action="$(OBJCCOM)" }, + } + + for key, setup in pairs(mappings) do + for _, ext in ipairs(env:get_list(key)) do + env:register_implicit_make_fn(ext, function(env, pass, fn) + return _anyc_compile(env, pass, fn, setup.Label, setup.Action) + end) + end + end +end + +function apply(_outer_env, options) + + _outer_env:add_setup_function(generic_cpp_setup) + + _outer_env:set_many { + ["IGNORED_AUTOEXTS"] = { ".h", ".hpp", ".hh", ".hxx", ".inl" }, + ["CCEXTS"] = { "c" }, + ["CXXEXTS"] = { "cpp", "cxx", "cc" }, + ["OBJCEXTS"] = { "m" }, + ["PROGSUFFIX"] = "$(HOSTPROGSUFFIX)", + ["SHLIBSUFFIX"] = "$(HOSTSHLIBSUFFIX)", + ["CPPPATH"] = "", + ["CPPDEFS"] = "", + ["LIBS"] = "", + ["LIBPATH"] = "$(OBJECTDIR)", + ["CCOPTS"] = "", + ["CXXOPTS"] = "", + ["CPPDEFS_DEBUG"] = "", + ["CPPDEFS_PRODUCTION"] = "", + ["CPPDEFS_RELEASE"] = "", + ["CCOPTS_DEBUG"] = "", + ["CCOPTS_PRODUCTION"] = "", + ["CCOPTS_RELEASE"] = "", + ["CXXOPTS_DEBUG"] = "", + ["CXXOPTS_PRODUCTION"] = "", + ["CXXOPTS_RELEASE"] = "", + ["SHLIBLINKSUFFIX"] = "", + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/generic-dotnet.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/generic-dotnet.lua new file mode 100644 index 0000000..2385440 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/generic-dotnet.lua @@ -0,0 +1,17 @@ +module(..., package.seeall) + +local function generic_dotnet_setup(env) + +end + +function apply(env, options) + env:add_setup_function(generic_dotnet_setup) + + env:set_many { + ["CSLIBS"] = "", -- assembly references + ["CSLIBPATH"] = {}, -- assembly directories + ["CSCOPTS"] = "-optimize", + ["CSRESOURCES"] = "", + ["CSC_WARNING_LEVEL"] = "4", + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/ispc.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/ispc.lua new file mode 100644 index 0000000..3f0b1ea --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/ispc.lua @@ -0,0 +1,11 @@ +module(..., package.seeall) + +function apply(env, options) + env:set_many { + ["ISPC_SUFFIXES"] = { ".ispc", }, + ["ISPC"] = "ispc", + ["ISPCOPTS"] = "", + ["ISPCCOM"] = "$(ISPC) $(ISPCOPTS) -o $(@:[1]) -h $(@:[2]) $(<)", + } +end + diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/mingw.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/mingw.lua new file mode 100644 index 0000000..4aeff36 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/mingw.lua @@ -0,0 +1,24 @@ +module(..., package.seeall) + +function apply(env, options) + + -- load the generic GCC toolset first + tundra.unitgen.load_toolset("gcc", env) + + -- load support for win32 resource compilation + tundra.unitgen.load_toolset("win32-rc", env) + + env:set_many { + ["NATIVE_SUFFIXES"] = { ".c", ".cpp", ".cc", ".cxx", ".a", ".o", ".rc" }, + ["OBJECTSUFFIX"] = ".o", + ["LIBPREFIX"] = "", + ["LIBSUFFIX"] = ".a", + ["W32RESSUFFIX"] = ".o", + ["CPPDEFS"] = "_WIN32", + ["_CPPDEFS"] = "$(CPPDEFS:p/D) $(CPPDEFS_$(CURRENT_VARIANT:u):p/D)", + ["RC"] = "windres", + ["RCOPTS"] = "", + ["RCCOM"] = "$(RC) $(RCOPTS) --output=$(@:b) $(CPPPATH:b:p-I) --input=$(<:b)", + ["SHLIBLINKSUFFIX"] = ".a", + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/mono.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/mono.lua new file mode 100644 index 0000000..553a1cd --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/mono.lua @@ -0,0 +1,17 @@ +module(..., package.seeall) + +function apply(env, options) + tundra.unitgen.load_toolset("generic-dotnet", env) + + env:set_many { + ["DOTNET_SUFFIXES"] = { ".cs" }, + ["DOTNET_SUFFIXES_RESOURCE"] = { ".resource" }, + ["CSC"] = "gmcs", + ["CSPROGSUFFIX"] = ".exe", + ["CSLIBSUFFIX"] = ".dll", + ["CSRESGEN"] = "resgen2 $(<) $(@)", + ["_CSC_COMMON"] = "-warn:$(CSC_WARNING_LEVEL) /nologo $(CSLIBPATH:p-lib\\:) $(CSRESOURCES:p-resource\\:) $(CSLIBS:p-reference\\::A.dll)", + ["CSCLIBCOM"] = "$(CSC) $(_CSC_COMMON) $(CSCOPTS) -target:library -out:$(@) $(<)", + ["CSCEXECOM"] = "$(CSC) $(_CSC_COMMON) $(CSCOPTS) -target:exe -out:$(@) $(<)", + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vs2008.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vs2008.lua new file mode 100644 index 0000000..99edf0f --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vs2008.lua @@ -0,0 +1,8 @@ + +module(..., package.seeall) + +local vscommon = require "tundra.tools.msvc-vscommon" + +function apply(env, options) + vscommon.apply_msvc_visual_studio("9.0", env, options) +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vs2010.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vs2010.lua new file mode 100644 index 0000000..5c1ef88 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vs2010.lua @@ -0,0 +1,8 @@ + +module(..., package.seeall) + +local vscommon = require "tundra.tools.msvc-vscommon" + +function apply(env, options) + vscommon.apply_msvc_visual_studio("10.0", env, options) +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vs2012.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vs2012.lua new file mode 100644 index 0000000..6c9d60a --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vs2012.lua @@ -0,0 +1,8 @@ + +module(..., package.seeall) + +local vscommon = require "tundra.tools.msvc-vscommon" + +function apply(env, options) + vscommon.apply_msvc_visual_studio("11.0", env, options) +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vs2013.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vs2013.lua new file mode 100644 index 0000000..6abddda --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vs2013.lua @@ -0,0 +1,8 @@ + +module(..., package.seeall) + +local vscommon = require "tundra.tools.msvc-vscommon" + +function apply(env, options) + vscommon.apply_msvc_visual_studio("12.0", env, options) +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vscommon.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vscommon.lua new file mode 100644 index 0000000..5fad59c --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vscommon.lua @@ -0,0 +1,267 @@ +-- msvc-vscommon.lua - utility code for all versions of Visual Studio + +module(..., package.seeall) + +local native = require "tundra.native" +local os = require "os" + +-- Visual Studio tooling layout + +local vc_bin_map = { + ["x86"] = { + ["x86"] = "", + ["x64"] = "x86_amd64", + ["arm"] = "x86_arm", + }, + ["x64"] = { + ["x86"] = "", + ["x64"] = "amd64", + ["arm"] = "x86_arm", -- is this really legal? + }, +} + +local vc_lib_map = { + ["x86"] = { + ["x86"] = "", + ["x64"] = "amd64", + ["arm"] = "arm", + }, + ["x64"] = { + ["x86"] = "", + ["x64"] = "amd64", + ["arm"] = "arm", + }, +} + +-- Windows SDK layout + +local pre_win8_sdk_dir = { + ["bin"] = "bin", + ["include"] = "include", + ["lib"] = "lib", +} + +local win8_sdk_dir = { + ["bin"] = "bin", + ["include"] = "include", + ["lib"] = "lib\\win8\\um", +} + +local win81_sdk_dir = { + ["bin"] = "bin", + ["include"] = "include", + ["lib"] = "lib\\winv6.3\\um", +} + +local pre_win8_sdk = { + ["x86"] = { + ["bin"] = "", + ["include"] = "", + ["lib"] = "", + }, + ["x64"] = { + ["bin"] = "x64", + ["include"] = "", + ["lib"] = "x64", + }, +} + +local post_win8_sdk = { + ["x86"] = { + ["bin"] = "x86", + ["include"] = { "shared", "um" }, + ["lib"] = "x86", + }, + ["x64"] = { + ["bin"] = "x64", + ["include"] = { "shared", "um" }, + ["lib"] = "x64", + }, + ["arm"] = { + ["bin"] = "arm", + ["include"] = { "shared", "um" }, + ["lib"] = "arm", + }, +} + +-- Each quadruplet specifies a registry key value that gets us the SDK location, +-- followed by a folder structure (for each supported target architecture) +-- and finally the corresponding bin, include and lib folder's relative location + +local sdk_map = { + ["9.0"] = { "SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v6.0A", "InstallationFolder", pre_win8_sdk_dir, pre_win8_sdk }, + ["10.0"] = { "SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.0A", "InstallationFolder", pre_win8_sdk_dir, pre_win8_sdk }, + ["11.0"] = { "SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots", "KitsRoot", win8_sdk_dir, post_win8_sdk }, + ["12.0"] = { "SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots", "KitsRoot81", win81_sdk_dir, post_win8_sdk }, +} + +local function get_host_arch() + local snative = native.getenv("PROCESSOR_ARCHITECTURE") + local swow = native.getenv("PROCESSOR_ARCHITEW6432", "") + if snative == "AMD64" or swow == "AMD64" then + return "x64" + elseif snative == "IA64" or swow == "IA64" then + return "itanium"; + else + return "x86" + end +end + +function path_combine(path, path_to_append) + if path == nil then + return path_to_append + end + if path:find("\\$") then + return path .. path_to_append + end + return path .. "\\" .. path_to_append +end + +function path_it(maybe_list) + if type(maybe_list) == "table" then + return ipairs(maybe_list) + end + return ipairs({maybe_list}) +end + +function apply_msvc_visual_studio(version, env, options) + + -- NOTE: don't make changes to `env` until you've asserted + -- that the requested version is in fact installed, + -- the `vs-wild` toolset will call this function + -- repeatedly with a the next version but the same `env`, + -- if a version fails (assert/error) + + if native.host_platform ~= "windows" then + error("the msvc toolset only works on windows hosts") + end + + -- Load basic MSVC environment setup first. + -- We're going to replace the paths to some tools. + tundra.unitgen.load_toolset('msvc', env) + + options = options or {} + + local target_arch = options.TargetArch or "x86" + local host_arch = options.HostArch or get_host_arch() + local sdk_version = options.SdkVersion or version -- we identify SDKs by VS version and fallback to current version + + -- We'll find any edition of VS (including Express) here + local vs_root = native.reg_query("HKLM", "SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VS7", version) + assert(vs_root, "The requested version of Visual Studio isn't installed") + vs_root = string.gsub(vs_root, "\\+$", "\\") + + local vc_lib + local vc_bin + + vc_bin = vc_bin_map[host_arch][target_arch] + if not vc_bin then + errorf("can't build target arch %s on host arch %s", target_arch, host_arch) + end + vc_bin = vs_root .. "vc\\bin\\" .. vc_bin + + vc_lib = vs_root .. "vc\\lib\\" .. vc_lib_map[host_arch][target_arch] + + -- + -- Now fix up the SDK + -- + + local sdk_root + local sdk_bin + local sdk_include = {} + local sdk_lib + + local sdk = sdk_map[sdk_version] + assert(sdk, "The requested version of Visual Studio isn't supported") + + sdk_root = native.reg_query("HKLM", sdk[1], sdk[2]) + assert(sdk_root, "The requested version of the SDK isn't installed") + sdk_root = string.gsub(sdk_root, "\\+$", "\\") + + local sdk_dir_base = sdk[3] + + local sdk_dir = sdk[4][target_arch] + assert(sdk_dir, "The target platform architecture isn't supported by the SDK") + + sdk_bin = sdk_root .. sdk_dir_base["bin"] .. "\\" .. sdk_dir["bin"] + + local sdk_dir_base_include = sdk_dir_base["include"] + for _, v in path_it(sdk_dir["include"]) do + sdk_include[#sdk_include + 1] = sdk_root .. sdk_dir_base_include .. "\\" .. v + end + + sdk_lib = sdk_root .. sdk_dir_base["lib"] .. "\\" .. sdk_dir["lib"] + + -- + -- Tools + -- + + local cl_exe = '"' .. path_combine(vc_bin, "cl.exe") .. '"' + local lib_exe = '"' .. path_combine(vc_bin, "lib.exe") .. '"' + local link_exe = '"' .. path_combine(vc_bin, "link.exe") .. '"' + local rc_exe = '"' .. path_combine(sdk_bin, "rc.exe") .. '"' -- pickup the Resource Compiler from the SDK + + env:set('CC', cl_exe) + env:set('CXX', cl_exe) + env:set('LIB', lib_exe) + env:set('LD', link_exe) + env:set('RC', rc_exe) + + if sdk_version == "9.0" then + env:set("RCOPTS", "") -- clear the "/nologo" option (it was first added in VS2010) + end + + if version == "12.0" then + -- Force MSPDBSRV.EXE + env:set("CCOPTS", "/FS") + env:set("CXXOPTS", "/FS") + end + + -- Wire-up the external environment + + env:set_external_env_var('VSINSTALLDIR', vs_root) + env:set_external_env_var('VCINSTALLDIR', vs_root .. "\\vc") + env:set_external_env_var('DevEnvDir', vs_root .. "Common7\\IDE") + + local include = {} + + for _, v in ipairs(sdk_include) do + include[#include + 1] = v + end + + include[#include + 1] = vs_root .. "VC\\ATLMFC\\INCLUDE" + include[#include + 1] = vs_root .. "VC\\INCLUDE" + + env:set_external_env_var("WindowsSdkDir", sdk_root) + env:set_external_env_var("INCLUDE", table.concat(include, ';')) + + -- if MFC isn't installed with VS + -- the linker will throw an error when looking for libs + -- Lua does not have a "does directory exist function" + -- we could use one here + local lib_str = sdk_lib .. ";" .. vs_root .. "\\VC\\ATLMFC\\lib\\" .. vc_lib_map[host_arch][target_arch] .. ";" .. vc_lib + env:set_external_env_var("LIB", lib_str) + env:set_external_env_var("LIBPATH", lib_str) + + -- Modify %PATH% + + local path = {} + + path[#path + 1] = sdk_root + path[#path + 1] = vs_root .. "Common7\\IDE" + + if "x86" == host_arch then + path[#path + 1] = vs_root .. "\\VC\\Bin" + elseif "x64" == host_arch then + path[#path + 1] = vs_root .. "\\VC\\Bin\\amd64" + elseif "arm" == host_arch then + path[#path + 1] = vs_root .. "\\VC\\Bin\\arm" + end + + path[#path + 1] = vs_root .. "\\Common7\\IDE" + + path[#path + 1] = env:get_external_env_var('PATH') + + env:set_external_env_var("PATH", table.concat(path, ';')) + +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vswild.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vswild.lua new file mode 100644 index 0000000..1804445 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-vswild.lua @@ -0,0 +1,23 @@ + +module(..., package.seeall) + +local vscommon = require "tundra.tools.msvc-vscommon" + +function apply(env, options) + + local vsvs = options.VsVersions or { "12.0", "11.0", "10.0", "9.0" } + + for _, v in ipairs(vsvs) do + local v1 = v + local success, result = xpcall(function() vscommon.apply_msvc_visual_studio(v1, env, options) end, function(err) return err end) + if success then + print("Visual Studio version " .. v1 .. " found ") + return + else + print("Visual Studio version " .. v1 .. " does not appear to be installed (" .. result .. ")") + end + end + + error("Unable to find suitable version of Visual Studio (please install either version " .. table.concat(vsvs, ", ") .. " of Visual Studio to continue)") + +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-winsdk.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-winsdk.lua new file mode 100644 index 0000000..5d7f7b1 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc-winsdk.lua @@ -0,0 +1,150 @@ +-- msvc-winsdk.lua - Use Microsoft Windows SDK 7.1 or later to build. + +module(..., package.seeall) + +local native = require "tundra.native" +local os = require "os" + +if native.host_platform ~= "windows" then + error("the msvc toolset only works on windows hosts") +end + +local function get_host_arch() + local snative = native.getenv("PROCESSOR_ARCHITECTURE") + local swow = native.getenv("PROCESSOR_ARCHITEW6432", "") + if snative == "AMD64" or swow == "AMD64" then + return "x64" + elseif snative == "IA64" or swow == "IA64" then + return "itanium"; + else + return "x86" + end +end + +local compiler_dirs = { + ["x86"] = { + ["x86"] = "bin\\", + ["x64"] = "bin\\x86_amd64\\", + ["itanium"] = "bin\\x86_ia64\\", + }, + ["x64"] = { + ["x86"] = "bin\\", + ["x64"] = { + ["11.0"] = "bin\\x86_amd64\\", + "bin\\amd64\\" + }, + ["itanium"] = "bin\\x86_ia64\\", + }, + ["itanium"] = { + ["x86"] = "bin\\x86_ia64\\", + ["itanium"] = "bin\\ia64\\", + }, +} + +local function setup(env, options) + options = options or {} + local target_arch = options.TargetArch or "x86" + local host_arch = options.HostArch or get_host_arch() + local vcversion = options.VcVersion or "10.0" + + local binDir = + compiler_dirs[host_arch][target_arch][vcversion] + or compiler_dirs[host_arch][target_arch][1] + or compiler_dirs[host_arch][target_arch] + + if not binDir then + errorf("can't build target arch %s on host arch %s", target_arch, host_arch) + end + + local sdkDir; + local sdkDirIncludes; + local sdkLibDir; + local vcLibDir; + + if vcversion == "11.0" then + local sdk_key = "SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v8.0" + sdkDir = assert(native.reg_query("HKLM", sdk_key, "InstallationFolder")) + sdkDirIncludes = { sdkDir .. "\\INCLUDE\\UM", sdkDir .. "\\INCLUDE\\SHARED" } + + sdkLibDir = "LIB\\win8\\um\\" + vcLibDir = "LIB" + + if "x86" == target_arch then + sdkLibDir = sdkLibDir .. "x86" + elseif "x64" == target_arch then + sdkLibDir = sdkLibDir .. "x64" + vcLibDir = "LIB\\amd64" + elseif "arm" == target_arch then + sdkLibDir = sdkLibDir .. "arm" + end + else + local sdk_key = "SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows" + sdkDir = assert(native.reg_query("HKLM", sdk_key, "CurrentInstallFolder")) + sdkDirIncludes = { sdkDir .. "\\INCLUDE" }; + + sdkLibDir = "LIB" + vcLibDir = "LIB" + + if "x64" == target_arch then + sdkLibDir = "LIB\\x64" + vcLibDir = "LIB\\amd64" + elseif "itanium" == target_arch then + sdkLibDir = "LIB\\IA64" + vcLibDir = "LIB\\IA64" + end + end + + + local vc_key = "SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VC7" + local vc_dir = assert(native.reg_query("HKLM", vc_key, vcversion)) + if vc_dir:sub(-1) ~= '\\' then + vc_dir = vc_dir .. '\\' + end + + local cl_exe = '"' .. vc_dir .. binDir .. "cl.exe" ..'"' + local lib_exe = '"' .. vc_dir .. binDir .. "lib.exe" ..'"' + local link_exe = '"' .. vc_dir .. binDir .. "link.exe" ..'"' + + env:set('CC', cl_exe) + env:set('CXX', cl_exe) + env:set('LIB', lib_exe) + env:set('LD', link_exe) + + -- Set up the MS SDK associated with visual studio + + env:set_external_env_var("WindowsSdkDir", sdkDir) + env:set_external_env_var("INCLUDE", table.concat(sdkDirIncludes, ";") .. ";" .. vc_dir .. "\\INCLUDE") + + local rc_exe + print("vcversion", vcversion) + if vcversion == "11.0" then + rc_exe = '"' .. sdkDir .. "\\bin\\x86\\rc.exe" ..'"' + else + rc_exe = '"' .. sdkDir .. "\\bin\\rc.exe" ..'"' + end + env:set('RC', rc_exe) + + local libString = sdkDir .. "\\" .. sdkLibDir .. ";" .. vc_dir .. "\\" .. vcLibDir + env:set_external_env_var("LIB", libString) + env:set_external_env_var("LIBPATH", libString) + + local path = { } + local vc_root = vc_dir:sub(1, -4) + if binDir ~= "\\bin\\" then + path[#path + 1] = vc_dir .. "\\bin" + end + path[#path + 1] = vc_root .. "Common7\\Tools" -- drop vc\ at end + path[#path + 1] = vc_root .. "Common7\\IDE" -- drop vc\ at end + path[#path + 1] = sdkDir + path[#path + 1] = vc_dir .. binDir + path[#path + 1] = env:get_external_env_var('PATH') + + env:set_external_env_var("PATH", table.concat(path, ';')) +end + +function apply(env, options) + -- Load basic MSVC environment setup first. We're going to replace the paths to + -- some tools. + tundra.unitgen.load_toolset('msvc', env) + setup(env, options) +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc.lua new file mode 100644 index 0000000..ac64254 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc.lua @@ -0,0 +1,53 @@ +-- msvc.lua - common definitions for all flavors of MSVC +module(..., package.seeall) + +function apply(env, options) + + -- load the generic C toolset first + tundra.unitgen.load_toolset("generic-cpp", env) + + -- load support for win32 resource compilation + tundra.unitgen.load_toolset("win32-rc", env) + + env:set_many { + ["NATIVE_SUFFIXES"] = { ".c", ".cpp", ".cc", ".cxx", ".lib", ".obj", ".res", ".rc" }, + ["OBJECTSUFFIX"] = ".obj", + ["LIBPREFIX"] = "", + ["LIBSUFFIX"] = ".lib", + ["CC"] = "cl", + ["CXX"] = "cl", + ["LIB"] = "lib", + ["LD"] = "link", + ["CPPDEFS"] = "_WIN32", + ["_CPPDEFS"] = "$(CPPDEFS:p/D) $(CPPDEFS_$(CURRENT_VARIANT:u):p/D)", + ["_PCH_SUPPORTED"] = "1", + ["_USE_PCH_OPT"] = "/Fp$(_PCH_FILE:b) /Yu$(_PCH_HEADER)", + ["_USE_PCH"] = "", + ["_USE_PDB_CC_OPT"] = "/Zi /Fd$(_PDB_CC_FILE:b)", + ["_USE_PDB_LINK_OPT"] = "/DEBUG /PDB:$(_PDB_LINK_FILE)", + ["_USE_PDB_CC"] = "", + ["_USE_PDB_LINK"] = "", + ["_USE_MODDEF_OPT"] = "/DEF:$(MODDEF)", + ["_USE_MODDEF"] = "", + ["RC"] = "rc", + ["RCOPTS"] = "/nologo", + ["W32RESSUFFIX"] = ".res", + ["RCCOM"] = "$(RC) $(RCOPTS) /fo$(@:b) $(_CPPDEFS) $(CPPPATH:b:p/i) $(<:b)", + ["CCCOM"] = "$(CC) /c @RESPONSE|@|$(_CPPDEFS) $(CPPPATH:b:p/I) /nologo $(CCOPTS) $(CCOPTS_$(CURRENT_VARIANT:u)) $(_USE_PCH) $(_USE_PDB_CC) /Fo$(@:b) $(<:b)", + ["CXXCOM"] = "$(CC) /c @RESPONSE|@|$(_CPPDEFS) $(CPPPATH:b:p/I) /nologo $(CXXOPTS) $(CXXOPTS_$(CURRENT_VARIANT:u)) $(_USE_PCH) $(_USE_PDB_CC) /Fo$(@:b) $(<:b)", + ["PCHCOMPILE_CC"] = "$(CC) /c $(_CPPDEFS) $(CPPPATH:b:p/I) /nologo $(CCOPTS) $(CCOPTS_$(CURRENT_VARIANT:u)) $(_USE_PDB_CC) /Yc$(_PCH_HEADER) /Fp$(@:[1]:b) /Fo$(@:[2]:b) $(<:[1]:b)", + ["PCHCOMPILE_CXX"] = "$(CXX) /c $(_CPPDEFS) $(CPPPATH:b:p/I) /nologo $(CXXOPTS) $(CXXOPTS_$(CURRENT_VARIANT:u)) $(_USE_PDB_CC) /Yc$(_PCH_HEADER) /Fp$(@:[1]:b) /Fo$(@:[2]:b) $(<:[1]:b)", + ["LIBS"] = "", + ["PROGOPTS"] = "", + ["PROGCOM"] = "$(LD) /nologo @RESPONSE|@|$(_USE_PDB_LINK) $(PROGOPTS) $(LIBPATH:b:p/LIBPATH\\:) $(_USE_MODDEF) $(LIBS) /out:$(@:b) $(<:b:p\n)", + ["LIBOPTS"] = "", + ["LIBCOM"] = "$(LIB) /nologo @RESPONSE|@|$(LIBOPTS) /out:$(@:b) $(<:b:p\n)", + ["PROGPREFIX"] = "", + ["SHLIBLINKSUFFIX"] = ".lib", + ["SHLIBPREFIX"] = "", + ["SHLIBOPTS"] = "", + ["SHLIBCOM"] = "$(LD) /DLL /nologo @RESPONSE|@|$(_USE_PDB_LINK) $(SHLIBOPTS) $(LIBPATH:b:p/LIBPATH\\:) $(_USE_MODDEF) $(LIBS) /out:$(@:b) $(<:b)", + ["AUX_FILES_PROGRAM"] = { "$(@:B:a.exe.manifest)", "$(@:B:a.pdb)", "$(@:B:a.exp)", "$(@:B:a.lib)", "$(@:B:a.ilk)", }, + ["AUX_FILES_SHAREDLIBRARY"] = { "$(@:B:a.dll.manifest)", "$(@:B:a.pdb)", "$(@:B:a.exp)", "$(@:B:a.lib)", "$(@:B:a.ilk)", }, + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc6.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc6.lua new file mode 100644 index 0000000..17c3019 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/msvc6.lua @@ -0,0 +1,101 @@ +-- msvc6.lua - Visual Studio 6 + +module(..., package.seeall) + +local native = require "tundra.native" +local os = require "os" + +function path_combine(path, path_to_append) + if path == nil then + return path_to_append + end + if path:find("\\$") then + return path .. path_to_append + end + return path .. "\\" .. path_to_append +end + +function path_it(maybe_list) + if type(maybe_list) == "table" then + return ipairs(maybe_list) + end + return ipairs({maybe_list}) +end + +function apply(env, options) + + if native.host_platform ~= "windows" then + error("the msvc6 toolset only works on windows hosts") + end + + -- Load basic MSVC environment setup first. + -- We're going to replace the paths to some tools. + tundra.unitgen.load_toolset('msvc', env) + + options = options or {} + + -- We'll find any edition of VS (including Express) here + local vs_root = native.reg_query("HKLM", "SOFTWARE\\Microsoft\\VisualStudio\\6.0\\Setup\\Microsoft Visual C++", "ProductDir") + assert(vs_root, "The requested version of Visual Studio isn't installed") + vs_root = string.gsub(vs_root, "\\+$", "\\") + + local common_root = native.reg_query("HKLM", "SOFTWARE\\Microsoft\\VisualStudio\\6.0\\Setup", "VsCommonDir") + assert(common_root, "The requested version of Visual Studio isn't installed") + common_root = string.gsub(common_root, "\\+$", "\\") + + local vc_lib + local vc_bin + + vc_bin = vs_root .. "\\bin" + vc_lib = vs_root .. "\\lib" + + -- Tools + + local cl_exe = '"' .. path_combine(vc_bin, "cl.exe") .. '"' + local lib_exe = '"' .. path_combine(vc_bin, "lib.exe") .. '"' + local link_exe = '"' .. path_combine(vc_bin, "link.exe") .. '"' + local rc_exe = '"' .. path_combine(common_root, "MSDev98\\Bin\\rc.exe") .. '"' + + env:set('CC', cl_exe) + env:set('CXX', cl_exe) + env:set('LIB', lib_exe) + env:set('LD', link_exe) + env:set('RC', rc_exe) + + env:set("RCOPTS", "") -- clear the "/nologo" option (it was first added in VS2010) + + -- Wire-up the external environment + env:set_external_env_var('VSINSTALLDIR', vs_root) + env:set_external_env_var('VCINSTALLDIR', vs_root .. "\\vc") + --env:set_external_env_var('DevEnvDir', vs_root .. "Common7\\IDE") + + do + local include = { + path_combine(vs_root, "ATL\\INCLUDE"), + path_combine(vs_root, "INCLUDE"), + path_combine(vs_root, "MFC\\INCLUDE"), + } + env:set_external_env_var("INCLUDE", table.concat(include, ';')) + end + + do + local lib = { + path_combine(vs_root, "LIB"), + path_combine(vs_root, "MFC\\LIB"), + } + local lib_str = table.concat(lib, ';') + env:set_external_env_var("LIB", lib_str) + env:set_external_env_var("LIBPATH", lib_str) + end + + -- Modify %PATH% + + do + local path = { + path_combine(vs_root, "BIN"), + path_combine(common_root, "MSDev98\\BIN"), + env:get_external_env_var('PATH'), + } + env:set_external_env_var("PATH", table.concat(path, ';')) + end +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/openwatcom.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/openwatcom.lua new file mode 100644 index 0000000..849024e --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/openwatcom.lua @@ -0,0 +1,61 @@ +-- openwatcom.lua - Support for the Open Watcom compiler C/C++ compiler + +module(..., package.seeall) + +local native = require "tundra.native" +local os = require "os" + +local function setup(env, options) + + if native.host_platform ~= "windows" then + error("the openwatcom toolset only works on windows hosts") + end + + assert(options, "No Options provided") + local dir = assert(options.InstallDir) + env:set_external_env_var("WATCOM", dir) + env:set_external_env_var("EDPATH", dir .. "\\EDDAT") + env:set_external_env_var("WIPFC", dir .. "\\WIPFC") + local p = native.getenv("PATH") .. ";" .. dir .. "\\BINNT\\;" .. dir .. "\\BINW\\" + print(p) + env:set_external_env_var("PATH", p) + local inc = native.getenv("INCLUDE", "") + if inc then + inc = inc .. ";" + end + env:set_external_env_var("INCLUDE", inc .. dir .. "\\H;" .. dir .. "\\H\\NT;" .. dir .. "\\H\\NT\\DIRECTX;" .. dir .. "\\H\\NT\\DDK") + +end + +function apply(env, options) + -- load the generic C toolset first + tundra.unitgen.load_toolset("generic-cpp", env) + + setup(env, options) + + env:set_many { + ["NATIVE_SUFFIXES"] = { ".c", ".cpp", ".cc", ".cxx", ".lib", ".obj" }, + ["OBJECTSUFFIX"] = ".obj", + ["LIBSUFFIX"] = ".lib", + ["CC"] = "wcl386.exe", + ["CXX"] = "wcl386.exe", + ["LIB"] = "wlib.exe", + ["LD"] = "wlink.exe", + ["CPPDEFS"] = "_WIN32", + ["CCOPTS"] = "-wx -we", + ["_CPPDEFS"] = "$(CPPDEFS:p-d) $(CPPDEFS_$(CURRENT_VARIANT:u):p-d)", + ["_USE_PCH_OPT"] = "", + ["_USE_PCH"] = "", + ["_CCCOM"] = "$(CC) /c @RESPONSE|@|$(_CPPDEFS) $(CPPPATH:b:p-i) $(CCOPTS) $(CCOPTS_$(CURRENT_VARIANT:u)) $(_USE_PCH) -fo=$(@:b) $(<:b)", + ["CCCOM"] = "$(_CCCOM)", + ["CXXCOM"] = "$(_CCCOM)", + ["PCHCOMPILE"] = "", + ["LIBS"] = "", + ["PROGOPTS"] = "", + ["PROGCOM"] = "", -- "$(LD) @RESPONSE|@|$(PROGOPTS) $(LIBS) /out:$(@:b) $(<:b)", + ["LIBOPTS"] = "", + ["LIBCOM"] = "", -- "$(LIB) @RESPONSE|@|$(LIBOPTS) /out:$(@:b) $(<:b)", + ["SHLIBOPTS"] = "", + ["SHLIBCOM"] = "", -- "$(LD) /nologo @RESPONSE|@|$(SHLIBOPTS) $(LIBPATH:b:p/LIBPATH\\:) $(LIBS) /out:$(@:b) $(<:b)", + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/vbcc.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/vbcc.lua new file mode 100644 index 0000000..e196312 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/vbcc.lua @@ -0,0 +1,36 @@ +module(..., package.seeall) + +local native = require "tundra.native" + +function apply(env, options) + -- load the generic C toolset first + tundra.unitgen.load_toolset("generic-cpp", env) + -- Also add assembly support. + tundra.unitgen.load_toolset("generic-asm", env) + + local vbcc_root = assert(native.getenv("VBCC"), "VBCC environment variable must be set") + + env:set_many { + ["NATIVE_SUFFIXES"] = { ".c", ".cpp", ".cc", ".cxx", ".s", ".asm", ".a", ".o" }, + ["OBJECTSUFFIX"] = ".o", + ["LIBPREFIX"] = "", + ["LIBSUFFIX"] = ".a", + ["VBCC_ROOT"] = vbcc_root, + ["CC"] = vbcc_root .. "$(SEP)bin$(SEP)vc$(HOSTPROGSUFFIX)", + ["LIB"] = vbcc_root .. "$(SEP)bin$(SEP)vlink$(HOSTPROGSUFFIX)", + ["LD"] = vbcc_root .. "$(SEP)bin$(SEP)vc$(HOSTPROGSUFFIX)", + ["ASM"] = vbcc_root .. "$(SEP)bin$(SEP)vasmm68k_mot$(HOSTPROGSUFFIX)", + ["VBCC_SDK_INC"] = vbcc_root .. "$(SEP)include$(SEP)sdk", + ["_OS_CCOPTS"] = "", + ["_OS_CXXOPTS"] = "", + ["CCCOM"] = "$(CC) $(_OS_CCOPTS) -c $(CPPDEFS:p-D) $(CPPPATH:f:p-I) $(CCOPTS) $(CCOPTS_$(CURRENT_VARIANT:u)) -o $(@) $(<)", + ["ASMCOM"] = "$(ASM) -quiet -Fhunk -phxass $(ASMOPTS) $(ASMOPTS_$(CURRENT_VARIANT:u)) $(ASMDEFS:p-D) $(ASMINCPATH:f:p-I) -I$(VBCC_SDK_INC) -o $(@) $(<)", + ["PROGOPTS"] = "", + ["PROGCOM"] = "$(LD) $(PROGOPTS) $(LIBPATH:p-L) $(LIBS:p-l) -o $(@) $(<)", + ["PROGPREFIX"] = "", + ["LIBOPTS"] = "", + ["LIBCOM"] = "$(LIB) -r $(LIBOPTS) -o $(@) $(<)", + ["ASMINC_KEYWORDS"] = { "INCLUDE", "include" }, + ["ASMINC_BINARY_KEYWORDS"] = { "INCBIN", "incbin" }, + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/win32-rc.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/win32-rc.lua new file mode 100644 index 0000000..f546ec2 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/win32-rc.lua @@ -0,0 +1,21 @@ +module(..., package.seeall) + +local path = require("tundra.path") +local depgraph = require("tundra.depgraph") +local gencpp = require("tundra.tools.generic-cpp") + +local function compile_resource_file(env, pass, fn) + return depgraph.make_node { + Env = env, + Label = 'Rc $(@)', + Pass = pass, + Action = "$(RCCOM)", + InputFiles = { fn }, + OutputFiles = { path.make_object_filename(env, fn, env:get('W32RESSUFFIX')) }, + Scanner = gencpp.get_cpp_scanner(env, fn), + } +end + +function apply(env, options) + env:register_implicit_make_fn("rc", compile_resource_file) +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/yasm.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/yasm.lua new file mode 100644 index 0000000..fe01c55 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/tools/yasm.lua @@ -0,0 +1,12 @@ +module(..., package.seeall) + +function apply(env, options) + -- load the generic assembly toolset first + tundra.unitgen.load_toolset("generic-asm", env) + + env:set_many { + ["YASM"] = "yasm", + ["ASMCOM"] = "$(YASM) -o $(@) $(ASMDEFS:p-D ) $(ASMOPTS) $(<)", + ["ASMINC_KEYWORDS"] = { "%include" }, + } +end diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/unitgen.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/unitgen.lua new file mode 100644 index 0000000..ba8b251 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/unitgen.lua @@ -0,0 +1,197 @@ +module(..., package.seeall) + +local util = require "tundra.util" +local buildfile = require "tundra.buildfile" +local decl = require "tundra.decl" +local nodegen = require "tundra.nodegen" + +function match_build_id(id, default) + assert(id) + local i = id:gmatch("[^-]+") + local platform_name, toolset, variant, subvariant = i() or default, i() or default, i() or default, i() or default + return platform_name, toolset, variant, subvariant +end + +local function iter_inherits(config, name) + local tab = config + return function() + while tab do + local my_tab = tab + if not my_tab then break end + tab = my_tab.Inherit + local v = my_tab[name] + if v then return v end + end + end +end + +function load_toolset(id, ...) + -- For non-qualified packages, use a default package + if not id:find("%.") then + id = "tundra.tools." .. id + end + + local pkg, err = require(id) + + if err then + errorf("couldn't load extension module %s: %s", id, err) + end + + pkg.apply(...) +end + +local function setup_env(env, build_data, tuple, build_id) + local config = tuple.Config + local variant_name = tuple.Variant.Name + + if not build_id then + build_id = config.Name .. "-" .. variant_name .. "-" .. tuple.SubVariant + end + + local naked_platform, naked_toolset = match_build_id(build_id) + + env:set("CURRENT_PLATFORM", naked_platform) -- e.g. linux or macosx + env:set("CURRENT_TOOLSET", naked_toolset) -- e.g. gcc or msvc + env:set("CURRENT_VARIANT", tuple.Variant.Name) -- e.g. debug or release + env:set("BUILD_ID", build_id) -- e.g. linux-gcc-debug + env:set("OBJECTDIR", "$(OBJECTROOT)" .. SEP .. "$(BUILD_ID)") + + for tools in iter_inherits(config, "Tools") do + for k, v in pairs(tools) do + if type(k) == "string" then + error("Tools must be a plain array - to include options keys wrap them in their own tables:\n " .. + "e.g. Tools = { { 'foo'; Option = ... }, ... }.\n Your Tools:\n" .. util.tostring(tools)) + end + end + for _, data in ipairs(tools) do + local id, options + + if type(data) == "table" then + id = assert(data[1]) + options = data + data = id + end + + if type(data) == "string" then + load_toolset(data, env, options) + elseif type(data) == "function" then + data(env, options) + else + error("bad parameters") + end + end + end + + -- Incorporate matching values from the build data's Env and ReplaceEnv. + if build_data.Env then + nodegen.append_filtered_env_vars(env, build_data.Env, build_id, false) + end + if build_data.ReplaceEnv then + nodegen.replace_filtered_env_vars(env, build_data.ReplaceEnv, build_id, false) + end + + -- Incorporate matching values from the config's Env and ReplaceEnv. + for env_tab in iter_inherits(config, "Env") do + nodegen.append_filtered_env_vars(env, env_tab, build_id, false) + end + for env_tab in iter_inherits(config, "ReplaceEnv") do + nodegen.replace_filtered_env_vars(env, env_tab, build_id, false) + end + + -- Run post-setup functions. This typically sets up implicit make functions. + env:run_setup_functions() + + return env +end + + + +local function setup_envs(tuple, configs, default_env, build_data) + local result = {} + + local top_env = setup_env(default_env:clone(), build_data, tuple) + result["__default"] = top_env + + -- Use the same build id for all subconfigurations + local build_id = top_env:get("BUILD_ID") + + local cfg = configs[tuple.Config.Name] + for moniker, x in util.nil_pairs(cfg.SubConfigs) do + if result[x] then + croak("duplicate subconfig name: %s", x) + end + local sub_tuple = { Config = configs[x], Variant = tuple.Variant, SubVariant = tuple.SubVariant } + if not sub_tuple.Config then + errorf("%s: no such config (in SubConfigs specification)", x) + end + local sub_env = setup_env(default_env:clone(), build_data, sub_tuple, build_id) + result[moniker] = sub_env + end + return result +end + + +function parse_units(build_tuples, args, passes) + if args.SyntaxExtensions then + print("*WARNING* SyntaxExtensions has been deprecated. Use require instead.") + end + for _, id in util.nil_ipairs(args.SyntaxExtensions) do + require(id) + end + + local function chunk () + local raw_nodes, default_nodes, always_nodes = decl.parse(args.Units or "units.lua") + assert(#default_nodes > 0 or #always_nodes > 0, "no default unit name to build was set") + return { raw_nodes, default_nodes, always_nodes } + end + + local success, result = xpcall(chunk, buildfile.syntax_error_catcher) + + if success then + return result[1], result[2], result[3] + else + print("Build script execution failed") + croak("%s", result or "") + end +end + + +-- Inputs +-- build_tuples - the config/variant/subvariant pairs to include in the DAG +-- args - Raw data from Build() call +-- passes - Passes specified in Build() call +-- configs - Configs specified in Build() call +function generate_dag(build_tuples, args, passes, configs, default_env) + local raw_nodes, default_nodes, always_nodes = parse_units(build_tuples, args, passes) + + local results = {} + + -- Let the nodegen code generate DAG nodes for all active + -- configurations/variants. + for _, tuple in pairs(build_tuples) do + printf("Generating DAG for %s-%s-%s", tuple.Config.Name, tuple.Variant.Name, tuple.SubVariant) + local envs = setup_envs(tuple, configs, default_env, args) + local always_nodes, default_nodes, named_nodes = nodegen.generate_dag { + Envs = envs, + Config = tuple.Config, + Variant = tuple.Variant, + Declarations = raw_nodes, + DefaultNodes = default_nodes, + AlwaysNodes = always_nodes, + Passes = passes, + } + + results[#results + 1] = { + Config = assert(tuple.Config), + Variant = assert(tuple.Variant), + SubVariant = assert(tuple.SubVariant), + AlwaysNodes = always_nodes, + DefaultNodes = default_nodes, + NamedNodes = named_nodes, + } + end + + return raw_nodes, results +end + + diff --git a/ogl_editor/bin/macosx/tundra/scripts/tundra/util.lua b/ogl_editor/bin/macosx/tundra/scripts/tundra/util.lua new file mode 100644 index 0000000..c6e7073 --- /dev/null +++ b/ogl_editor/bin/macosx/tundra/scripts/tundra/util.lua @@ -0,0 +1,360 @@ +local _tostring = tostring +module(..., package.seeall) + +function tostring(value, stack) + local str = '' + stack = stack or {} + + if type(value) ~= 'table' then + if type(value) == 'string' then + str = string.format("%q", value) + else + str = _tostring(value) + end + elseif stack[value] then + return '' + else + stack[value] = true + local auxTable = {} + for k, v in pairs(value) do + auxTable[#auxTable + 1] = k + end + table.sort(auxTable, function (a, b) return _tostring(a) < _tostring(b) end) + + str = str..'{' + local separator = "" + local entry = "" + for index, fieldName in ipairs(auxTable) do + if ((tonumber(fieldName)) and (tonumber(fieldName) > 0)) then + entry = tostring(value[tonumber(fieldName)], stack) + else + entry = tostring(fieldName) .. " = " .. tostring(rawget(value, fieldName), stack) + end + str = str..separator..entry + separator = ", " + end + str = str..'}' + + local mt = getmetatable(value) + if mt then + str = str .. ' @meta = ' .. tostring(mt, stack) + end + end + return str +end + +function map_in_place(t, fn) + for x = 1, #t do + t[x] = fn(t[x]) + end + return t +end + +function map(t, fn) + local result = {} + for idx = 1, #t do + result[idx] = fn(t[idx]) + end + return result +end + +function mapnil(table, fn) + if not table then + return nil + else + return map(table, fn) + end +end + +function get_named_arg(tab, name, context) + local v = tab[name] + if v then + return v + else + if context then + error(context .. ": argument " .. name .. " must be specified", 3) + else + error("argument " .. name .. " must be specified", 3) + end + end +end + +function parse_cmdline(args, blueprint) + local index, max = 2, #args + local options, targets = {}, {} + local lookup = {} + + for _, opt in ipairs(blueprint) do + if opt.Short then + lookup[opt.Short] = opt + end + if opt.Long then + lookup[opt.Long] = opt + end + end + + while index <= max do + local s = args[index] + local key, val + + if s:sub(1, 2) == '--' then + key, val = s:match("^%-%-([-a-zA-Z0-9]+)=(.*)$") + if not key then + key = s:sub(3) + end + elseif s:sub(1, 1) == '-' then + key = s:sub(2,2) + if s:len() > 2 then + val = s:sub(3) + end + else + table.insert(targets, s) + end + + if key then + local opt = lookup[key] + if not opt then + return nil, nil, "Unknown option " .. s + end + if opt.HasValue then + if not val then + index = index + 1 + val = args[index] + end + if val then + options[opt.Name] = val + else + return nil, nil, "Missing value for option "..s + end + else + local v = options[opt.Name] or 0 + options[opt.Name] = v + 1 + end + end + + index = index + 1 + end + + return options, targets +end + +function clone_table(t) + if t then + local r = {} + for k, v in pairs(t) do + r[k] = v + end + for k, v in ipairs(t) do + r[k] = v + end + return r + else + return nil + end +end + +function deep_clone_table(t) + local function clone_value(v) + if type(v) == "table" then + return deep_clone_table(v) + else + return v + end + end + if t then + local r = {} + for k, v in pairs(t) do + r[clone_value(k)] = clone_value(v) + end + for k, v in ipairs(t) do + r[k] = clone_value(v) + end + return r + else + return nil + end +end + +function clone_array(t) + local r = {} + for k, v in ipairs(t) do + r[k] = v + end + return r +end + +function merge_arrays(...) + local result = {} + local count = select('#', ...) + for i = 1, count do + local tab = select(i, ...) + if tab then + for _, v in ipairs(tab) do + result[#result + 1] = v + end + end + end + return result +end + +function merge_arrays_2(a, b) + if a and b then + return merge_arrays(a, b) + elseif a then + return a + elseif b then + return b + else + return {} + end +end + +function matches_any(str, patterns) + for _, pattern in ipairs(patterns) do + if str:match(pattern) then + return true + end + end + return false +end + +function return_nil() +end + +function nil_pairs(t) + if t then + return next, t + else + return return_nil + end +end + +function nil_ipairs(t) + if t then + return ipairs(t) + else + return return_nil + end +end + +function clear_table(tab) + local key, val = next(tab) + while key do + tab[key] = nil + key, val = next(tab, key) + end + return tab +end + +function filter(tab, predicate) + local result = {} + for _, x in ipairs(tab) do + if predicate(x) then + result[#result + 1] = x + end + end + return result +end + +function filter_nil(tab, predicate) + if not predicate then return nil end + local result = {} + for _, x in ipairs(tab) do + if predicate(x) then + result[#result + 1] = x + end + end + return result +end + +function filter_in_place(tab, predicate) + local i, limit = 1, #tab + while i <= limit do + if not predicate(tab[i]) then + table.remove(tab, i) + limit = limit - 1 + else + i = i + 1 + end + end + return tab +end + +function append_table(result, items) + local offset = #result + for i = 1, #items do + result[offset + i] = items[i] + end + return result +end + +function flatten(array) + local function iter(item, accum) + if type(item) == 'table' and not getmetatable(item) then + for _, sub_item in ipairs(item) do + iter(sub_item, accum) + end + else + accum[#accum + 1] = item + end + end + local accum = {} + iter(array, accum) + return accum +end + +function memoize(closure) + local result = nil + return function(...) + if not result then + result = assert(closure(...)) + end + return result + end +end + +function uniq(array) + local seen = {} + local result = {} + for _, val in nil_ipairs(array) do + if not seen[val] then + seen[val] = true + result[#result + 1] = val + end + end + return result +end + +function make_lookup_table(array) + local result = {} + for _, item in nil_ipairs(array) do + result[item] = true + end + return result +end + +function table_keys(array) + local result = {} + for k, _ in nil_pairs(array) do + result[#result + 1] = k + end + return result +end + +function table_values(array) + local result = {} + for _, v in nil_pairs(array) do + result[#result + 1] = v + end + return result +end + +function array_contains(array, find) + for _, val in ipairs(array) do + if val == find then + return true + end + end + return false +end + diff --git a/ogl_editor/bin/macosx/tundra/t2-inspect b/ogl_editor/bin/macosx/tundra/t2-inspect new file mode 100755 index 0000000000000000000000000000000000000000..cb52d0e4bb47ae3004ce42c82313971614b1deea GIT binary patch literal 179076 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 OLVC@l`>=Q~i}~M3*()Fb literal 0 HcmV?d00001 diff --git a/ogl_editor/bin/macosx/tundra/t2-lua b/ogl_editor/bin/macosx/tundra/t2-lua new file mode 100755 index 0000000000000000000000000000000000000000..a0b0182afcfdb35781b722b9b9040f82f641a976 GIT binary patch literal 364092 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 literal 0 HcmV?d00001 diff --git a/ogl_editor/bin/macosx/tundra/tundra2 b/ogl_editor/bin/macosx/tundra/tundra2 new file mode 100755 index 0000000000000000000000000000000000000000..7b7525a429316705ac1e0d3822c7ce6f0937f22b GIT binary patch literal 179172 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�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 Ur`&Yemy9H(T}-- pattern", name) + end + + if args.SubConfigs then + if not args.DefaultSubConfig then + errorf("configuration %s has `SubConfigs' but no `DefaultSubConfig'", name) + end + end + + return setmetatable(args, _config_class) +end + +local function analyze_targets(configs, variants, subvariants) + local build_tuples = {} + + local build_configs = {} + local build_variants = {} + local build_subvariants = {} + + for _, cfg in pairs(configs) do + + if not cfg.Virtual then -- skip virtual configs + + if not cfg.SupportedHosts then + if cfg.DefaultOnHost then + if type(cfg.DefaultOnHost) == "table" then + cfg.SupportedHosts = cfg.DefaultOnHost + else + cfg.SupportedHosts = { cfg.DefaultOnHost } + end + else + printf("1.0-compat: config %s doesn't specify SupportedHosts -- will never be built", cfg.Name); + cfg.SupportedHosts = { } + end + end + + local lut = util.make_lookup_table(cfg.SupportedHosts) + if lut[native.host_platform] then + build_configs[#build_configs + 1] = cfg + end + end + end + for _, var in pairs(variants) do build_variants[#build_variants + 1] = var end + for var, _ in pairs(subvariants) do build_subvariants[#build_subvariants + 1] = var end + + for _, config in ipairs(build_configs) do + if config.Virtual then + croak("can't build configuration %s directly; it is a support configuration only", config.Name) + end + for _, variant in ipairs(build_variants) do + for _, subvariant in ipairs(build_subvariants) do + build_tuples[#build_tuples + 1] = { Config = config, Variant = variant, SubVariant = subvariant } + end + end + end + + if #build_tuples == 0 then + errorf("no build tuples available\n") + end + + return build_tuples +end + +-- Custom pcall error handler to scan for syntax errors (thrown as tables) and +-- report them without a backtrace, trying to get the filename and line number +-- right so the user can fix their build file. +function syntax_error_catcher(err_obj) + if type(err_obj) == "table" and err_obj.Class and err_obj.Message then + local i = 1 + -- Walk down the stack until we find a function that isn't sourced from + -- a file. These have 'source' names that don't start with an @ sign. + -- Because we read all files into memory before executing them, this + -- will give us the source filename of the user script. + while true do + local info = debug.getinfo(i, 'Sl') + --print(util.tostring(info)) + if not info then + break + end + if info.what == "C" or (info.source:sub(1, 1) == "@" and info.source ~= "@units.lua") then + i = i + 1 + else + local fn = info.source + if info.source:sub(1, 1) == "@" then + fn = info.source:sub(2) + end + if info.currentline == -1 then + return string.format("%s: %s", err_obj.Class, err_obj.Message) + else + return string.format("%s(%d): %s: %s", fn, info.currentline, err_obj.Class, err_obj.Message) + end + end + end + return string.format("%s: %s", err_obj.Class, err_obj.Message) + else + return debug.traceback(err_obj, 2) + end +end + + + +-- A place to store the result of the user's build script calling Build() +local build_result = nil + +-- The Build function is the main entry point for "tundra.lua" when invoked. +function _G.Build(args) + if type(args.Configs) ~= "table" or #args.Configs == 0 then + croak("Need at least one config; got %s", util.tostring(args.Configs or "none at all")) + end + + local configs, variants, subvariants = {}, {}, {} + + -- Legacy support: run "Config" constructor automatically on naked tables + -- passed in Configs array. + for idx = 1, #args.Configs do + local cfg = args.Configs[idx] + if getmetatable(cfg) ~= _config_class then + cfg = Config(cfg) + args.Configs[idx] = cfg + end + configs[cfg.Name] = cfg + end + + for _, dir in util.nil_ipairs(args.ScriptDirs) do + -- Make sure dir is sane and ends with a slash + dir = dir:gsub("[/\\]", SEP):gsub("[/\\]$", "") + local expr = dir .. SEP .. "?.lua" + + -- Add user toolset dir first so they can override builtin scripts. + package.path = expr .. ";" .. package.path + end + + if args.Variants then + for i, x in ipairs(args.Variants) do + if type(x) == "string" then + args.Variants[i] = mk_defvariant(x) + else + assert(x.Name) + if not x.Options then + x.Options = {} + end + end + end + end + + local variant_array = args.Variants or default_variants + for _, variant in ipairs(variant_array) do variants[variant.Name] = variant end + + local subvariant_array = args.SubVariants or default_subvariants + for _, subvariant in ipairs(subvariant_array) do subvariants[subvariant] = true end + + local default_variant = variant_array[1] + if args.DefaultVariant then + for _, x in ipairs(variant_array) do + if x.Name == args.DefaultVariant then + default_variant = x + end + end + end + + local default_subvariant = args.DefaultSubVariant or subvariant_array[1] + local build_tuples = analyze_targets(configs, variants, subvariants) + local passes = args.Passes or { Default = { Name = "Default", BuildOrder = 1 } } + + printf("%d valid build tuples", #build_tuples) + + -- Validate pass data + for id, data in pairs(passes) do + if not data.Name then + croak("Pass %s has no Name attribute", id) + elseif not data.BuildOrder then + croak("Pass %s has no BuildOrder attribute", id) + end + end + + -- Assume syntax for C and DotNet is always needed + -- for now. Could possible make an option for which generator sets to load + -- in the future. + require "tundra.syntax.native" + require "tundra.syntax.dotnet" + + build_result = { + BuildTuples = build_tuples, + BuildData = args, + Passes = passes, + Configs = configs, + DefaultVariant = default_variant, + DefaultSubVariant = default_subvariant, + ContentDigestExtensions = args.ContentDigestExtensions, + Options = args.Options, + } +end + +function run(build_script_fn) + local f, err = io.open(build_script_fn, 'r') + + if not f then + croak("%s", err) + end + + local text = f:read("*all") + f:close() + + local script_globals, script_globals_mt = {}, {} + script_globals_mt.__index = _G + setmetatable(script_globals, script_globals_mt) + + local chunk, error_msg = loadstring(text, build_script_fn) + if not chunk then + croak("%s", error_msg) + end + setfenv(chunk, script_globals) + + local success, result = xpcall(chunk, syntax_error_catcher) + + if not success then + print("Build script execution failed") + croak("%s", result or "") + end + + local result = build_result + build_result = nil + return result +end + diff --git a/ogl_editor/bin/win32/scripts/tundra/dagsave.lua b/ogl_editor/bin/win32/scripts/tundra/dagsave.lua new file mode 100644 index 0000000..37dba90 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/dagsave.lua @@ -0,0 +1,409 @@ +module(..., package.seeall) + +local depgraph = require "tundra.depgraph" +local util = require "tundra.util" +local scanner = require "tundra.scanner" +local dirwalk = require "tundra.dirwalk" +local platform = require "tundra.platform" +local native = require "tundra.native" +local njson = require "tundra.native.json" +local path = require "tundra.path" + +local dag_dag_magic = 0x15890105 + +local function get_passes(nodes) + local result = {} + local seen_passes = {} + + for _, node in ipairs(nodes) do + local p = node.pass + if not seen_passes[p] then + assert(type(p) == "table", "Passes must be tables, have " .. util.tostring(p)) + assert(type(p.BuildOrder) == "number", "Pass BuildOrder must be a number") + result[#result + 1] = p + seen_passes[p] = true + end + end + + table.sort(result, function (a, b) return a.BuildOrder < b.BuildOrder end) + + local pass_lookup = {} + + for index, pass in ipairs(result) do + pass_lookup[pass] = index - 1 + end + + return result, pass_lookup +end + +local function setup_input_deps(nodes) + local producers = {} + + local cwd = native.getcwd() .. SEP + local filter + if native.host_platform == 'windows' or native.host_platform == 'macosx' then + filter = function (str) return str:lower() end + else + filter = function (str) return str end + end + + local node_deps = {} + + -- Record producing node for all output files + for _, n in ipairs(nodes) do + for _, output in util.nil_ipairs(n.outputs) do + if not path.is_absolute(output) then + output = cwd .. output + end + output = filter(output) + if producers[output] then + errorf("file %s set to be written by more than one target:\n%s\n%s\n", + output, n.annotation, producers[output].annotation) + end + producers[output] = n + end + if n.deps then + node_deps[n] = util.make_lookup_table(n.deps) + end + end + + -- Map input files to dependencies + for _, n in ipairs(nodes) do + for _, inputf in util.nil_ipairs(n.inputs) do + if not path.is_absolute(inputf) then + inputf = cwd .. inputf + end + inputf = filter(inputf) + local producer = producers[inputf] + local deps_lut = node_deps[n] + if producer and (not deps_lut or not deps_lut[producer]) then + n.deps[#n.deps + 1] = producer + if not deps_lut then + deps_lut = {} + node_deps[n] = deps_lut + end + deps_lut[producer] = true + end + end + end + +end + +local function get_scanners(nodes) + local scanners = {} + local scanner_to_index = {} + for _, node in ipairs(nodes) do + local scanner = node.scanner + if scanner and not scanner_to_index[scanner] then + scanner_to_index[scanner] = #scanners + scanners[#scanners + 1] = scanner + end + end + return scanners, scanner_to_index +end + +local function save_passes(w, passes) + w:begin_array("Passes") + for _, s in ipairs(passes) do + w:write_string(s.Name) + end + w:end_array() +end + +local function save_scanners(w, scanners) + w:begin_array("Scanners") + for _, s in ipairs(scanners) do + w:begin_object() + w:write_string(s.Kind, 'Kind') + w:begin_array("IncludePaths") + for _, path in util.nil_ipairs(s.Paths) do + w:write_string(path) + end + w:end_array() + -- Serialize specialized state for generic scanners + if s.Kind == 'generic' then + w:write_bool(s.RequireWhitespace, 'RequireWhitespace') + w:write_bool(s.UseSeparators, 'UseSeparators') + w:write_bool(s.BareMeansSystem, 'BareMeansSystem') + w:begin_array('Keywords') + for _, kw in util.nil_ipairs(s.Keywords) do + w:write_string(kw) + end + w:end_array() + w:begin_array('KeywordsNoFollow') + for _, kw in util.nil_ipairs(s.KeywordsNoFollow) do + w:write_string(kw) + end + w:end_array() + end + w:end_object() + end + w:end_array() +end + +local function save_nodes(w, nodes, pass_to_index, scanner_to_index) + w:begin_array("Nodes") + for idx, node in ipairs(nodes) do + w:begin_object() + assert(idx - 1 == node.index) + if node.action then + w:write_string(node.action, "Action") + end + if node.preaction then + w:write_string(node.preaction, "PreAction") + end + w:write_string(node.annotation, "Annotation") + + w:write_number(pass_to_index[node.pass], "PassIndex") + + if #node.deps > 0 then + w:begin_array("Deps") + for _, dep in ipairs(node.deps) do + w:write_number(dep.index) + end + w:end_array() + end + + local function dump_file_list(list, name) + if list and #list > 0 then + w:begin_array(name) + for _, fn in ipairs(list) do + w:write_string(fn) + end + w:end_array(name) + end + end + + dump_file_list(node.inputs, "Inputs") + dump_file_list(node.outputs, "Outputs") + dump_file_list(node.aux_outputs, "AuxOutputs") + + -- Save environment strings + local env_count = 0 + for k, v in util.nil_pairs(node.env) do + env_count = env_count + 1 + end + + if env_count > 0 then + w:begin_array("Env") + for k, v in pairs(node.env) do + w:begin_object() + w:write_string(k, "Key") + w:write_string(v, "Value") + w:end_object() + end + w:end_array() + end + + if node.scanner then + w:write_number(scanner_to_index[node.scanner], "ScannerIndex") + end + + if node.overwrite_outputs then + w:write_bool(true, "OverwriteOutputs") + end + + if node.is_precious then + w:write_bool(true, "PreciousOutputs") + end + + if node.expensive then + w:write_bool(true, "Expensive") + end + + w:end_object() + end + w:end_array() +end + +local function save_configs(w, bindings, default_variant, default_subvariant) + local configs = {} + local variants = {} + local subvariants = {} + local config_index = {} + local variant_index = {} + local subvariant_index = {} + local default_config = nil + local host_platform = platform.host_platform() + + for _, b in ipairs(bindings) do + if not configs[b.Config.Name] then + configs[b.Config.Name] = #config_index + config_index[#config_index+1] = b.Config.Name + end + if not variants[b.Variant.Name] then + variants[b.Variant.Name] = #variant_index + variant_index[#variant_index+1] = b.Variant.Name + end + if not subvariants[b.SubVariant] then + subvariants[b.SubVariant] = #subvariant_index + subvariant_index[#subvariant_index+1] = b.SubVariant + end + + if b.Config.DefaultOnHost == host_platform then + default_config = b.Config + end + end + + assert(#config_index > 0) + assert(#variant_index > 0) + assert(#subvariant_index > 0) + + local function dump_str_array(array, name) + if array and #array > 0 then + w:begin_array(name) + for _, name in ipairs(array) do + w:write_string(name) + end + w:end_array() + end + end + + w:begin_object("Setup") + dump_str_array(config_index, "Configs") + dump_str_array(variant_index, "Variants") + dump_str_array(subvariant_index, "SubVariants") + + w:begin_array("BuildTuples") + for index, binding in ipairs(bindings) do + w:begin_object() + w:write_number(configs[binding.Config.Name], "ConfigIndex") + w:write_number(variants[binding.Variant.Name], "VariantIndex") + w:write_number(subvariants[binding.SubVariant], "SubVariantIndex") + local function store_node_index_array(nodes, name) + w:begin_array(name) + for _, node in util.nil_ipairs(nodes) do + w:write_number(node.index) + end + w:end_array() + end + store_node_index_array(binding.AlwaysNodes, "AlwaysNodes") + store_node_index_array(binding.DefaultNodes, "DefaultNodes") + + w:begin_object("NamedNodes") + for name, node in pairs(binding.NamedNodes) do + w:write_number(node.index, name) + end + w:end_object() + + w:end_object() + end + w:end_array() + + -- m_DefaultBuildTuple + w:begin_object("DefaultBuildTuple") + if default_config then + w:write_number(configs[default_config.Name], "ConfigIndex") + else + w:write_number(-1, "ConfigIndex") + end + + if default_variant then + w:write_number(variants[default_variant.Name], "VariantIndex") + else + w:write_number(-1, "VariantIndex") + end + + if default_subvariant then + w:write_number(subvariants[default_subvariant], "SubVariantIndex") + else + w:write_number(-1, "SubVariantIndex") + end + w:end_object() + + w:end_object() + +end + +local function save_signatures(w, accessed_lua_files) + w:begin_array("FileSignatures") + for _, fn in ipairs(accessed_lua_files) do + w:begin_object() + local stat = native.stat_file(fn) + if not stat.exists then + errorf("accessed file %s is gone: %s", fn, err) + end + w:write_string(fn, "File") + w:write_number(stat.timestamp, "Timestamp") + w:end_object() + end + w:end_array() + + w:begin_array("GlobSignatures") + local globs = dirwalk.all_queries() + for _, glob in ipairs(globs) do + w:begin_object() + w:write_string(glob.Path, "Path") + w:begin_array("Files") + for _, fn in ipairs(glob.Files) do w:write_string(fn) end + w:end_array() + w:begin_array("SubDirs") + for _, fn in ipairs(glob.SubDirs) do w:write_string(fn) end + w:end_array() + w:end_object() + end + w:end_array() +end + +local function check_deps(nodes) + for _, node in ipairs(nodes) do + for _ , dep in ipairs(node.deps) do + if dep.pass.BuildOrder > node.pass.BuildOrder then + errorf("%s (pass: %s) depends on %s in later pass (%s)", node.annotation, node.pass.Name, dep.annotation, dep.pass.Name) + end + end + end +end + +function save_dag_data(bindings, default_variant, default_subvariant, content_digest_exts, misc_options) + + -- Call builtin function to get at accessed file table + local accessed_lua_files = util.table_keys(get_accessed_files()) + + misc_options = misc_options or {} + local max_expensive_jobs = misc_options.MaxExpensiveJobs or -1 + + printf("save_dag_data: %d bindings, %d accessed files", #bindings, #accessed_lua_files) + + local nodes = depgraph.get_all_nodes() + + -- Set node indices + for idx, node in ipairs(nodes) do + node.index = idx - 1 + end + + -- Set up array of passes + local passes, pass_to_index = get_passes(nodes) + + -- Hook up dependencies due to input files + setup_input_deps(nodes) + + check_deps(nodes) + + -- Find scanners + local scanners, scanner_to_index = get_scanners(nodes) + + local w = njson.new('.tundra2.dag.json') + + w:begin_object() + save_configs(w, bindings, default_variant, default_subvariant) + save_passes(w, passes) + save_scanners(w, scanners) + save_nodes(w, nodes, pass_to_index, scanner_to_index) + save_signatures(w, accessed_lua_files) + + if content_digest_exts and #content_digest_exts > 0 then + w:begin_array("ContentDigestExtensions") + for _, ext in ipairs(content_digest_exts) do + w:write_string(ext) + end + w:end_array() + end + + w:write_number(max_expensive_jobs, "MaxExpensiveCount") + + w:end_object() + + w:close() +end + diff --git a/ogl_editor/bin/win32/scripts/tundra/debugger.lua b/ogl_editor/bin/win32/scripts/tundra/debugger.lua new file mode 100644 index 0000000..73a79ff --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/debugger.lua @@ -0,0 +1,1343 @@ + +--{{{ history + +--15/03/06 DCN Created based on RemDebug +--28/04/06 DCN Update for Lua 5.1 +--01/06/06 DCN Fix command argument parsing +-- Add step/over N facility +-- Add trace lines facility +--05/06/06 DCN Add trace call/return facility +--06/06/06 DCN Make it behave when stepping through the creation of a coroutine +--06/06/06 DCN Integrate the simple debugger into the main one +--07/06/06 DCN Provide facility to step into coroutines +--13/06/06 DCN Fix bug that caused the function environment to get corrupted with the global one +--14/06/06 DCN Allow 'sloppy' file names when setting breakpoints +--04/08/06 DCN Allow for no space after command name +--11/08/06 DCN Use io.write not print +--30/08/06 DCN Allow access to array elements in 'dump' +--10/10/06 DCN Default to breakfile for all commands that require a filename and give '-' +--06/12/06 DCN Allow for punctuation characters in DUMP variable names +--03/01/07 DCN Add pause on/off facility +--19/06/07 DCN Allow for duff commands being typed in the debugger (thanks to Michael.Bringmann@lsi.com) +-- Allow for case sensitive file systems (thanks to Michael.Bringmann@lsi.com) + +--}}} +--{{{ description + +--A simple command line debug system for Lua written by Dave Nichols of +--Match-IT Limited. Its public domain software. Do with it as you wish. + +--This debugger was inspired by: +-- RemDebug 1.0 Beta +-- Copyright Kepler Project 2005 (http://www.keplerproject.org/remdebug) + +--Usage: +-- require('debugger') --load the debug library +-- pause(message) --start/resume a debug session + +--An assert() failure will also invoke the debugger. + +--}}} + +local IsWindows = string.find(string.lower(os.getenv('OS') or ''),'^windows') + +local coro_debugger +local events = { BREAK = 1, WATCH = 2, STEP = 3, SET = 4 } +local breakpoints = {} +local watches = {} +local step_into = false +local step_over = false +local step_lines = 0 +local step_level = {main=0} +local stack_level = {main=0} +local trace_level = {main=0} +local trace_calls = false +local trace_returns = false +local trace_lines = false +local ret_file, ret_line, ret_name +local current_thread = 'main' +local started = false +local pause_off = false +local _g = _G +local cocreate, cowrap = coroutine.create, coroutine.wrap +local pausemsg = 'pause' + +--{{{ local hints -- command help +--The format in here is name=summary|description +local hints = { + +pause = [[ +pause(msg) -- start/resume a debugger session| + +This can only be used in your code or from the console as a means to +start/resume a debug session. +If msg is given that is shown when the session starts/resumes. Useful to +give a context if you've instrumented your code with pause() statements. +]], + +poff = [[ +poff -- turn off pause() command| + +This causes all pause() commands to be ignored. This is useful if you have +instrumented your code in a busy loop and want to continue normal execution +with no further interruption. +]], + +pon = [[ +pon -- turn on pause() command| + +This re-instates honouring the pause() commands you may have instrumented +your code with. +]], + +setb = [[ +setb [line file] -- set a breakpoint to line/file| + +If file is omitted or is "-" the breakpoint is set at the file for the +currently set level (see "set"). Execution pauses when this line is about +to be executed and the debugger session is re-activated. + +The file can be given as the fully qualified name, partially qualified or +just the file name. E.g. if file is set as "myfile.lua", then whenever +execution reaches any file that ends with "myfile.lua" it will pause. +]], + +delb = [[ +delb [line file] -- removes a breakpoint| + +If file is omitted or is "-" the breakpoint is removed for the file of the +currently set level (see "set"). +]], + +delallb = [[ +delallb -- removes all breakpoints| +]], + +setw = [[ +setw -- adds a new watch expression| + +The expression is evaluated before each line is executed. If the expression +yields true then execution is paused and the debugger session re-activated. +The expression is executed in the context of the line about to be executed. +]], + +delw = [[ +delw -- removes the watch expression at index| + +The index is that returned when the watch expression was set by setw. +]], + +delallw = [[ +delallw -- removes all watch expressions| +]], + +run = [[ +run -- run until next breakpoint or watch expression| +]], + +step = [[ +step [N] -- run next N lines, stepping into function calls| + +If N is omitted, use 1. +]], + +over = [[ +over [N] -- run next N lines, stepping over function calls| + +If N is omitted, use 1. +]], + +out = [[ +out [N] -- run lines until stepped out of N functions| + +If N is omitted, use 1. +If you are inside a function, using "out 1" will run until you return +from that function to the caller. +]], + +goto = [[ +goto -- step to line number in the current file| + +The line and current file are those in the currently set context level. +]], + +listb = [[ +listb -- lists breakpoints| +]], + +listw = [[ +listw -- lists watch expressions| +]], + +set = [[ +set [level] -- set context to stack level, omitted=show| + +If level is omitted it just prints the current level set. +This sets the current context to the level given. This affects the +context used for several other functions (e.g. vars). The possible +levels are those shown by trace. +]], + +vars = [[ +vars [depth] -- list context locals to depth, omitted=1| + +If depth is omitted then uses 1. +Use a depth of 0 for the maximum. +Lists all non-nil local variables and all non-nil upvalues in the +currently set context. For variables that are tables, lists all fields +to the given depth. +]], + +fenv = [[ +fenv [depth] -- list context function env to depth, omitted=1| + +If depth is omitted then uses 1. +Use a depth of 0 for the maximum. +Lists all function environment variables in the currently set context. +For variables that are tables, lists all fields to the given depth. +]], + +glob = [[ +glob [depth] -- list globals to depth, omitted=1| + +If depth is omitted then uses 1. +Use a depth of 0 for the maximum. +Lists all global variables. +For variables that are tables, lists all fields to the given depth. +]], + +ups = [[ +ups -- list all the upvalue names| + +These names will also be in the "vars" list unless their value is nil. +This provides a means to identify which vars are upvalues and which are +locals. If a name is both an upvalue and a local, the local value takes +precedance. +]], + +locs = [[ +locs -- list all the locals names| + +These names will also be in the "vars" list unless their value is nil. +This provides a means to identify which vars are upvalues and which are +locals. If a name is both an upvalue and a local, the local value takes +precedance. +]], + +dump = [[ +dump [depth] -- dump all fields of variable to depth| + +If depth is omitted then uses 1. +Use a depth of 0 for the maximum. +Prints the value of in the currently set context level. If +is a table, lists all fields to the given depth. can be just a +name, or name.field or name.# to any depth, e.g. t.1.f accesses field +'f' in array element 1 in table 't'. + +Can also be called from a script as dump(var,depth). +]], + +tron = [[ +tron [crl] -- turn trace on for (c)alls, (r)etuns, (l)lines| + +If no parameter is given then tracing is turned off. +When tracing is turned on a line is printed to the console for each +debug 'event' selected. c=function calls, r=function returns, l=lines. +]], + +trace = [[ +trace -- dumps a stack trace| + +Format is [level] = file,line,name +The level is a candidate for use by the 'set' command. +]], + +info = [[ +info -- dumps the complete debug info captured| + +Only useful as a diagnostic aid for the debugger itself. This information +can be HUGE as it dumps all variables to the maximum depth, so be careful. +]], + +show = [[ +show line file X Y -- show X lines before and Y after line in file| + +If line is omitted or is '-' then the current set context line is used. +If file is omitted or is '-' then the current set context file is used. +If file is not fully qualified and cannot be opened as specified, then +a search for the file in the package[path] is performed using the usual +"require" searching rules. If no file extension is given, .lua is used. +Prints the lines from the source file around the given line. +]], + +exit = [[ +exit -- exits debugger, re-start it using pause()| +]], + +help = [[ +help [command] -- show this list or help for command| +]], + +[""] = [[ + -- execute a statement in the current context| + +The statement can be anything that is legal in the context, including +assignments. Such assignments affect the context and will be in force +immediately. Any results returned are printed. Use '=' as a short-hand +for 'return', e.g. "=func(arg)" will call 'func' with 'arg' and print +the results, and "=var" will just print the value of 'var'. +]], + +what = [[ +what -- show where is defined (if known)| +]], + +} +--}}} + +--{{{ local function getinfo(level,field) + +--like debug.getinfo but copes with no activation record at the given level +--and knows how to get 'field'. 'field' can be the name of any of the +--activation record fields or any of the 'what' names or nil for everything. +--only valid when using the stack level to get info, not a function name. + +local function getinfo(level,field) + level = level + 1 --to get to the same relative level as the caller + if not field then return debug.getinfo(level) end + local what + if field == 'name' or field == 'namewhat' then + what = 'n' + elseif field == 'what' or field == 'source' or field == 'linedefined' or field == 'lastlinedefined' or field == 'short_src' then + what = 'S' + elseif field == 'currentline' then + what = 'l' + elseif field == 'nups' then + what = 'u' + elseif field == 'func' then + what = 'f' + else + return debug.getinfo(level,field) + end + local ar = debug.getinfo(level,what) + if ar then return ar[field] else return nil end +end + +--}}} +--{{{ local function indented( level, ... ) + +local function indented( level, ... ) + io.write( string.rep(' ',level), table.concat({...}), '\n' ) +end + +--}}} +--{{{ local function dumpval( level, name, value, limit ) + +local dumpvisited + +local function dumpval( level, name, value, limit ) + local index + if type(name) == 'number' then + index = string.format('[%d] = ',name) + elseif type(name) == 'string' + and (name == '__VARSLEVEL__' or name == '__ENVIRONMENT__' or name == '__GLOBALS__' or name == '__UPVALUES__' or name == '__LOCALS__') then + --ignore these, they are debugger generated + return + elseif type(name) == 'string' and string.find(name,'^[_%a][_.%w]*$') then + index = name ..' = ' + else + index = string.format('[%q] = ',tostring(name)) + end + if type(value) == 'table' then + if dumpvisited[value] then + indented( level, index, string.format('ref%q;',dumpvisited[value]) ) + else + dumpvisited[value] = tostring(value) + if (limit or 0) > 0 and level+1 >= limit then + indented( level, index, dumpvisited[value] ) + else + indented( level, index, '{ -- ', dumpvisited[value] ) + for n,v in pairs(value) do + dumpval( level+1, n, v, limit ) + end + indented( level, '};' ) + end + end + else + if type(value) == 'string' then + if string.len(value) > 40 then + indented( level, index, '[[', value, ']];' ) + else + indented( level, index, string.format('%q',value), ';' ) + end + else + indented( level, index, tostring(value), ';' ) + end + end +end + +--}}} +--{{{ local function dumpvar( value, limit, name ) + +local function dumpvar( value, limit, name ) + dumpvisited = {} + dumpval( 0, name or tostring(value), value, limit ) +end + +--}}} +--{{{ local function show(file,line,before,after) + +--show +/-N lines of a file around line M + +local function show(file,line,before,after) + + line = tonumber(line or 1) + before = tonumber(before or 10) + after = tonumber(after or before) + + if not string.find(file,'%.') then file = file..'.lua' end + + local f = io.open(file,'r') + if not f then + --{{{ try to find the file in the path + + -- + -- looks for a file in the package path + -- + local path = package.path or LUA_PATH or '' + for c in string.gmatch (path, "[^;]+") do + local c = string.gsub (c, "%?%.lua", file) + f = io.open (c,'r') + if f then + break + end + end + + --}}} + if not f then + io.write('Cannot find '..file..'\n') + return + end + end + + local i = 0 + for l in f:lines() do + i = i + 1 + if i >= (line-before) then + if i > (line+after) then break end + if i == line then + io.write(i..'***\t'..l..'\n') + else + io.write(i..'\t'..l..'\n') + end + end + end + + f:close() + +end + +--}}} +--{{{ local function tracestack(l) + +local function gi( i ) + return function() i=i+1 return debug.getinfo(i),i end +end + +local function gl( level, j ) + return function() j=j+1 return debug.getlocal( level, j ) end +end + +local function gu( func, k ) + return function() k=k+1 return debug.getupvalue( func, k ) end +end + +local traceinfo + +local function tracestack(l) + local l = l + 1 --NB: +1 to get level relative to caller + traceinfo = {} + traceinfo.pausemsg = pausemsg + for ar,i in gi(l) do + table.insert( traceinfo, ar ) + local names = {} + local values = {} + for n,v in gl(i,0) do + if string.sub(n,1,1) ~= '(' then --ignore internal control variables + table.insert( names, n ) + table.insert( values, v ) + end + end + if #names > 0 then + ar.lnames = names + ar.lvalues = values + end + if ar.func then + local names = {} + local values = {} + for n,v in gu(ar.func,0) do + if string.sub(n,1,1) ~= '(' then --ignore internal control variables + table.insert( names, n ) + table.insert( values, v ) + end + end + if #names > 0 then + ar.unames = names + ar.uvalues = values + end + end + end +end + +--}}} +--{{{ local function trace() + +local function trace(set) + local mark + for level,ar in ipairs(traceinfo) do + if level == set then + mark = '***' + else + mark = '' + end + io.write('['..level..']'..mark..'\t'..(ar.name or ar.what)..' in '..ar.short_src..':'..ar.currentline..'\n') + end +end + +--}}} +--{{{ local function info() + +local function info() dumpvar( traceinfo, 0, 'traceinfo' ) end + +--}}} + +--{{{ local function set_breakpoint(file, line) + +local function set_breakpoint(file, line) + if not breakpoints[line] then + breakpoints[line] = {} + end + breakpoints[line][file] = true +end + +--}}} +--{{{ local function remove_breakpoint(file, line) + +local function remove_breakpoint(file, line) + if breakpoints[line] then + breakpoints[line][file] = nil + end +end + +--}}} +--{{{ local function has_breakpoint(file, line) + +--allow for 'sloppy' file names +--search for file and all variations walking up its directory hierachy +--ditto for the file with no extension + +local function has_breakpoint(file, line) + if not breakpoints[line] then return false end + local noext = string.gsub(file,"(%..-)$",'',1) + if noext == file then noext = nil end + while file do + if breakpoints[line][file] then return true end + file = string.match(file,"[:/\](.+)$") + end + while noext do + if breakpoints[line][noext] then return true end + noext = string.match(noext,"[:/\](.+)$") + end + return false +end + +--}}} +--{{{ local function capture_vars(ref,level,line) + +local function capture_vars(ref,level,line) + --get vars, file and line for the given level relative to debug_hook offset by ref + + local lvl = ref + level --NB: This includes an offset of +1 for the call to here + + --{{{ capture variables + + local ar = debug.getinfo(lvl, "f") + if not ar then return {},'?',0 end + + local vars = {__UPVALUES__={}, __LOCALS__={}} + local i + + local func = ar.func + if func then + i = 1 + while true do + local name, value = debug.getupvalue(func, i) + if not name then break end + if string.sub(name,1,1) ~= '(' then --NB: ignoring internal control variables + vars[name] = value + vars.__UPVALUES__[i] = name + end + i = i + 1 + end + vars.__ENVIRONMENT__ = getfenv(func) + end + + vars.__GLOBALS__ = getfenv(0) + + i = 1 + while true do + local name, value = debug.getlocal(lvl, i) + if not name then break end + if string.sub(name,1,1) ~= '(' then --NB: ignoring internal control variables + vars[name] = value + vars.__LOCALS__[i] = name + end + i = i + 1 + end + + vars.__VARSLEVEL__ = level + + if func then + --NB: Do not do this until finished filling the vars table + setmetatable(vars, { __index = getfenv(func), __newindex = getfenv(func) }) + end + + --NB: Do not read or write the vars table anymore else the metatable functions will get invoked! + + --}}} + + local file = getinfo(lvl, "source") + if string.find(file, "@") == 1 then + file = string.sub(file, 2) + end + if IsWindows then file = string.lower(file) end + + if not line then + line = getinfo(lvl, "currentline") + end + + return vars,file,line + +end + +--}}} +--{{{ local function restore_vars(ref,vars) + +local function restore_vars(ref,vars) + + if type(vars) ~= 'table' then return end + + local level = vars.__VARSLEVEL__ --NB: This level is relative to debug_hook offset by ref + if not level then return end + + level = level + ref --NB: This includes an offset of +1 for the call to here + + local i + local written_vars = {} + + i = 1 + while true do + local name, value = debug.getlocal(level, i) + if not name then break end + if vars[name] and string.sub(name,1,1) ~= '(' then --NB: ignoring internal control variables + debug.setlocal(level, i, vars[name]) + written_vars[name] = true + end + i = i + 1 + end + + local ar = debug.getinfo(level, "f") + if not ar then return end + + local func = ar.func + if func then + + i = 1 + while true do + local name, value = debug.getupvalue(func, i) + if not name then break end + if vars[name] and string.sub(name,1,1) ~= '(' then --NB: ignoring internal control variables + if not written_vars[name] then + debug.setupvalue(func, i, vars[name]) + end + written_vars[name] = true + end + i = i + 1 + end + + end + +end + +--}}} +--{{{ local function trace_event(event, line, level) + +local function print_trace(level,depth,event,file,line,name) + + --NB: level here is relative to the caller of trace_event, so offset by 2 to get to there + level = level + 2 + + local file = file or getinfo(level,'short_src') + local line = line or getinfo(level,'currentline') + local name = name or getinfo(level,'name') + + local prefix = '' + if current_thread ~= 'main' then prefix = '['..tostring(current_thread)..'] ' end + + io.write(prefix.. + string.format('%08.2f:%02i.',os.clock(),depth).. + string.rep('.',depth%32).. + (file or '')..' ('..(line or '')..') '.. + (name or '').. + ' ('..event..')\n') + +end + +local function trace_event(event, line, level) + + if event == 'return' and trace_returns then + --note the line info for later + ret_file = getinfo(level+1,'short_src') + ret_line = getinfo(level+1,'currentline') + ret_name = getinfo(level+1,'name') + end + + if event ~= 'line' then return end + + local slevel = stack_level[current_thread] + local tlevel = trace_level[current_thread] + + if trace_calls and slevel > tlevel then + --we are now in the function called, so look back 1 level further to find the calling file and line + print_trace(level+1,slevel-1,'c',nil,nil,getinfo(level+1,'name')) + end + + if trace_returns and slevel < tlevel then + print_trace(level,slevel,'r',ret_file,ret_line,ret_name) + end + + if trace_lines then + print_trace(level,slevel,'l') + end + + trace_level[current_thread] = stack_level[current_thread] + +end + +--}}} +--{{{ local function debug_hook(event, line, level, thread) + +local function debug_hook(event, line, level, thread) + if not started then debug.sethook() return end + current_thread = thread or 'main' + local level = level or 2 + trace_event(event,line,level) + if event == "call" then + stack_level[current_thread] = stack_level[current_thread] + 1 + elseif event == "return" then + stack_level[current_thread] = stack_level[current_thread] - 1 + if stack_level[current_thread] < 0 then stack_level[current_thread] = 0 end + else + local vars,file,line = capture_vars(level,1,line) + local stop, ev, idx = false, events.STEP, 0 + while true do + for index, value in pairs(watches) do + setfenv(value.func, vars) + local status, res = pcall(value.func) + if status and res then + ev, idx = events.WATCH, index + stop = true + break + end + end + if stop then break end + if (step_into) + or (step_over and (stack_level[current_thread] <= step_level[current_thread] or stack_level[current_thread] == 0)) then + step_lines = step_lines - 1 + if step_lines < 1 then + ev, idx = events.STEP, 0 + break + end + end + if has_breakpoint(file, line) then + ev, idx = events.BREAK, 0 + break + end + return + end + tracestack(level) + local last_next = 1 + local err, next = assert(coroutine.resume(coro_debugger, ev, vars, file, line, idx)) + while true do + if next == 'cont' then + return + elseif next == 'stop' then + started = false + debug.sethook() + return + elseif tonumber(next) then --get vars for given level or last level + next = tonumber(next) + if next == 0 then next = last_next end + last_next = next + restore_vars(level,vars) + vars, file, line = capture_vars(level,next) + err, next = assert(coroutine.resume(coro_debugger, events.SET, vars, file, line, idx)) + else + io.write('Unknown command from debugger_loop: '..tostring(next)..'\n') + io.write('Stopping debugger\n') + next = 'stop' + end + end + end +end + +--}}} +--{{{ local function report(ev, vars, file, line, idx_watch) + +local function report(ev, vars, file, line, idx_watch) + local vars = vars or {} + local file = file or '?' + local line = line or 0 + local prefix = '' + if current_thread ~= 'main' then prefix = '['..tostring(current_thread)..'] ' end + if ev == events.STEP then + io.write(prefix.."Paused at file "..file.." line "..line..' ('..stack_level[current_thread]..')\n') + elseif ev == events.BREAK then + io.write(prefix.."Paused at file "..file.." line "..line..' ('..stack_level[current_thread]..') (breakpoint)\n') + elseif ev == events.WATCH then + io.write(prefix.."Paused at file "..file.." line "..line..' ('..stack_level[current_thread]..')'.." (watch expression "..idx_watch.. ": ["..watches[idx_watch].exp.."])\n") + elseif ev == events.SET then + --do nothing + else + io.write(prefix.."Error in application: "..file.." line "..line.."\n") + end + if ev ~= events.SET then + if pausemsg and pausemsg ~= '' then io.write('Message: '..pausemsg..'\n') end + pausemsg = '' + end + return vars, file, line +end + +--}}} + +--{{{ local function debugger_loop(server) + +local function debugger_loop(ev, vars, file, line, idx_watch) + + io.write("Lua Debugger\n") + local eval_env, breakfile, breakline = report(ev, vars, file, line, idx_watch) + io.write("Type 'help' for commands\n") + + local command, args + + --{{{ local function getargs(spec) + + --get command arguments according to the given spec from the args string + --the spec has a single character for each argument, arguments are separated + --by white space, the spec characters can be one of: + -- F for a filename (defaults to breakfile if - given in args) + -- L for a line number (defaults to breakline if - given in args) + -- N for a number + -- V for a variable name + -- S for a string + + local function getargs(spec) + local res={} + local char,arg + local ptr=1 + local _ + for i=1,string.len(spec) do + char = string.sub(spec,i,i) + if char == 'F' then + _,ptr,arg = string.find(args..' ',"%s*([%w%p]*)%s*",ptr) + if not arg or arg == '' then arg = '-' end + if arg == '-' then arg = breakfile end + elseif char == 'L' then + _,ptr,arg = string.find(args..' ',"%s*([%w%p]*)%s*",ptr) + if not arg or arg == '' then arg = '-' end + if arg == '-' then arg = breakline end + arg = tonumber(arg) or 0 + elseif char == 'N' then + _,ptr,arg = string.find(args..' ',"%s*([%w%p]*)%s*",ptr) + if not arg or arg == '' then arg = '0' end + arg = tonumber(arg) or 0 + elseif char == 'V' then + _,ptr,arg = string.find(args..' ',"%s*([%w%p]*)%s*",ptr) + if not arg or arg == '' then arg = '' end + elseif char == 'S' then + _,ptr,arg = string.find(args..' ',"%s*([%w%p]*)%s*",ptr) + if not arg or arg == '' then arg = '' end + else + arg = '' + end + table.insert(res,arg or '') + end + return unpack(res) + end + + --}}} + + while true do + io.write("[DEBUG]> ") + local line = io.read("*line") + if line == nil then io.write('\n'); line = 'exit' end + + if string.find(line, "^[a-z]+") then + command = string.sub(line, string.find(line, "^[a-z]+")) + args = string.gsub(line,"^[a-z]+%s*",'',1) --strip command off line + else + command = '' + end + + if command == "setb" then + --{{{ set breakpoint + + local line, filename = getargs('LF') + if filename ~= '' and line ~= '' then + set_breakpoint(filename,line) + io.write("Breakpoint set in file "..filename..' line '..line..'\n') + else + io.write("Bad request\n") + end + + --}}} + + elseif command == "delb" then + --{{{ delete breakpoint + + local line, filename = getargs('LF') + if filename ~= '' and line ~= '' then + remove_breakpoint(filename, line) + io.write("Breakpoint deleted from file "..filename..' line '..line.."\n") + else + io.write("Bad request\n") + end + + --}}} + + elseif command == "delallb" then + --{{{ delete all breakpoints + breakpoints = {} + io.write('All breakpoints deleted\n') + --}}} + + elseif command == "listb" then + --{{{ list breakpoints + for i, v in pairs(breakpoints) do + for ii, vv in pairs(v) do + io.write("Break at: "..i..' in '..ii..'\n') + end + end + --}}} + + elseif command == "setw" then + --{{{ set watch expression + + if args and args ~= '' then + local func = loadstring("return(" .. args .. ")") + local newidx = #watches + 1 + watches[newidx] = {func = func, exp = args} + io.write("Set watch exp no. " .. newidx..'\n') + else + io.write("Bad request\n") + end + + --}}} + + elseif command == "delw" then + --{{{ delete watch expression + + local index = tonumber(args) + if index then + watches[index] = nil + io.write("Watch expression deleted\n") + else + io.write("Bad request\n") + end + + --}}} + + elseif command == "delallw" then + --{{{ delete all watch expressions + watches = {} + io.write('All watch expressions deleted\n') + --}}} + + elseif command == "listw" then + --{{{ list watch expressions + for i, v in pairs(watches) do + io.write("Watch exp. " .. i .. ": " .. v.exp..'\n') + end + --}}} + + elseif command == "run" then + --{{{ run until breakpoint + step_into = false + step_over = false + eval_env, breakfile, breakline = report(coroutine.yield('cont')) + --}}} + + elseif command == "step" then + --{{{ step N lines (into functions) + local N = tonumber(args) or 1 + step_over = false + step_into = true + step_lines = tonumber(N or 1) + eval_env, breakfile, breakline = report(coroutine.yield('cont')) + --}}} + + elseif command == "over" then + --{{{ step N lines (over functions) + local N = tonumber(args) or 1 + step_into = false + step_over = true + step_lines = tonumber(N or 1) + step_level[current_thread] = stack_level[current_thread] + eval_env, breakfile, breakline = report(coroutine.yield('cont')) + --}}} + + elseif command == "out" then + --{{{ step N lines (out of functions) + local N = tonumber(args) or 1 + step_into = false + step_over = true + step_lines = 1 + step_level[current_thread] = stack_level[current_thread] - tonumber(N or 1) + eval_env, breakfile, breakline = report(coroutine.yield('cont')) + --}}} + + elseif command == "goto" then + --{{{ step until reach line + local N = tonumber(args) + if N then + step_over = false + step_into = false + if has_breakpoint(breakfile,N) then + eval_env, breakfile, breakline = report(coroutine.yield('cont')) + else + local bf = breakfile + set_breakpoint(breakfile,N) + eval_env, breakfile, breakline = report(coroutine.yield('cont')) + if breakfile == bf and breakline == N then remove_breakpoint(breakfile,N) end + end + else + io.write("Bad request\n") + end + --}}} + + elseif command == "set" then + --{{{ set/show context level + local level = args + if level and level == '' then level = nil end + if level then + eval_env, breakfile, breakline = report(coroutine.yield(level)) + end + if eval_env.__VARSLEVEL__ then + io.write('Level: '..eval_env.__VARSLEVEL__..'\n') + else + io.write('No level set\n') + end + --}}} + + elseif command == "vars" then + --{{{ list context variables + local depth = args + if depth and depth == '' then depth = nil end + depth = tonumber(depth) or 1 + dumpvar(eval_env, depth+1, 'variables') + --}}} + + elseif command == "glob" then + --{{{ list global variables + local depth = args + if depth and depth == '' then depth = nil end + depth = tonumber(depth) or 1 + dumpvar(eval_env.__GLOBALS__,depth+1,'globals') + --}}} + + elseif command == "fenv" then + --{{{ list function environment variables + local depth = args + if depth and depth == '' then depth = nil end + depth = tonumber(depth) or 1 + dumpvar(eval_env.__ENVIRONMENT__,depth+1,'environment') + --}}} + + elseif command == "ups" then + --{{{ list upvalue names + dumpvar(eval_env.__UPVALUES__,2,'upvalues') + --}}} + + elseif command == "locs" then + --{{{ list locals names + dumpvar(eval_env.__LOCALS__,2,'upvalues') + --}}} + + elseif command == "what" then + --{{{ show where a function is defined + if args and args ~= '' then + local v = eval_env + local n = nil + for w in string.gmatch(args,"[%w_]+") do + v = v[w] + if n then n = n..'.'..w else n = w end + if not v then break end + end + if type(v) == 'function' then + local def = debug.getinfo(v,'S') + if def then + io.write(def.what..' in '..def.short_src..' '..def.linedefined..'..'..def.lastlinedefined..'\n') + else + io.write('Cannot get info for '..v..'\n') + end + else + io.write(v..' is not a function\n') + end + else + io.write("Bad request\n") + end + --}}} + + elseif command == "dump" then + --{{{ dump a variable + local name, depth = getargs('VN') + if name ~= '' then + if depth == '' or depth == 0 then depth = nil end + depth = tonumber(depth or 1) + local v = eval_env + local n = nil + for w in string.gmatch(name,"[^%.]+") do --get everything between dots + if tonumber(w) then + v = v[tonumber(w)] + else + v = v[w] + end + if n then n = n..'.'..w else n = w end + if not v then break end + end + dumpvar(v,depth+1,n) + else + io.write("Bad request\n") + end + --}}} + + elseif command == "show" then + --{{{ show file around a line or the current breakpoint + + local line, file, before, after = getargs('LFNN') + if before == 0 then before = 10 end + if after == 0 then after = before end + + if file ~= '' and file ~= "=stdin" then + show(file,line,before,after) + else + io.write('Nothing to show\n') + end + + --}}} + + elseif command == "poff" then + --{{{ turn pause command off + pause_off = true + --}}} + + elseif command == "pon" then + --{{{ turn pause command on + pause_off = false + --}}} + + elseif command == "tron" then + --{{{ turn tracing on/off + local option = getargs('S') + trace_calls = false + trace_returns = false + trace_lines = false + if string.find(option,'c') then trace_calls = true end + if string.find(option,'r') then trace_returns = true end + if string.find(option,'l') then trace_lines = true end + --}}} + + elseif command == "trace" then + --{{{ dump a stack trace + trace(eval_env.__VARSLEVEL__) + --}}} + + elseif command == "info" then + --{{{ dump all debug info captured + info() + --}}} + + elseif command == "pause" then + --{{{ not allowed in here + io.write('pause() should only be used in the script you are debugging\n') + --}}} + + elseif command == "help" then + --{{{ help + local command = getargs('S') + if command ~= '' and hints[command] then + io.write(hints[command]..'\n') + else + for _,v in pairs(hints) do + local _,_,h = string.find(v,"(.+)|") + io.write(h..'\n') + end + end + --}}} + + elseif command == "exit" then + --{{{ exit debugger + return 'stop' + --}}} + + elseif line ~= '' then + --{{{ just execute whatever it is in the current context + + --map line starting with "=..." to "return ..." + if string.sub(line,1,1) == '=' then line = string.gsub(line,'=','return ',1) end + + local ok, func = pcall(loadstring,line) + if func == nil then --Michael.Bringmann@lsi.com + io.write("Compile error: "..line..'\n') + elseif not ok then + io.write("Compile error: "..func..'\n') + else + setfenv(func, eval_env) + local res = {pcall(func)} + if res[1] then + if res[2] then + table.remove(res,1) + for _,v in ipairs(res) do + io.write(tostring(v)) + io.write('\t') + end + io.write('\n') + end + --update in the context + eval_env, breakfile, breakline = report(coroutine.yield(0)) + else + io.write("Run error: "..res[2]..'\n') + end + end + + --}}} + end + end + +end + +--}}} + +--{{{ coroutine.create + +--This function overrides the built-in for the purposes of propagating +--the debug hook settings from the creator into the created coroutine. + +_G.coroutine.create = function(f) + local thread + local hook, mask, count = debug.gethook() + if hook then + local function thread_hook(event,line) + hook(event,line,3,thread) + end + thread = cocreate(function(...) + stack_level[thread] = 0 + trace_level[thread] = 0 + step_level [thread] = 0 + debug.sethook(thread_hook,mask,count) + return f(...) + end) + return thread + else + return cocreate(f) + end +end + +--}}} +--{{{ coroutine.wrap + +--This function overrides the built-in for the purposes of propagating +--the debug hook settings from the creator into the created coroutine. + +_G.coroutine.wrap = function(f) + local thread + local hook, mask, count = debug.gethook() + if hook then + local function thread_hook(event,line) + hook(event,line,3,thread) + end + thread = cowrap(function(...) + stack_level[thread] = 0 + trace_level[thread] = 0 + step_level [thread] = 0 + debug.sethook(thread_hook,mask,count) + return f(...) + end) + return thread + else + return cowrap(f) + end +end + +--}}} + +--{{{ function pause() + +-- +-- Starts/resumes a debug session +-- + +function pause(x) + if pause_off then return end --being told to ignore pauses + pausemsg = x or 'pause' + local lines + local src = getinfo(2,'short_src') + if src == "stdin" then + lines = 1 --if in a console session, stop now + else + lines = 2 --if in a script, stop when get out of pause() + end + if started then + --we'll stop now 'cos the existing debug hook will grab us + step_lines = lines + step_into = true + else + coro_debugger = cocreate(debugger_loop) --NB: Use original coroutune.create + --set to stop when get out of pause() + trace_level[current_thread] = 0 + step_level [current_thread] = 0 + stack_level[current_thread] = 1 + step_lines = lines + step_into = true + started = true + debug.sethook(debug_hook, "crl") --NB: this will cause an immediate entry to the debugger_loop + end +end + +--}}} +--{{{ function dump() + +--shows the value of the given variable, only really useful +--when the variable is a table +--see dump debug command hints for full semantics + +function dump(v,depth) + dumpvar(v,(depth or 1)+1,tostring(v)) +end + +--}}} +--{{{ function debug.traceback(x) + +local _traceback = debug.traceback --note original function + +--override standard function +debug.traceback = function(x) + local assertmsg = _traceback(x) --do original function + pause(x) --let user have a look at stuff + return assertmsg --carry on +end + +_TRACEBACK = debug.traceback --Lua 5.0 function + +--}}} + diff --git a/ogl_editor/bin/win32/scripts/tundra/decl.lua b/ogl_editor/bin/win32/scripts/tundra/decl.lua new file mode 100644 index 0000000..9ede9c4 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/decl.lua @@ -0,0 +1,91 @@ +module(..., package.seeall) + +local nodegen = require "tundra.nodegen" + +local functions = {} +local _decl_meta = {} +_decl_meta.__index = _decl_meta + +local current = nil + +local function new_parser() + local obj = { + Functions = {}, + Results = {}, + DefaultTargets = {}, + AlwaysTargets = {}, + } + + local outer_env = _G + local iseval = nodegen.is_evaluator + local function indexfunc(tab, var) + if iseval(var) then + -- Return an anonymous function such that + -- the code "Foo { ... }" will result in a call to + -- "nodegen.evaluate('Foo', { ... })" + return function (data) + local result = nodegen.evaluate(var, data) + obj.Results[#obj.Results + 1] = result + return result + end + end + local p = obj.Functions[var] + if p then return p end + return outer_env[var] + end + + obj.FunctionMeta = { __index = indexfunc, __newindex = error } + obj.FunctionEnv = setmetatable({}, obj.FunctionMeta) + + for name, fn in pairs(functions) do + obj.Functions[name] = setfenv(fn, obj.FunctionEnv) + end + + obj.Functions["Default"] = function(default_obj) + obj.DefaultTargets[#obj.DefaultTargets + 1] = default_obj + end + + obj.Functions["Always"] = function(always_obj) + obj.AlwaysTargets[#obj.AlwaysTargets + 1] = always_obj + end + + current = setmetatable(obj, _decl_meta) + return current +end + +function add_function(name, fn) + assert(name and fn) + functions[name] = fn + + if current then + -- require called from within unit script + current.Functions[name] = setfenv(fn, current.FunctionEnv) + end +end + +function _decl_meta:parse_rec(data) + local chunk + if type(data) == "table" then + for _, gen in ipairs(data) do + self:parse_rec(gen) + end + return + elseif type(data) == "function" then + chunk = data + elseif type(data) == "string" then + chunk = assert(loadfile(data)) + else + croak("unknown type %s for unit_generator %q", type(data), tostring(data)) + end + + setfenv(chunk, self.FunctionEnv) + chunk() +end + +function parse(data) + p = new_parser() + current = p + p:parse_rec(data) + current = nil + return p.Results, p.DefaultTargets, p.AlwaysTargets +end diff --git a/ogl_editor/bin/win32/scripts/tundra/depgraph.lua b/ogl_editor/bin/win32/scripts/tundra/depgraph.lua new file mode 100644 index 0000000..d7a0bdf --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/depgraph.lua @@ -0,0 +1,155 @@ +module(..., package.seeall) + +local boot = require "tundra.boot" +local util = require "tundra.util" +local path = require "tundra.path" +local native = require "tundra.native" +local environment = require "tundra.environment" + +local default_pass = { Name = "Default", BuildOrder = 100000 } + +local all_nodes = {} + +local _node_mt = {} +_node_mt.__index = _node_mt + +function make_node(data_) + local env_ = data_.Env + assert(environment.is_environment(env_), "Env must be provided") + + local root_path = native.getcwd() .. env_:get('SEP') + + local function path_for_cmdline(p) + local full_path + if path.is_absolute(p) then + full_path = p + else + full_path = root_path .. p + end + if full_path:find(' ', 1, true) then + return '"' .. full_path .. '"' + else + return full_path + end + end + + local function normalize_paths(paths) + return util.mapnil(paths, function (x) + if type(x) == "string" then + local v = env_:interpolate(x) + v = path.normalize(v) + return v + else + return x + end + end) + end + + -- these are the inputs that $(<) expand to + local regular_inputs = normalize_paths(data_.InputFiles) + + -- these are other, auxillary input files that shouldn't appear on the command line + -- useful to e.g. add an input dependency on a tool + local implicit_inputs = normalize_paths(data_.ImplicitInputs) + + local inputs = util.merge_arrays_2(regular_inputs, implicit_inputs) + local outputs = normalize_paths(data_.OutputFiles) + + local inputs_sorted = inputs and util.clone_array(inputs) or {} + local outputs_sorted = outputs and util.clone_array(outputs) or {} + + local cmdline_inputs = util.merge_arrays(regular_inputs, data_.InputFilesUntracked) + + table.sort(inputs_sorted) + table.sort(outputs_sorted) + + -- Quote the paths before interpolation into the command line + local expand_env = { + ['<'] = util.mapnil(cmdline_inputs, path_for_cmdline), + ['@'] = util.mapnil(outputs, path_for_cmdline), + } + + local expand_env_pretty = { + ['<'] = cmdline_inputs, + ['@'] = outputs, + } + + local overwrite = true + if type(data_.OverwriteOutputs) ~= "nil" then + overwrite = data_.OverwriteOutputs + end + + if data_.Scanner and not data_.Scanner.Kind then + errorf("Missing scanner kind") + end + + -- make sure dependencies are unique + local unique_deps = util.uniq(data_.Dependencies or {}) + + local params = { + pass = data_.Pass or default_pass, + scanner = data_.Scanner, + deps = unique_deps, + inputs = inputs_sorted, + outputs = outputs_sorted, + is_precious = data_.Precious, + expensive = data_.Expensive, + overwrite_outputs = overwrite, + src_env = env_, + env = env_.external_vars, + aux_outputs = util.mapnil(data_.AuxOutputFiles, function (x) + local result = env_:interpolate(x, expand_env) + return path.normalize(result) + end), + } + + if data_.Action then + params.action = env_:interpolate(data_.Action, expand_env) + else + assert(0 == #params.outputs, "can't have output files without an action") + params.action = "" + end + + if data_.PreAction then + params.preaction = env_:interpolate(data_.PreAction, expand_env) + end + + params.annotation = env_:interpolate(data_.Label or "?", expand_env_pretty) + + local result = setmetatable(params, _node_mt) + + -- Stash node + all_nodes[#all_nodes + 1] = result + + return result +end + +function is_node(obj) + return getmetatable(obj) == _node_mt +end + +function _node_mt:insert_output_files(tab, exts) + if exts then + local lut = util.make_lookup_table(exts) + for _, fn in ipairs(self.outputs) do + local ext = path.get_extension(fn) + if lut[ext] then + tab[#tab + 1] = fn + end + end + else + for _, fn in ipairs(self.outputs) do + tab[#tab + 1] = fn + end + end +end + +function _node_mt:insert_deps(tab) + for _, dep in util.nil_ipairs(self.deps) do + tab[#tab + 1] = dep + end +end + +function get_all_nodes() + return all_nodes +end diff --git a/ogl_editor/bin/win32/scripts/tundra/dirwalk.lua b/ogl_editor/bin/win32/scripts/tundra/dirwalk.lua new file mode 100644 index 0000000..cfa067d --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/dirwalk.lua @@ -0,0 +1,41 @@ +module(..., package.seeall) + +local native = require "tundra.native" + +-- Stash of all dir walks performed for signature generation. +local query_records = {} + +function walk(path, filter_callback) + + local dir_stack = { path } + local paths_out = {} + + while #dir_stack > 0 do + local dir = dir_stack[#dir_stack] + table.remove(dir_stack) + + local subdirs, files = native.list_directory(dir) + query_records[dir] = { Files = files, SubDirs = subdirs } + + for _, subdir in ipairs(subdirs) do + full_dir_path = dir .. SEP .. subdir + if not filter_callback or filter_callback(subdir) then + table.insert(dir_stack, full_dir_path) + end + end + + for _, file in ipairs(files) do + table.insert(paths_out, dir .. SEP .. file) + end + end + + return paths_out +end + +function all_queries() + local result = {} + for k, v in pairs(query_records) do + result[#result + 1] = { Path = k, Files = v.Files, SubDirs = v.SubDirs } + end + return result +end diff --git a/ogl_editor/bin/win32/scripts/tundra/environment.lua b/ogl_editor/bin/win32/scripts/tundra/environment.lua new file mode 100644 index 0000000..7934620 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/environment.lua @@ -0,0 +1,316 @@ +module(..., package.seeall) + +local util = require 'tundra.util' +local path = require 'tundra.path' +local depgraph = require 'tundra.depgraph' +local nenv = require 'tundra.environment.native' +local os = require 'os' + +local global_setup = {} + +--[==[ + +The environment is a holder for variables and their associated values. Values +are always kept as tables, even if there is only a single value. + +FOO = { a b c } + +e:interpolate("$(FOO)") -> "a b c" +e:interpolate("$(FOO:j, )") -> "a, b, c" +e:interpolate("$(FOO:p-I)") -> "-Ia -Ib -Ic" + +Missing keys trigger errors unless a default value is specified. + +]==]-- + +local envclass = {} + +function envclass:create(parent, assignments, obj) + obj = obj or {} + setmetatable(obj, self) + self.__index = self + + obj.cached_interpolation = {} + obj.vars = {} + obj.parent = parent + obj.lookup = { obj.vars } + obj.memos = {} + obj.memo_keys = {} + obj.external_vars = parent and util.clone_table(parent.external_vars) or nil + + -- assign initial bindings + if assignments then + obj:set_many(assignments) + end + + return obj +end + +function envclass:clone(assignments) + return envclass:create(self, assignments) +end + +function envclass:register_implicit_make_fn(ext, fn, docstring) + if type(ext) ~= "string" then + errorf("extension must be a string") + end + if type(fn) ~= "function" then + errorf("fn must be a function") + end + + if not ext:match("^%.") then + ext = "." .. ext -- we want the dot in the extension + end + + if not self._implicit_exts then + self._implicit_exts = {} + end + + self._implicit_exts[ext] = { + Function = fn, + Doc = docstring or "", + } +end + +function envclass:get_implicit_make_fn(filename) + local ext = path.get_extension(filename) + local chain = self + while chain do + local t = chain._implicit_exts + if t then + local v = t[ext] + if v then return v.Function end + end + chain = chain.parent + end + return nil +end + +function envclass:has_key(key) + local chain = self + while chain do + if chain.vars[key] then + return true + end + chain = chain.parent + end + + return false +end + +function envclass:get_vars() + return self.vars +end + +function envclass:set_many(table) + for k, v in pairs(table) do + self:set(k, v) + end +end + +function envclass:append(key, value) + if type(value) ~= "string" then + error("environment append: " .. util.tostring(value) .. " is not a string", 2) + end + self:invalidate_memos(key) + local t = self:get_list(key, 1) + local result + if type(t) == "table" then + result = util.clone_array(t) + table.insert(result, value) + else + result = { value } + end + self.vars[key] = result +end + +function envclass:append_many(data) + for k, v in pairs(data) do + self:append(k, v) + end +end + +function envclass:replace(key, value) + if type(value) == "string" then + value = { value } + end + assert(type(value) == "table") + + self:invalidate_memos(key) + self.vars[key] = value +end + +function envclass:invalidate_memos(key) + self.cached_interpolation = {} + local name_tab = self.memo_keys[key] + if name_tab then + for name, _ in pairs(name_tab) do + self.memos[name] = nil + end + end +end + +function envclass:set_default(key, value) + if not self:has_key(key) then + self:set(key, value) + end +end + +function envclass:set_default_many(table) + for key, value in pairs(table) do + self:set_default(key, value) + end +end + +function envclass:set(key, value) + self:invalidate_memos(key) + assert(key:len() > 0, "key must not be empty") + assert(type(key) == "string", "key must be a string") + if type(value) == "string" then + if value:len() > 0 then + self.vars[key] = { value } + else + -- let empty strings make empty tables + self.vars[key] = {} + end + elseif type(value) == "table" then + -- FIXME: should filter out empty values + for _, v in ipairs(value) do + if not type(v) == "string" then + error("key " .. key .. "'s table value contains non-string value " .. tostring(v)) + end + end + self.vars[key] = util.clone_array(value) + else + error("key " .. key .. "'s value is neither table nor string: " .. tostring(value)) + end +end + +function envclass:get_id() + return self.id +end + +function envclass:get(key, default) + local v = self.vars[key] + if v then + return table.concat(v, " ") + elseif self.parent then + return self.parent:get(key, default) + elseif default then + return default + else + error(string.format("key '%s' not present in environment", key)) + end +end + +function envclass:get_list(key, default) + local v = self.vars[key] + if v then + return v -- FIXME: this should be immutable from the outside + elseif self.parent then + return self.parent:get_list(key, default) + elseif default then + return default + elseif not key then + error("nil key is not allowed") + else + error(string.format("key '%s' not present in environment", key)) + end +end + +function envclass:get_parent() + return self.parent +end + +function envclass:interpolate(str, vars) + local cached = self.cached_interpolation[str] + + if not cached then + cached = nenv.interpolate(str, self) + self.cached_interpolation[str] = cached + end + + if vars then + return nenv.interpolate(cached, self, vars) + else + return cached + end +end + +function create(parent, assignments, obj) + return envclass:create(parent, assignments, obj) +end + +function envclass:record_memo_var(key, name) + local tab = self.memo_keys[key] + if not tab then + tab = {} + self.memo_keys[key] = tab + end + tab[name] = true +end + +function envclass:memoize(key, name, fn) + local memo = self.memos[name] + if not memo then + self:record_memo_var(key, name) + memo = fn() + self.memos[name] = memo + end + return memo +end + +function envclass:get_external_env_var(key) + local chain = self + while chain do + local t = self.external_vars + if t then + local v = t[key] + if v then return v end + end + + chain = chain.parent + end + + return os.getenv(key) +end + +function envclass:set_external_env_var(key, value) + local t = self.external_vars + if not t then + t = {} + self.external_vars = t + end + t[key] = value +end + +function envclass:add_setup_function(fn) + local t = self.setup_funcs + if not t then + t = {} + self.setup_funcs = t + end + t[#t + 1] = fn +end + +function envclass:run_setup_functions() + for _, func in ipairs(global_setup) do + func(self) + end + t = self.setup_funcs + local chain = self + while chain do + for _, func in util.nil_ipairs(chain.setup_funcs) do + func(self) + end + chain = chain.parent + end +end + +function add_global_setup(fn) + global_setup[#global_setup + 1] = fn +end + +function is_environment(datum) + return getmetatable(datum) == envclass +end diff --git a/ogl_editor/bin/win32/scripts/tundra/host/freebsd.lua b/ogl_editor/bin/win32/scripts/tundra/host/freebsd.lua new file mode 100644 index 0000000..87cade2 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/host/freebsd.lua @@ -0,0 +1,11 @@ +module(..., package.seeall) + +function apply_host(env) + env:set_many { + ["DOTNETRUN"] = "mono ", + ["HOSTPROGSUFFIX"] = "", + ["HOSTSHLIBSUFFIX"] = ".so", + ["_COPY_FILE"] = "cp -f $(<) $(@)", + ["_HARDLINK_FILE"] = "ln -f $(<) $(@)", + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/host/linux.lua b/ogl_editor/bin/win32/scripts/tundra/host/linux.lua new file mode 100644 index 0000000..87cade2 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/host/linux.lua @@ -0,0 +1,11 @@ +module(..., package.seeall) + +function apply_host(env) + env:set_many { + ["DOTNETRUN"] = "mono ", + ["HOSTPROGSUFFIX"] = "", + ["HOSTSHLIBSUFFIX"] = ".so", + ["_COPY_FILE"] = "cp -f $(<) $(@)", + ["_HARDLINK_FILE"] = "ln -f $(<) $(@)", + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/host/macosx.lua b/ogl_editor/bin/win32/scripts/tundra/host/macosx.lua new file mode 100644 index 0000000..81d2c59 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/host/macosx.lua @@ -0,0 +1,11 @@ +module(..., package.seeall) + +function apply_host(env) + env:set_many { + ["DOTNETRUN"] = "mono ", + ["HOSTPROGSUFFIX"] = "", + ["HOSTSHLIBSUFFIX"] = ".dylib", + ["_COPY_FILE"] = "cp -f $(<) $(@)", + ["_HARDLINK_FILE"] = "ln -f $(<) $(@)", + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/host/openbsd.lua b/ogl_editor/bin/win32/scripts/tundra/host/openbsd.lua new file mode 100644 index 0000000..87cade2 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/host/openbsd.lua @@ -0,0 +1,11 @@ +module(..., package.seeall) + +function apply_host(env) + env:set_many { + ["DOTNETRUN"] = "mono ", + ["HOSTPROGSUFFIX"] = "", + ["HOSTSHLIBSUFFIX"] = ".so", + ["_COPY_FILE"] = "cp -f $(<) $(@)", + ["_HARDLINK_FILE"] = "ln -f $(<) $(@)", + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/host/windows.lua b/ogl_editor/bin/win32/scripts/tundra/host/windows.lua new file mode 100644 index 0000000..dd5d2de --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/host/windows.lua @@ -0,0 +1,11 @@ +module(..., package.seeall) + +function apply_host(env) + env:set_many { + ["DOTNETRUN"] = "", + ["HOSTPROGSUFFIX"] = ".exe", + ["HOSTSHLIBSUFFIX"] = ".dll", + ["_COPY_FILE"] = "copy $(<) $(@)", + ["_HARDLINK_FILE"] = "copy /f $(<) $(@)", + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/ide/msvc-common.lua b/ogl_editor/bin/win32/scripts/tundra/ide/msvc-common.lua new file mode 100644 index 0000000..4f78bfe --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/ide/msvc-common.lua @@ -0,0 +1,864 @@ +module(..., package.seeall) + +local native = require "tundra.native" +local nodegen = require "tundra.nodegen" +local path = require "tundra.path" +local util = require "tundra.util" + +LF = '\r\n' +local UTF_HEADER = '\239\187\191' -- byte mark EF BB BF + +local VERSION_NUMBER = "12.00" +local VERSION_YEAR = "2012" +local HOOKS = {} + +local msvc_generator = {} +msvc_generator.__index = msvc_generator + +local project_types = util.make_lookup_table { + "Program", "SharedLibrary", "StaticLibrary", "CSharpExe", "CSharpLib", "ObjGroup", +} + +local toplevel_stuff = util.make_lookup_table { + ".exe", ".lib", ".dll", +} + +local binary_extension = util.make_lookup_table { + ".exe", ".lib", ".dll", ".pdb", ".res", ".obj", ".o", ".a", +} + +local header_exts = util.make_lookup_table { + ".h", ".hpp", ".hh", ".inl", +} + +-- Scan for sources, following dependencies until those dependencies seem to be +-- a different top-level unit +local function get_sources(dag, sources, generated, level, dag_lut) + for _, output in util.nil_ipairs(dag.outputs) do + local ext = path.get_extension(output) + if not binary_extension[ext] then + generated[output] = true + sources[output] = true -- pick up generated headers + end + end + + for _, input in util.nil_ipairs(dag.inputs) do + local ext = path.get_extension(input) + if not binary_extension[ext] then + sources[input] = true + end + end + + for _, dep in util.nil_ipairs(dag.deps) do + if not dag_lut[dep] then -- don't go into other top-level DAGs + get_sources(dep, sources, generated, level + 1, dag_lut) + end + end +end + +function get_guid_string(data) + local sha1 = native.digest_guid(data) + local guid = sha1:sub(1, 8) .. '-' .. sha1:sub(9,12) .. '-' .. sha1:sub(13,16) .. '-' .. sha1:sub(17,20) .. '-' .. sha1:sub(21, 32) + assert(#guid == 36) + return guid:upper() +end + +local function get_headers(unit, source_lut, dag_lut, name_to_dags) + local src_dir = '' + + if not unit.Decl then + -- Ignore ExternalLibrary and similar that have no data. + return + end + + if unit.Decl.SourceDir then + src_dir = unit.Decl.SourceDir .. '/' + end + for _, src in util.nil_ipairs(nodegen.flatten_list('*-*-*-*', unit.Decl.Sources)) do + if type(src) == "string" then + local ext = path.get_extension(src) + if header_exts[ext] then + local full_path = path.normalize(src_dir .. src) + source_lut[full_path] = true + end + end + end + + local function toplevel(u) + if type(u) == "string" then + return type(name_to_dags[u]) ~= "nil" + end + + for _, dag in pairs(u.Decl.__DagNodes) do + if dag_lut[dag] then + return true + end + end + return false + end + + -- Repeat for dependencies ObjGroups + for _, dep in util.nil_ipairs(nodegen.flatten_list('*-*-*-*', unit.Decl.Depends)) do + + if not toplevel(dep) then + get_headers(dep, source_lut, dag_lut) + end + end +end + +local function make_meta_project(base_dir, data) + data.Guid = get_guid_string(data.Name) + data.IdeGenerationHints = { Msvc = { SolutionFolder = "Build System Meta" } } + data.IsMeta = true + data.RelativeFilename = data.Name .. ".vcxproj" + data.Filename = base_dir .. data.RelativeFilename + data.Type = "meta" + if not data.Sources then + data.Sources = {} + end + return data +end + +local function tundra_cmdline(args) + local root_dir = native.getcwd() + return "\"" .. TundraExePath .. "\" -C \"" .. root_dir .. "\" " .. args +end + +local function project_regen_commandline(ide_script) + return tundra_cmdline("-g " .. ide_script) +end + +local function make_project_data(units_raw, env, proj_extension, hints, ide_script) + + -- Filter out stuff we don't care about. + local units = util.filter(units_raw, function (u) + return u.Decl.Name and project_types[u.Keyword] + end) + + local base_dir = hints.MsvcSolutionDir and (hints.MsvcSolutionDir .. '\\') or env:interpolate('$(OBJECTROOT)$(SEP)') + native.mkdir(base_dir) + + local project_by_name = {} + local all_sources = {} + local dag_node_lut = {} -- lookup table of all named, top-level DAG nodes + local name_to_dags = {} -- table mapping unit name to array of dag nodes (for configs) + + -- Map out all top-level DAG nodes + for _, unit in ipairs(units) do + local decl = unit.Decl + + local dag_nodes = assert(decl.__DagNodes, "no dag nodes for " .. decl.Name) + for build_id, dag_node in pairs(dag_nodes) do + dag_node_lut[dag_node] = unit + local array = name_to_dags[decl.Name] + if not array then + array = {} + name_to_dags[decl.Name] = array + end + array[#array + 1] = dag_node + end + end + + local function get_output_project(name) + if not project_by_name[name] then + local relative_fn = name .. proj_extension + project_by_name[name] = { + Name = name, + Sources = {}, + RelativeFilename = relative_fn, + Filename = base_dir .. relative_fn, + Guid = get_guid_string(name), + BuildByDefault = hints.BuildAllByDefault, + } + end + return project_by_name[name] + end + + -- Sort units based on dependency complexity. We want to visit the leaf nodes + -- first so that any source file references are picked up as close to the + -- bottom of the dependency chain as possible. + local unit_weights = {} + for _, unit in ipairs(units) do + local decl = unit.Decl + local stack = { } + for _, dag in pairs(decl.__DagNodes) do + stack[#stack + 1] = dag + end + local weight = 0 + while #stack > 0 do + local node = table.remove(stack) + if dag_node_lut[node] then + weight = weight + 1 + end + for _, dep in util.nil_ipairs(node.deps) do + stack[#stack + 1] = dep + end + end + unit_weights[unit] = weight + end + + table.sort(units, function (a, b) + return unit_weights[a] < unit_weights[b] + end) + + -- Keep track of what source files have already been grabbed by other projects. + local grabbed_sources = {} + + for _, unit in ipairs(units) do + local decl = unit.Decl + local name = decl.Name + + local source_lut = {} + local generated_lut = {} + for build_id, dag_node in pairs(decl.__DagNodes) do + get_sources(dag_node, source_lut, generated_lut, 0, dag_node_lut) + end + + -- Explicitly add all header files too as they are not picked up from the DAG + -- Also pick up headers from non-toplevel DAGs we're depending on + get_headers(unit, source_lut, dag_node_lut, name_to_dags) + + -- Figure out which project should get this data. + local output_name = name + local ide_hints = unit.Decl.IdeGenerationHints + if ide_hints then + if ide_hints.OutputProject then + output_name = ide_hints.OutputProject + end + end + + local proj = get_output_project(output_name) + + if output_name == name then + -- This unit is the real thing for this project, not something that's + -- just being merged into it (like an ObjGroup). Set some more attributes. + proj.IdeGenerationHints = ide_hints + proj.DagNodes = decl.__DagNodes + proj.Unit = unit + end + + for src, _ in pairs(source_lut) do + local norm_src = path.normalize(src) + if not grabbed_sources[norm_src] then + grabbed_sources[norm_src] = unit + local is_generated = generated_lut[src] + proj.Sources[#proj.Sources+1] = { + Path = norm_src, + Generated = is_generated, + } + end + end + end + + -- Get all accessed Lua files + local accessed_lua_files = util.table_keys(get_accessed_files()) + + -- Filter out the ones that belong to this build (exclude ones coming from Tundra) + local function is_non_tundra_lua_file(p) + return not path.is_absolute(p) + end + local function make_src_node(p) + return { Path = path.normalize(p) } + end + local source_list = util.map(util.filter(accessed_lua_files, is_non_tundra_lua_file), make_src_node) + + local solution_hints = hints.MsvcSolutions + if not solution_hints then + print("No IdeGenerationHints.MsvcSolutions specified - using defaults") + solution_hints = { + ['tundra-generated.sln'] = {} + } + end + + local projects = util.table_values(project_by_name) + local vanilla_projects = util.clone_array(projects) + + local solutions = {} + + -- Create meta project to regenerate solutions/projects. Added to every solution. + local regen_meta_proj = make_meta_project(base_dir, { + Name = "00-Regenerate-Projects", + FriendlyName = "Regenerate Solutions and Projects", + BuildCommand = project_regen_commandline(ide_script), + }) + + projects[#projects + 1] = regen_meta_proj + + for name, data in pairs(solution_hints) do + local sln_projects + local ext_projects = {} + if data.Projects then + sln_projects = {} + for _, pname in ipairs(data.Projects) do + local pp = project_by_name[pname] + if not pp then + errorf("can't find project %s for inclusion in %s -- check your MsvcSolutions data", pname, name) + end + sln_projects[#sln_projects + 1] = pp + end + else + -- All the projects (that are not meta) + sln_projects = util.clone_array(vanilla_projects) + end + + for _, ext in util.nil_ipairs(data.ExternalProjects) do + ext_projects[#ext_projects + 1] = ext + end + + local meta_proj = make_meta_project(base_dir, { + Name = "00-tundra-" .. path.drop_suffix(name), + FriendlyName = "Build This Solution", + BuildByDefault = true, + Sources = source_list, + BuildProjects = util.clone_array(sln_projects), + }) + + sln_projects[#sln_projects + 1] = regen_meta_proj + sln_projects[#sln_projects + 1] = meta_proj + projects[#projects + 1] = meta_proj + + solutions[#solutions + 1] = { + Filename = base_dir .. name, + Projects = sln_projects, + ExternalProjects = ext_projects, + BuildSolutionProject = meta_proj, + } + end + + return solutions, projects +end + +local cl_tags = { + ['.h'] = 'ClInclude', + ['.hh'] = 'ClInclude', + ['.hpp'] = 'ClInclude', + ['.inl'] = 'ClInclude', +} + +local function slurp_file(fn) + local fh, err = io.open(fn, 'rb') + if fh then + local data = fh:read("*all") + fh:close() + return data + end + return '' +end + +local function replace_if_changed(new_fn, old_fn) + local old_data = slurp_file(old_fn) + local new_data = slurp_file(new_fn) + if old_data == new_data then + os.remove(new_fn) + return + end + printf("Updating %s", old_fn) + os.remove(old_fn) + os.rename(new_fn, old_fn) +end + +function msvc_generator:generate_solution(fn, projects, ext_projects, solution) + local sln = io.open(fn .. '.tmp', 'wb') + sln:write(UTF_HEADER, LF, "Microsoft Visual Studio Solution File, Format Version ", VERSION_NUMBER, LF, "# Visual Studio ", VERSION_YEAR, LF) + + -- Map folder names to array of projects under that folder + local sln_folders = {} + for _, proj in ipairs(projects) do + local hints = proj.IdeGenerationHints + local msvc_hints = hints and hints.Msvc or nil + local folder = msvc_hints and msvc_hints.SolutionFolder or nil + if folder then + local projects = sln_folders[folder] or {} + projects[#projects + 1] = proj + sln_folders[folder] = projects + end + end + + for _, proj in ipairs(projects) do + local name = proj.Name + local fname = proj.RelativeFilename + local guid = proj.Guid + sln:write(string.format('Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "%s", "%s", "{%s}"', name, fname, guid), LF) + sln:write('EndProject', LF) + end + + -- Dump external projects. Make them depend on everything in this solution being built by Tundra. + for _, data in util.nil_ipairs(ext_projects) do + local guid = data.Guid + local fname = path.normalize(path.join(native.getcwd(), data.Filename)) + local name = path.get_filename_base(fname) + sln:write(string.format('Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "%s", "%s", "{%s}"', name, fname, guid), LF) + local build_sln_proj = solution.BuildSolutionProject + if build_sln_proj then + local meta_guid = build_sln_proj.Guid + sln:write('\tProjectSection(ProjectDependencies) = postProject', LF) + sln:write('\t\t{', meta_guid,'} = {', meta_guid,'}', LF) + sln:write('\tEndProjectSection', LF) + end + sln:write('EndProject', LF) + end + + for folder_name, _ in pairs(sln_folders) do + local folder_guid = get_guid_string("folder/" .. folder_name) + sln:write(string.format('Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "%s", "%s", "{%s}"', folder_name, folder_name, folder_guid), LF) + sln:write('EndProject', LF) + end + + sln:write("Global", LF) + sln:write("\tGlobalSection(SolutionConfigurationPlatforms) = preSolution", LF) + for _, tuple in ipairs(self.config_tuples) do + sln:write(string.format('\t\t%s = %s', tuple.MsvcName, tuple.MsvcName), LF) + end + sln:write("\tEndGlobalSection", LF) + + sln:write("\tGlobalSection(ProjectConfigurationPlatforms) = postSolution", LF) + for _, proj in ipairs(projects) do + for _, tuple in ipairs(self.config_tuples) do + local leader = string.format('\t\t{%s}.%s.', proj.Guid, tuple.MsvcName) + sln:write(leader, "ActiveCfg = ", tuple.MsvcName, LF) + if proj.BuildByDefault then + sln:write(leader, "Build.0 = ", tuple.MsvcName, LF) + end + end + end + + -- External projects build by default, and after Tundra is done (depends on "Build this solution"). + for _, proj in util.nil_ipairs(ext_projects) do + for _, tuple in ipairs(self.config_tuples) do + local leader = string.format('\t\t{%s}.%s.', proj.Guid, tuple.MsvcName) + sln:write(leader, "ActiveCfg = ", tuple.MsvcName, LF) + if not proj.Platform or proj.Platform == tuple.MsvcPlatform then + sln:write(leader, "Build.0 = ", tuple.MsvcName, LF) + end + end + end + sln:write("\tEndGlobalSection", LF) + + sln:write("\tGlobalSection(SolutionProperties) = preSolution", LF) + sln:write("\t\tHideSolutionNode = FALSE", LF) + sln:write("\tEndGlobalSection", LF) + + sln:write("\tGlobalSection(NestedProjects) = preSolution", LF) + for folder_name, projects in pairs(sln_folders) do + local folder_guid = get_guid_string("folder/" .. folder_name) + for _, project in ipairs(projects) do + sln:write(string.format('\t\t{%s} = {%s}', project.Guid, folder_guid), LF) + end + end + sln:write("\tEndGlobalSection", LF) + + sln:write("EndGlobal", LF) + sln:close() + + replace_if_changed(fn .. ".tmp", fn) +end + +local function find_dag_node_for_config(project, tuple) + local build_id = string.format("%s-%s-%s", tuple.Config.Name, tuple.Variant.Name, tuple.SubVariant) + local nodes = project.DagNodes + if not nodes then + return nil + end + + if nodes[build_id] then + return nodes[build_id] + end + errorf("couldn't find config %s for project %s (%d dag nodes) - available: %s", + build_id, project.Name, #nodes, table.concat(util.table_keys(nodes), ", ")) +end + +function msvc_generator:generate_project(project, all_projects) + local fn = project.Filename + local p = assert(io.open(fn .. ".tmp", 'wb')) + p:write('', LF) + p:write('', LF) + + -- List all project configurations + p:write('\t', LF) + for _, tuple in ipairs(self.config_tuples) do + p:write('\t\t', LF) + p:write('\t\t\t', tuple.MsvcConfiguration, '', LF) + p:write('\t\t\t', tuple.MsvcPlatform, '', LF) + p:write('\t\t', LF) + end + p:write('\t', LF) + + p:write('\t', LF) + p:write('\t\t{', project.Guid, '}', LF) + p:write('\t\tMakeFileProj', LF) + if project.FriendlyName then + p:write('\t\t', project.FriendlyName, '', LF) + end + + if HOOKS.global_properties then + HOOKS.global_properties(p, project) + end + + p:write('\t', LF) + p:write('\t', LF) + if VERSION_YEAR == '2012' then + p:write('\t\t<_ProjectFileVersion>10.0.30319.1', LF) + end + p:write('\t', LF) + + p:write('\t', LF) + + -- Mark all project configurations as makefile-type projects + for _, tuple in ipairs(self.config_tuples) do + p:write('\t', LF) + p:write('\t\tMakefile', LF) + p:write('\t\ttrue', LF) -- I have no idea what this setting affects + if VERSION_YEAR == '2012' then + p:write('\t\tv110', LF) -- I have no idea what this setting affects + elseif VERSION_YEAR == '2013' then + p:write('\t\tv120', LF) -- I have no idea what this setting affects + end + p:write('\t', LF) + end + + p:write('\t', LF) + + for _, tuple in ipairs(self.config_tuples) do + p:write('\t', LF) + + local dag_node = find_dag_node_for_config(project, tuple) + local include_paths, defines + if dag_node then + local env = dag_node.src_env + local paths = util.map(env:get_list("CPPPATH"), function (p) + local ip = path.normalize(env:interpolate(p)) + if not path.is_absolute(ip) then + ip = native.getcwd() .. '\\' .. ip + end + return ip + end) + include_paths = table.concat(paths, ';') + local ext_paths = env:get_external_env_var('INCLUDE') + if ext_paths then + include_paths = include_paths .. ';' .. ext_paths + end + defines = env:interpolate("$(CPPDEFS:j;)") + else + include_paths = '' + defines = '' + end + + local root_dir = native.getcwd() + local build_id = string.format("%s-%s-%s", tuple.Config.Name, tuple.Variant.Name, tuple.SubVariant) + local base = "\"" .. TundraExePath .. "\" -C \"" .. root_dir .. "\" " + local build_cmd = base .. build_id + local clean_cmd = base .. "--clean " .. build_id + local rebuild_cmd = base .. "--rebuild " .. build_id + + if project.BuildCommand then + build_cmd = project.BuildCommand + clean_cmd = "" + rebuild_cmd = "" + elseif not project.IsMeta then + build_cmd = build_cmd .. " " .. project.Name + clean_cmd = clean_cmd .. " " .. project.Name + rebuild_cmd = rebuild_cmd .. " " .. project.Name + else + local all_projs_str = table.concat( + util.map(assert(project.BuildProjects), function (p) return p.Name end), ' ') + build_cmd = build_cmd .. " " .. all_projs_str + clean_cmd = clean_cmd .. " " .. all_projs_str + rebuild_cmd = rebuild_cmd .. " " .. all_projs_str + end + + p:write('\t\t', build_cmd, '', LF) + p:write('\t\t', LF) + p:write('\t\t', clean_cmd, '', LF) + p:write('\t\t', rebuild_cmd, '', LF) + p:write('\t\t', defines, ';$(NMakePreprocessorDefinitions)', LF) + p:write('\t\t', include_paths, ';$(NMakeIncludeSearchPath)', LF) + p:write('\t\t$(NMakeForcedIncludes)', LF) + p:write('\t', LF) + end + + if HOOKS.pre_sources then + HOOKS.pre_sources(p, project) + end + + -- Emit list of source files + p:write('\t', LF) + for _, record in ipairs(project.Sources) do + local path_str = assert(record.Path) + if not path.is_absolute(path_str) then + path_str = native.getcwd() .. '\\' .. path_str + end + local ext = path.get_extension(path_str) + local cl_tag = cl_tags[ext] or 'ClCompile' + p:write('\t\t<', cl_tag,' Include="', path_str, '" />', LF) + end + p:write('\t', LF) + + local post_src_hook = HOOKS.post_sources + if post_src_hook then + post_src_hook(p, project) + end + + p:write('\t', LF) + + if VERSION_YEAR == "2012" then + -- Import helper msbuild stuff to make build aborting work propertly in VS2012 + local xml = path.normalize(TundraScriptDir .. '/tundra/ide/msvc-rules.xml') + p:write('\t', LF) + end + + p:write('', LF) + p:close() + + replace_if_changed(fn .. ".tmp", fn) +end + +local function get_common_dir(sources) + local dir_tokens = {} + for _, src in ipairs(sources) do + local path = assert(src.Path) + if not tundra.path.is_absolute(path) then + local subdirs = {} + for subdir in path:gmatch("([^\\\]+)\\") do + subdirs[#subdirs + 1] = subdir + end + + if #dir_tokens == 0 then + dir_tokens = subdirs + else + for i = 1, #dir_tokens do + if dir_tokens[i] ~= subdirs[i] then + while #dir_tokens >= i do + table.remove(dir_tokens) + end + break + end + end + end + end + end + + local result = table.concat(dir_tokens, '\\') + if #result > 0 then + result = result .. '\\' + end + return result +end + +function msvc_generator:generate_project_filters(project) + local fn = project.Filename .. ".filters" + local p = assert(io.open(fn .. ".tmp", 'wb')) + p:write('', LF) + p:write('', LF) + + local common_dir = get_common_dir(util.filter(project.Sources, function (s) return not s.Generated end)) + local common_dir_gen = get_common_dir(util.filter(project.Sources, function (s) return s.Generated end)) + + local filters = {} + local sources = {} + + -- Mangle source filenames, and find which filters need to be created + for _, record in ipairs(project.Sources) do + local fn = record.Path + local common_start = record.Generated and common_dir_gen or common_dir + if fn:find(common_start, 1, true) then + fn = fn:sub(#common_start+1) + end + + local dir, filename = path.split(fn) + + if dir == '.' then + dir = nil + end + + local abs_path = record.Path + if not path.is_absolute(abs_path) then + abs_path = native.getcwd() .. '\\' .. abs_path + end + + if record.Generated then + dir = 'Generated Files' + end + + sources[#sources + 1] = { + FullPath = abs_path, + Directory = dir, + } + + -- Register filter and all its parents + while dir and dir ~= '.' do + filters[dir] = true + dir, _ = path.split(dir) + end + end + + -- Emit list of filters + p:write('\t', LF) + for filter_name, _ in pairs(filters) do + if filter_name ~= "" then + filter_guid = get_guid_string(filter_name) + p:write('\t\t', LF) + p:write('\t\t\t{', filter_guid, '}', LF) + p:write('\t\t', LF) + end + end + p:write('\t', LF) + + -- Emit list of source files + p:write('\t', LF) + for _, source in ipairs(sources) do + local ext = path.get_extension(source.FullPath) + local cl_tag = cl_tags[ext] or 'ClCompile' + if not source.Directory then + p:write('\t\t<', cl_tag, ' Include="', source.FullPath, '" />', LF) + else + p:write('\t\t<', cl_tag, ' Include="', source.FullPath, '">', LF) + p:write('\t\t\t', source.Directory, '', LF) + p:write('\t\t', LF) + end + end + p:write('\t', LF) + + p:write('', LF) + + p:close() + + replace_if_changed(fn .. ".tmp", fn) +end + +function msvc_generator:generate_project_user(project) + local fn = project.Filename .. ".user" + -- Don't overwrite user settings + do + local p, err = io.open(fn, 'rb') + if p then + p:close() + return + end + end + + local p = assert(io.open(fn, 'wb')) + p:write('', LF) + p:write('', LF) + + for _, tuple in ipairs(self.config_tuples) do + local dag_node = find_dag_node_for_config(project, tuple) + if dag_node then + local exe = nil + for _, output in util.nil_ipairs(dag_node.outputs) do + if output:match("%.exe") then + exe = output + break + end + end + if exe then + p:write('\t', LF) + p:write('\t\t', native.getcwd() .. '\\' .. exe, '', LF) + p:write('\t\tWindowsLocalDebugger', LF) + p:write('\t\t', native.getcwd(), '', LF) + p:write('\t', LF) + end + end + end + + p:write('', LF) + + p:close() +end + +function msvc_generator:generate_files(ngen, config_tuples, raw_nodes, env, default_names, hints, ide_script) + assert(config_tuples and #config_tuples > 0) + + if not hints then + hints = {} + end + + local complained_mappings = {} + + self.msvc_platforms = {} + local msvc_hints = hints.Msvc or {} + local variant_mappings = msvc_hints.VariantMappings or {} + local platform_mappings = msvc_hints.PlatformMappings or {} + local full_mappings = msvc_hints.FullMappings or {} + + for _, tuple in ipairs(config_tuples) do + local build_id = string.format("%s-%s-%s", tuple.Config.Name, tuple.Variant.Name, tuple.SubVariant) + if full_mappings[build_id] then + local m = full_mappings[build_id] + tuple.MsvcConfiguration = assert(m.Config) + tuple.MsvcPlatform = assert(m.Platform) + elseif variant_mappings[tuple.Variant.Name] then + tuple.MsvcConfiguration = variant_mappings[tuple.Variant.Name] + elseif variant_mappings[tuple.Variant.Name .. "-" .. tuple.SubVariant] then + tuple.MsvcConfiguration = variant_mappings[tuple.Variant.Name .. "-" .. tuple.SubVariant] + else + tuple.MsvcConfiguration = tuple.Variant.Name + end + + -- Use IdeGenerationHints.Msvc.PlatformMappings table to map tundra + -- configurations to MSVC platform names. Note that this isn't a huge deal + -- for building stuff as Tundra doesn't care about this setting. But it + -- might influence the choice of debugger and affect include paths for + -- things like Intellisense that certain users may care about. + if not tuple.MsvcPlatform then + tuple.MsvcPlatform = platform_mappings[tuple.Config.Name] + end + + -- If we didn't find anything, warn and then default to Win32, which VS + -- will always accept (or so one would assume) + if not tuple.MsvcPlatform then + tuple.MsvcPlatform = "Win32" + if not complained_mappings[tuple.Config.Name] then + printf("warning: No VS platform mapping for %s, mapping to Win32", tuple.Config.Name) + print("(Add one to IdeGenerationHints.Msvc.PlatformMappings to override)") + complained_mappings[tuple.Config.Name] = true + end + end + tuple.MsvcName = tuple.MsvcConfiguration .. "|" .. tuple.MsvcPlatform + self.msvc_platforms[tuple.MsvcPlatform] = true + end + + self.config_tuples = config_tuples + + printf("Generating Visual Studio projects for %d configurations/variants", #config_tuples) + + -- Figure out where we're going to store the projects + local solutions, projects = make_project_data(raw_nodes, env, ".vcxproj", hints, ide_script) + + local proj_lut = {} + for _, p in ipairs(projects) do + proj_lut[p.Name] = p + end + + for _, sln in pairs(solutions) do + self:generate_solution(sln.Filename, sln.Projects, sln.ExternalProjects, sln) + end + + for _, proj in ipairs(projects) do + self:generate_project(proj, projects) + self:generate_project_filters(proj) + self:generate_project_user(proj) + end +end + +function setup(version_short, version_year, hooks) + VERSION_NUMBER = version_short + VERSION_YEAR = version_year + if hooks then + HOOKS = hooks + end + nodegen.set_ide_backend(function(...) + local state = setmetatable({}, msvc_generator) + state:generate_files(...) + end) +end + diff --git a/ogl_editor/bin/win32/scripts/tundra/ide/msvc-rules.xml b/ogl_editor/bin/win32/scripts/tundra/ide/msvc-rules.xml new file mode 100644 index 0000000..b62155d --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/ide/msvc-rules.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + { + if (line.Data != null) + Log.LogMessageFromText(line.Data, MessageImportance.High); + }; + p.ErrorDataReceived += (object sender, DataReceivedEventArgs line) => { + if (line.Data != null) + Log.LogMessageFromText(line.Data, MessageImportance.High); + }; + p.Start(); + p.BeginOutputReadLine(); + p.BeginErrorReadLine(); + + while (!p.WaitForExit(100)) + { + if (m_Cancel) + { + // Keep sending CTRL+C events - sometimes it takes more than one.. + GenerateConsoleCtrlEvent(ConsoleCtrlEvent.CTRL_C, 0); + } + } + + p.WaitForExit(); + return m_Cancel ? false : p.ExitCode == 0; + } + } + catch(Exception e) + { + Console.WriteLine(e); + return false; + } + } + } + ]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GetNativeTargetPath;%(Targets) + + + + + + + + + + + obj + lib + dll + xdc + + + + + + + $(TargetPath) + + + + + + + + + + + + + + Project + + + + + PropertySheet + + + + diff --git a/ogl_editor/bin/win32/scripts/tundra/ide/msvc100.lua b/ogl_editor/bin/win32/scripts/tundra/ide/msvc100.lua new file mode 100644 index 0000000..f2381b5 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/ide/msvc100.lua @@ -0,0 +1,7 @@ +-- Microsoft Visual Studio 2010 Solution/Project file generation + +module(..., package.seeall) + +local msvc_common = require "tundra.ide.msvc-common" +msvc_common.setup("11.00", "2010") + diff --git a/ogl_editor/bin/win32/scripts/tundra/ide/msvc110.lua b/ogl_editor/bin/win32/scripts/tundra/ide/msvc110.lua new file mode 100644 index 0000000..1410de9 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/ide/msvc110.lua @@ -0,0 +1,7 @@ +-- Microsoft Visual Studio 2012 Solution/Project file generation + +module(..., package.seeall) + +local msvc_common = require "tundra.ide.msvc-common" + +msvc_common.setup("12.00", "2012") diff --git a/ogl_editor/bin/win32/scripts/tundra/ide/msvc120.lua b/ogl_editor/bin/win32/scripts/tundra/ide/msvc120.lua new file mode 100644 index 0000000..14f55f2 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/ide/msvc120.lua @@ -0,0 +1,7 @@ +-- Microsoft Visual Studio 2013 Solution/Project file generation + +module(..., package.seeall) + +local msvc_common = require "tundra.ide.msvc-common" + +msvc_common.setup("12.00", "2013") diff --git a/ogl_editor/bin/win32/scripts/tundra/ide/xcode3.lua b/ogl_editor/bin/win32/scripts/tundra/ide/xcode3.lua new file mode 100644 index 0000000..643fe72 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/ide/xcode3.lua @@ -0,0 +1,735 @@ +-- Xcode 3 (works in 4 as well) Workspace/Project file generation + +module(..., package.seeall) + +local path = require "tundra.path" +local nodegen = require "tundra.nodegen" +local util = require "tundra.util" +local native = require "tundra.native" + +local xcode_generator = {} +local xcode_generator = {} +xcode_generator.__index = xcode_generator + +function xcode_generator:generate_workspace(fn, projects) + local sln = io.open(fn, 'wb') + + sln:write('\n') + sln:write('\n') + + for _, proj in ipairs(projects) do + local name = proj.Decl.Name + local fname = proj.RelativeFilename + if fname == '.' then fname = '' + else fname = fname ..'/' + end + sln:write('\t\n') + sln:write('\t\n') + end + + sln:write('\n') +end + +local project_types = util.make_lookup_table { + "Program", "SharedLibrary", "StaticLibrary", +} + +local function get_absolute_output_path(env) + local base_dir = env:interpolate('$(OBJECTROOT)$(SEP)') + local cwd = native.getcwd() + return cwd .. "/" .. base_dir +end + +local function newid(data) + local string = native.digest_guid(data) + -- a bit ugly but is to match the xcode style of UIds + return string.sub(string.gsub(string, '-', ''), 1, 24) +end + +local function getfiletype(name) + local types = { + [".c"] = "sourcecode.c.c", + [".cc"] = "sourcecode.cpp.cpp", + [".cpp"] = "sourcecode.cpp.cpp", + [".css"] = "text.css", + [".cxx"] = "sourcecode.cpp.cpp", + [".framework"] = "wrapper.framework", + [".gif"] = "image.gif", + [".h"] = "sourcecode.c.h", + [".html"] = "text.html", + [".lua"] = "sourcecode.lua", + [".m"] = "sourcecode.c.objc", + [".mm"] = "sourcecode.cpp.objc", + [".nib"] = "wrapper.nib", + [".pch"] = "sourcecode.c.h", + [".plist"] = "text.plist.xml", + [".strings"] = "text.plist.strings", + [".xib"] = "file.xib", + [".icns"] = "image.icns", + [""] = "compiled.mach-o.executable", + } + return types[path.get_extension(name)] or "text" +end + + +local function get_project_data(unit, env) + local decl = unit.Decl + + if decl.Name and project_types[unit.Keyword] then + + local relative_fn = decl.Name + local sources = util.flatten(decl.Sources) or {} + sources = util.filter(sources, function (x) return type(x) == "string" end) + + if decl.SourceDir then + sources = util.map(sources, function (x) return decl.SourceDir .. x end) + end + + local source_list = {} + + -- Rebuild source list with ids that is needed by the xcode project layout + for _, fn in ipairs(sources) do + source_list[newid(fn)] = fn + end + + return { + Type = unit.Keyword, + Decl = decl, + Sources = source_list, + RelativeFilename = relative_fn, + Guid = newid(decl.Name .. "ProjectId"), + } + + elseif unit.Keyword == "OsxBundle" then + + decl.Name = "OsxBundle" + + local source_list = {} + + source_list[newid(decl.InfoPList)] = decl.InfoPList + + for _, resource in ipairs(decl.Resources) do + if resource.Decl then + source_list[newid(resource.Decl.Source)] = resource.Decl.Source + end + end + + return { + Type = unit.Keyword, + Decl = decl, + Sources = source_list, + RelativeFilename = "$(OBJECTDIR)/MyApp.app", + Guid = newid("OsxBundle"), + } + else + return nil + end +end + +local function sort_filelist(source_list) + local dest = {} + for k, v in pairs(source_list) do table.insert(dest, { Key = k, Value = v }) end + table.sort(dest, function(a, b) return a.Value < b.Value end) + return dest +end + +local function write_file_refs(p, projects) + p:write('/* Begin FBXFileReference section */\n') + local cwd = native.getcwd(); + + -- build the source list + + local full_source_list = {} + + for _, project in pairs(projects) do + local sources = project.Sources + for key, fn in pairs(sources) do + full_source_list[key] = fn + end + + -- include executable names in the source list as well + + if project.Type == "Program" then + full_source_list[newid(project.Decl.Name .. "Program")] = project.Decl.Name + end + end + + local source_list = {} + + -- As we can't sort hashtables we need to move this over to a regular table + + source_list = sort_filelist(full_source_list) + + for _, entry in pairs(source_list) do + local key = entry.Key + local fn = entry.Value + local name = path.get_filename(fn) + local file_type = getfiletype(fn) + local str = "" + if file_type == "compiled.mach-o.executable" then + str = string.format('\t\t%s /* %s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = %s; name = "%s"; includeInIndex = 0; path = "%s"; sourceTree = BUILT_PRODUCTS_DIR; };', + key, fn, file_type, name, fn) + else + str = string.format('\t\t%s /* %s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = %s; name = "%s"; path = "%s"; sourceTree = ""; };', + key, fn, file_type, name, path.join(cwd, fn)) + end + p:write(str, '\n') + end + + p:write('/* End FBXFileReference section */\n\n') +end + +local function write_legacy_targets(p, projects, env) + p:write('/* Begin PBXLegacyTarget section */\n') + + local script_path = get_absolute_output_path(env) + + for _, project in pairs(projects) do + local decl = project.Decl + + if project.IsMeta then + --[[ + isa = PBXLegacyTarget; + buildArgumentsString = ""; + buildConfigurationList = D7D12762170E4CF98A79B5EF /* Build configuration list for PBXLegacyTarget "!UpdateWorkspace" */; + buildPhases = ( + ); + buildToolPath = /Users/danielcollin/unity_ps3/ps3/Projects/JamGenerated/_workspace.xcode_/updateworkspace; + dependencies = ( + ); + name = "!UpdateWorkspace"; + passBuildSettingsInEnvironment = 1; + productName = "!UpdateWorkspace"; + --]] + + p:write('\t\t', newid(decl.Name .. "Target"), ' /* ', decl.Name, ' */ = {\n') + p:write('\t\t\tisa = PBXLegacyTarget;\n') + p:write('\t\t\tbuildArgumentsString = "', project.MetaData.BuildArgs, '";\n') + p:write('\t\t\tbuildConfigurationList = ', newid(decl.Name .. 'Config'), ' /* Build configuration list for PBXLegacyTarget "',decl.Name, '" */;\n') + p:write('\t\t\tbuildPhases = (\n') + p:write('\t\t\t);\n'); + p:write('\t\t\tbuildToolPath = ', script_path .. project.MetaData.BuildTool, ';\n') + p:write('\t\t\tdependencies = (\n\t\t\t);\n') + p:write('\t\t\tname = "', decl.Name, '";\n') + p:write('\t\t\tpassBuildSettingsInEnvironment = 1;\n') + p:write('\t\t\tproductName = "', decl.Name or "", '";\n') + p:write('\t\t};\n') + end + end + + p:write('/* End PBXLegacyTarget section */\n') +end + +local function write_native_targes(p, projects) + p:write('/* Begin PBXNativeTarget section */\n') + + local categories = { + ["Program"] = "com.apple.product-type.tool", + ["StaticLibrary"] = "com.apple.product-type.library.static", + ["SharedLibrary"] = "com.apple.product-type.library.dynamic", + } + + for _, project in pairs(projects) do + local decl = project.Decl + + if not project.IsMeta then + p:write('\t\t', newid(decl.Name .. "Target"), ' /* ', decl.Name, ' */ = {\n') + p:write('\t\t\tisa = PBXNativeTarget;\n') + p:write('\t\t\tbuildConfigurationList = ', newid(decl.Name .. 'Config'), ' /* Build configuration list for PBXNativeTarget "',decl.Name, '" */;\n') + p:write('\t\t\tbuildPhases = (\n') + p:write('\t\t\t\t', newid(decl.Name .. "ShellScript"), ' /* ShellScript */,\n') + p:write('\t\t\t);\n'); + p:write('\t\t\tbuildRules = (\n\t\t\t);\n') + p:write('\t\t\tdependencies = (\n\t\t\t);\n') + p:write('\t\t\tname = "', decl.Name, '";\n') + p:write('\t\t\tProductName = "', decl.Name, '";\n') + p:write('\t\t\tproductReference = ', newid(decl.Name .. "Program"), ' /* ', decl.Name, ' */;\n ') + p:write('\t\t\tproductType = "', categories[project.Type] or "", '";\n') + p:write('\t\t};\n') + end + end + + p:write('/* End PBXNativeTarget section */\n') +end + + +local function write_header(p) + p:write('// !$*UTF8*$!\n') + p:write('{\n') + p:write('\tarchiveVersion = 1;\n') + p:write('\tclasses = {\n') + p:write('\t};\n') + p:write('\tobjectVersion = 45;\n') + p:write('\tobjects = {\n') + p:write('\n') +end + +local function get_projects(raw_nodes, env) + local projects = {} + + local source_list = {} + source_list[newid("tundra.lua")] = "tundra.lua" + local units = io.open("units.lua") + if units then + source_list[newid("units.lua")] = "units.lua" + io.close(units) + end + + local meta_name = "!BuildWorkspace" + + projects[#projects + 1] = { + Decl = { Name = meta_name, }, + Type = "LegacyTarget", + RelativeFilename = "", + Sources = source_list, + Guid = newid(meta_name .. 'ProjectId'), + IsMeta = true, + MetaData = { BuildArgs = "'' $(CONFIG) $(VARIANT) $(SUBVARIANT) $(ACTION)", + BuildTool = "xcodetundra" }, + } + + local meta_name = "!UpdateWorkspace" + + projects[#projects + 1] = { + Decl = { Name = "!UpdateWorkspace", }, + Type = "LegacyTarget", + RelativeFilename = "", + Sources = source_list, + Guid = newid(meta_name .. 'ProjectId'), + IsMeta = true, + MetaData = { BuildArgs = "", + BuildTool = "xcodeupdateproj" }, + } + + for _, unit in ipairs(raw_nodes) do + local data = get_project_data(unit, env) + if data then projects[#projects + 1] = data; end + end + + return projects +end + +local function split(fn) + local dir, file = fn:match("^(.*)[/\\]([^\\/]*)$") + if not dir then + return ".", fn + else + return dir, file + end +end + +local function split_str(str, pat, name) + local t = {} -- NOTE: use {n = 0} in Lua-5.0 + local fpat = "(.-)" .. pat + local last_end = 1 + local s, e, cap = str:find(fpat, 1) + table.insert(t,name) + while s do + if s ~= 1 or cap ~= "" then + table.insert(t,cap) + end + last_end = e+1 + s, e, cap = str:find(fpat, last_end) + end + if last_end <= #str then + cap = str:sub(last_end) + table.insert(t, cap) + end + return t +end + +local function build_name_id(entry, offset, end_count) + local entryname = "" + for p = offset, end_count, 1 do + if entry[p] ~= nil then + entryname = entryname .. entry[p] + end + end + return newid(entryname) +end + + +local function make_indent(level) + local indent = '\t'; + for i=1, level, 1 do + indent = indent .. '\t' + end + return indent +end + +local function make_full_path( grp ) + + local full_path_string = grp.Name + local gparent = grp.Parent + while gparent ~= nil do + full_path_string = gparent.Name ..'/'..full_path_string + gparent = gparent.Parent + end + return full_path_string .. ' : ' .. grp.Key +end + +local function write_group_ref(p, g, full_path) + + p:write('\t\t', g.Key, ' /* ', full_path .. '/' .. g.Name, ' */ = {\n') + p:write('\t\t\tisa = PBXGroup;\n') + p:write('\t\t\tchildren = (\n') + + local dirs = {} + local files = {} + + for _, ref in pairs(g.Children) do + if ref.IsDir then + local key = ref.Key + dirs[#dirs + 1] = { Key = key, Name = ref.Name } + else + local key = ref.Key + files[#files + 1] = { Key = key, Name = ref.Name } + end + end + + table.sort(dirs, function(a, b) return a.Name < b.Name end) + table.sort(files, function(a, b) return a.Name < b.Name end) + + for _, ref in pairs(dirs) do + p:write(string.format('\t\t\t\t%s /* %s */,\n', ref.Key, full_path .. '/' .. ref.Name)) + end + + for _, ref in pairs(files) do + p:write(string.format('\t\t\t\t%s /* %s */,\n', ref.Key, full_path .. '/' .. ref.Name)) + end + + p:write('\t\t\t);\n') + p:write('\t\t\tname = "', g.Name, '"; \n'); + p:write('\t\t\tsourceTree = "";\n'); + p:write('\t\t};\n') +end + +local function print_children_2(p, children, path, level) + if children == nil then + return path + end + + local c + local local_path = ''--path + for _, c in pairs(children) do + local indent = make_indent(level) + local_path = print_children_2( p, c.Children, path .. '/' .. c.Name, level + 1 ) + if #c.Children ~= 0 then + write_group_ref(p, c, path) + end + + end + + return path +end + +local function find_group(groups, group, parent) + if groups == nil then return nil end + for _, g in pairs(groups) do + if g.Name == group and g.Parent == parent then + return g + end + local r = find_group( g.Children, group, parent ) + if r ~= nil then return r end + end + return nil +end + +local function write_sources(p, children, name, parent) + + local filelist = sort_filelist(children) + local groups = {}; + + table.insert(groups, {Name = name, Parent = nil, Key = parent, Children = {} }) + + for _, entry in pairs(filelist) do + local parent_group = nil + local path, filename = split(entry.Value) + local split_path = split_str(path, "/", name) + for i=1 , #split_path, 1 do + if split_path[i] ~= '.' then + local grp = find_group(groups, split_path[i], parent_group) + if grp == nil then + grp = { IsDir = true, Name=split_path[i], Parent=parent_group, Key=newid(util.tostring(parent_group)..split_path[i]), Children={} } + if parent_group == nil then + table.insert(groups, grp) + else + parent_group = grp.Parent + table.insert(parent_group.Children, grp) + end + end + parent_group = grp + end + end + if parent_group ~= nil then + table.insert(parent_group.Children, { IsDir = false, Name=filename, Parent=parent_group, Key = entry.Key, Children = {}} ) + end + end + + print_children_2(p, groups, '.', 0); +end + + +local function write_groups(p, projects) + p:write('/* Begin PBXGroup section */\n') + + local all_targets_name = "AllTargets.workspace" + local all_targets_id = newid(all_targets_name) + + for _, project in pairs(projects) do + write_sources(p, project.Sources, project.Decl.Name, project.Guid) + end + + -- write last group that links the projects names above + + p:write('\t\t', all_targets_id, ' /* ', all_targets_name, ' */ = {\n') + p:write('\t\t\tisa = PBXGroup;\n') + p:write('\t\t\tchildren = (\n') + + for _, project in pairs(projects) do + p:write(string.format('\t\t\t\t%s /* %s */,\n', project.Guid, project.Decl.Name)) + end + p:write('\t\t\t);\n') + p:write('\t\t\tname = "', all_targets_name, '"; \n'); + p:write('\t\t\tsourceTree = "";\n'); + p:write('\t\t};\n') + + p:write('/* End PBXGroup section */\n\n') +end + +local function write_project(p, projects) + + local all_targets_name = "AllTargets.workspace" + local all_targets_id = newid(all_targets_name) + + local project_id = newid("ProjectObject") + local project_config_list_id = newid("ProjectObjectConfigList") + + p:write('/* Begin PBXProject section */\n') + p:write('\t\t', project_id, ' /* Project object */ = {\n') + p:write('\t\t\tisa = PBXProject;\n') + p:write('\t\t\tbuildConfigurationList = ', project_config_list_id, ' /* Build configuration list for PBXProject "', "Project Object", '" */;\n') + p:write('\t\t\tcompatibilityVersion = "Xcode 3.1";\n') + p:write('\t\t\thasScannedForEncodings = 1;\n') + p:write('\t\t\tmainGroup = ', all_targets_id, ' /* ', all_targets_name, ' */;\n') + p:write('\t\t\tprojectDirPath = "";\n') + p:write('\t\t\tprojectRoot = "";\n') + p:write('\t\t\ttargets = (\n') + + for _, project in pairs(projects) do + p:write(string.format('\t\t\t\t%s /* %s */,\n', newid(project.Decl.Name .. "Target"), project.Decl.Name)) + end + + p:write('\t\t\t);\n') + p:write('\t\t};\n') + p:write('/* End PBXProject section */\n') +end + +local function write_shellscripts(p, projects, env) + p:write('/* Begin PBXShellScriptBuildPhase section */\n') + + -- TODO: Do we really need to repead this for all projects? seems a bit wasteful + + local xcodetundra_filename = get_absolute_output_path(env) .. "xcodetundra" + + for _, project in pairs(projects) do + local name = project.Decl.Name + if not project.IsMeta then + p:write('\t\t', newid(name .. "ShellScript"), ' /* ShellScript */ = {\n') + p:write('\t\t\tisa = PBXShellScriptBuildPhase;\n') + p:write('\t\t\tbuildActionMask = 2147483647;\n') + p:write('\t\t\tfiles = (\n') + p:write('\t\t\t);\n') + p:write('\t\t\tinputPaths = (\n') + p:write('\t\t\t);\n') + p:write('\t\t\toutputPaths = (\n') + p:write('\t\t\t);\n') + p:write('\t\t\trunOnlyForDeploymentPostprocessing = 0;\n') + p:write('\t\t\tshellPath = /bin/sh;\n') + p:write('\t\t\tshellScript = "', xcodetundra_filename, ' $TARGET_NAME $CONFIG $VARIANT $SUBVARIANT $ACTION -v";\n') + p:write('\t\t};\n') + end + end + + p:write('/* Begin PBXShellScriptBuildPhase section */\n') +end + +local function get_full_config_name(config) + return config.Config.Name .. '-' .. config.Variant.Name .. '-' .. config.SubVariant +end + +local function write_configs(p, projects, config_tuples, env) + + p:write('/* Begin XCConfigurationList section */\n') + + -- I wonder if we really need to do it this way for all configs? + + for __, project in ipairs(projects) do + for _, tuple in ipairs(config_tuples) do + local full_config_name = get_full_config_name(tuple) + + local is_macosx_native = false + + for _, host in util.nil_ipairs(tuple.Config.SupportedHosts) do + if host == "macosx" then + is_macosx_native = true + end + end + + if "macosx" == tuple.Config.DefaultOnHost then + is_macosx_native = true + end + + local config_id = newid(project.Decl.Name .. full_config_name) + + p:write('\t\t', config_id, ' = {\n') + p:write('\t\t\tisa = XCBuildConfiguration;\n') + + -- Don't add any think extra if subvariant is default + + p:write('\t\t\tbuildSettings = {\n') + + if is_macosx_native then + p:write('\t\t\t\tARCHS = "$(NATIVE_ARCH_ACTUAL)";\n') + end + + p:write('\t\t\t\tVARIANT = "', tuple.Variant.Name, '";\n') + p:write('\t\t\t\tCONFIG = "', tuple.Config.Name, '";\n') + p:write('\t\t\t\tSUBVARIANT = "', tuple.SubVariant, '";\n') + + if is_macosx_native and not project.IsMeta then + p:write('\t\t\t\tCONFIGURATION_BUILD_DIR = "', full_config_name, '";\n') + end + + -- this is a little hack to get xcode to clean the whole output folder when using "FullBuild" + p:write('\t\t\t\tPRODUCT_NAME = "',project.Decl.Name , '";\n') + p:write('\t\t\t\tTARGET_NAME = "',project.Decl.Name , '";\n') + + p:write('\t\t\t};\n') + p:write('\t\t\tname = "',full_config_name , '";\n') + p:write('\t\t};\n') + end + end + + p:write('/* End XCConfigurationList section */\n') + +end + +local function write_config_list(p, projects, config_tuples) + + p:write('/* Begin XCConfigurationList section */\n') + + local default_config = ""; + + -- find the default config + + for _, tuple in ipairs(config_tuples) do + local is_macosx_native = tuple.Config.Name:match('^(%macosx)%-') + + if is_macosx_native and tuple.Variant.Name == "debug" then + default_config = get_full_config_name(tuple) + break + end + end + + -- if we did't find a default config just grab the first one + + if default_config == "" then + default_config = get_full_config_name(config_tuples[0]) + end + + for __, project in ipairs(projects) do + + local config_id = newid(project.Decl.Name .. 'Config') + + p:write('\t\t', config_id, ' /* Build config list for "', project.Decl.Name, '" */ = {\n') + p:write('\t\t\tisa = XCConfigurationList;\n') + + -- Don't add any think extra if subvariant is default + + p:write('\t\t\tbuildConfigurations = (\n') + + for _, tuple in ipairs(config_tuples) do + local full_config_name = get_full_config_name(tuple) + p:write(string.format('\t\t\t\t%s /* %s */,\n', newid(project.Decl.Name .. full_config_name), full_config_name)) + end + + p:write('\t\t\t);\n') + p:write('\t\t\tdefaultConfigurationIsVisible = 1;\n') + p:write('\t\t\tdefaultConfigurationName = "', default_config, '";\n') + + p:write('\t\t};\n') + end + + p:write('/* End XCConfigurationList section */\n') + +end + +local function write_footer(p) + p:write('\t};\n') + p:write('\trootObject = ', newid("ProjectObject"), ' /* Project object */;\n') + p:write('}\n') +end + +local function generate_shellscript(env) + local filename = path.join(get_absolute_output_path(env), "xcodetundra") + local p = assert(io.open(filename, 'wb')) + p:write("#/bin/sh\n") + p:write("TARGET_NAME=$1\n") + p:write("CONFIG=$2\n") + p:write("VARIANT=$3\n") + p:write("SUBVARIANT=$4\n") + p:write("ACTION=$5\n") + p:write('if [ "$5" = "clean" ]; then\n') + p:write(' ACTION="-c"\n') + p:write("fi\n\n") + p:write('if [ "$5" = "build" ]; then\n') + p:write(' ACTION=""\n') + p:write("fi\n\n") + p:write(TundraExePath .. " --full-paths $TARGET_NAME $CONFIG-$VARIANT-$SUBVARIANT $ACTION -v\n") + p:close() + os.execute("chmod +x " .. filename) + local filename = path.join(get_absolute_output_path(env), "xcodeupdateproj") + local p = io.open(filename, 'wb') + p:write("#/bin/sh\n") + p:write(TundraExePath .. " --ide-gen xcode3 -a\n") + p:close() + os.execute("chmod +x " .. filename) +end + +function xcode_generator:generate_files(ngen, config_tuples, raw_nodes, env, default_names) + assert(config_tuples and #config_tuples > 0) + + -- TODO: Set the first default config as default + + local base_dir = env:interpolate('$(OBJECTROOT)$(SEP)') + local xcodeproj_dir = base_dir .. "tundra-generated.xcodeproj/" + + native.mkdir(base_dir) + native.mkdir(xcodeproj_dir) + + generate_shellscript(env) + + local p = io.open(path.join(xcodeproj_dir, "project.pbxproj"), 'wb') + + local projects = get_projects(raw_nodes, env) + + write_header(p) + write_file_refs(p, projects) + write_groups(p, projects) + write_legacy_targets(p, projects, env) + write_native_targes(p, projects) + write_project(p, projects) + write_shellscripts(p, projects, env) + write_configs(p, projects, config_tuples, env) + write_config_list(p, projects, config_tuples) + write_footer(p) +end + +nodegen.set_ide_backend(function(...) + local state = setmetatable({}, xcode_generator) + state:generate_files(...) +end) + diff --git a/ogl_editor/bin/win32/scripts/tundra/ide/xcode5.lua b/ogl_editor/bin/win32/scripts/tundra/ide/xcode5.lua new file mode 100644 index 0000000..6fb5353 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/ide/xcode5.lua @@ -0,0 +1,924 @@ +-- Xcode 5 Workspace/Project file generation + +module(..., package.seeall) + +local path = require "tundra.path" +local nodegen = require "tundra.nodegen" +local util = require "tundra.util" +local native = require "tundra.native" + +local xcode_generator = {} +xcode_generator.__index = xcode_generator + +function xcode_generator:generate_workspace(fn, projects) + local sln = io.open(fn, 'wb') + + sln:write('\n') + sln:write('\n') + + for _, proj in ipairs(projects) do + local name = proj.Decl.Name + local fname = proj.RelativeFilename + if fname == '.' then fname = '' + else fname = fname ..'/' + end + sln:write('\t\n') + sln:write('\t\n') + end + + sln:write('\n') +end + +local project_types = util.make_lookup_table { + "Program", "SharedLibrary", "StaticLibrary", +} +local toplevel_stuff = util.make_lookup_table { + ".exe", ".lib", ".dll", +} + +local binary_extension = util.make_lookup_table { + "", ".obj", ".o", ".a", +} + +local header_exts = util.make_lookup_table { + ".h", ".hpp", ".hh", ".inl", +} + +local function newid(data) + local string = native.digest_guid(data) + -- a bit ugly but is to match the xcode style of UIds + return string.sub(string.gsub(string, '-', ''), 1, 24) +end + +local file_types = { + [".c"] = "sourcecode.c.c", + [".cc"] = "sourcecode.cpp.cpp", + [".cpp"] = "sourcecode.cpp.cpp", + [".css"] = "text.css", + [".cxx"] = "sourcecode.cpp.cpp", + [".framework"] = "wrapper.framework", + [".gif"] = "image.gif", + [".h"] = "sourcecode.c.h", + [".html"] = "text.html", + [".lua"] = "sourcecode.lua", + [".m"] = "sourcecode.c.objc", + [".mm"] = "sourcecode.cpp.objc", + [".nib"] = "wrapper.nib", + [".pch"] = "sourcecode.c.h", + [".plist"] = "text.plist.xml", + [".strings"] = "text.plist.strings", + [".xib"] = "file.xib", + [".icns"] = "image.icns", + [""] = "compiled.mach-o.executable", +} + +local function getfiletype(name) + return file_types[path.get_extension(name)] or "text" +end + +-- Scan for sources, following dependencies until those dependencies seem to be a different top-level unit +local function get_sources(dag, sources, generated, dag_lut) + for _, output in ipairs(dag.outputs) do + local ext = path.get_extension(output) + if not binary_extension[ext] then + generated[output] = true + sources[output] = true -- pick up generated headers + end + end + + for _, input in ipairs(dag.inputs) do + local ext = path.get_extension(input) + if not binary_extension[ext] then + sources[input] = true + end + end + + for _, dep in util.nil_ipairs(dag.deps) do + if not dag_lut[dep] then -- don't go into other top-level DAGs + get_sources(dep, sources, generated, dag_lut) + end + end +end + +local function get_headers(unit, sources, dag_lut, name_to_dags) + local src_dir = '' + + if not unit.Decl then + -- Ignore ExternalLibrary and similar that have no data. + return + end + + if unit.Decl.SourceDir then + src_dir = unit.Decl.SourceDir .. '/' + end + for _, src in util.nil_ipairs(nodegen.flatten_list('*-*-*-*', unit.Decl.Sources)) do + if type(src) == "string" then + local ext = path.get_extension(src) + if header_exts[ext] then + local full_path = path.normalize(src_dir .. src) + sources[full_path] = true + end + end + end + + local function toplevel(u) + if type(u) == "string" then + return type(name_to_dags[u]) ~= "nil" + end + + for _, dag in pairs(u.Decl.__DagNodes) do + if dag_lut[dag] then + return true + end + end + return false + end + + -- Repeat for dependencies ObjGroups + for _, dep in util.nil_ipairs(nodegen.flatten_list('*-*-*-*', unit.Decl.Depends)) do + + if not toplevel(dep) then + get_headers(dep, sources, dag_lut) + end + end +end + +local function sort_filelist(source_list) + local dest = {} + for k, v in pairs(source_list) do table.insert(dest, { Key = k, Value = v }) end + table.sort(dest, function(a, b) return a.Value < b.Value end) + return dest +end + +local function write_file_refs(p, projects) + p:write('/* Begin FBXFileReference section */\n') + local cwd = native.getcwd(); + + -- build the source list + + local full_source_list = {} + + for _, project in ipairs(projects) do + local sources = project.Sources + for key, fn in pairs(sources) do + full_source_list[key] = fn + end + + -- include executable names in the source list as well + + if project.Type == "Program" then + full_source_list[newid(project.Decl.Name .. "Program")] = project.Decl.Name + end + end + + local source_list = {} + + -- As we can't sort hashtables we need to move this over to a regular table + + source_list = sort_filelist(full_source_list) + + for _, entry in pairs(source_list) do + local key = entry.Key + local fn = entry.Value + local name = path.get_filename(fn) + local file_type = getfiletype(fn) + local str = "" + if file_type == "compiled.mach-o.executable" then + str = string.format('\t\t%s /* %s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = %s; name = "%s"; includeInIndex = 0; path = "%s"; sourceTree = BUILT_PRODUCTS_DIR; };', + key, fn, file_type, name, fn) + else + str = string.format('\t\t%s /* %s */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = %s; name = "%s"; path = "%s"; sourceTree = ""; };', + key, fn, file_type, name, path.join(cwd, fn)) + end + p:write(str, '\n') + end + + p:write('/* End FBXFileReference section */\n\n') +end + +local function write_legacy_targets(p, projects, env) + p:write('/* Begin PBXLegacyTarget section */\n') + + for _, project in ipairs(projects) do + local decl = project.Decl + + if project.IsMeta then + --[[ + isa = PBXLegacyTarget; + buildArgumentsString = ""; + buildConfigurationList = D7D12762170E4CF98A79B5EF /* Build configuration list for PBXLegacyTarget "!UpdateWorkspace" */; + buildPhases = ( + ); + buildToolPath = /Users/danielcollin/unity_ps3/ps3/Projects/JamGenerated/_workspace.xcode_/updateworkspace; + dependencies = ( + ); + name = "!UpdateWorkspace"; + passBuildSettingsInEnvironment = 1; + productName = "!UpdateWorkspace"; + --]] + + p:write('\t\t', newid(decl.Name .. "Target"), ' /* ', decl.Name, ' */ = {\n') + p:write('\t\t\tisa = PBXLegacyTarget;\n') + p:write('\t\t\tbuildArgumentsString = "', project.MetaData.BuildArgs, '";\n') + p:write('\t\t\tbuildConfigurationList = ', newid(decl.Name .. 'Config'), ' /* Build configuration list for PBXLegacyTarget "',decl.Name, '" */;\n') + p:write('\t\t\tbuildPhases = (\n') + p:write('\t\t\t);\n'); + p:write('\t\t\tbuildToolPath = ', project.MetaData.BuildTool, ';\n') + p:write('\t\t\tbuildWorkingDirectory = ', '..', ';\n') + + p:write('\t\t\tdependencies = (\n\t\t\t);\n') + p:write('\t\t\tname = "', decl.Name, '";\n') + p:write('\t\t\tpassBuildSettingsInEnvironment = 1;\n') + p:write('\t\t\tproductName = "', decl.Name or "", '";\n') + p:write('\t\t};\n') + end + end + + p:write('/* End PBXLegacyTarget section */\n') +end + +local function write_native_targes(p, projects) + p:write('/* Begin PBXNativeTarget section */\n') + + local categories = { + ["Program"] = "com.apple.product-type.tool", + ["StaticLibrary"] = "com.apple.product-type.library.static", + ["SharedLibrary"] = "com.apple.product-type.library.dynamic", + } + + for _, project in ipairs(projects) do + local decl = project.Decl + + if not project.IsMeta then + p:write('\t\t', newid(decl.Name .. "Target"), ' /* ', decl.Name, ' */ = {\n') + p:write('\t\t\tisa = PBXNativeTarget;\n') + p:write('\t\t\tbuildConfigurationList = ', newid(decl.Name .. 'Config'), ' /* Build configuration list for PBXNativeTarget "',decl.Name, '" */;\n') + p:write('\t\t\tbuildPhases = (\n') + p:write('\t\t\t\t', newid(decl.Name .. "ShellScript"), ' /* ShellScript */,\n') + p:write('\t\t\t);\n'); + p:write('\t\t\tbuildRules = (\n\t\t\t);\n') + p:write('\t\t\tdependencies = (\n\t\t\t);\n') + p:write('\t\t\tname = "', decl.Name, '";\n') + p:write('\t\t\tProductName = "', decl.Name, '";\n') + p:write('\t\t\tproductReference = ', newid(decl.Name .. "Program"), ' /* ', decl.Name, ' */;\n ') + p:write('\t\t\tproductType = "', categories[project.Type] or "", '";\n') + p:write('\t\t};\n') + end + end + + p:write('/* End PBXNativeTarget section */\n') +end + + +local function write_header(p) + p:write('// !$*UTF8*$!\n') + p:write('{\n') + p:write('\tarchiveVersion = 1;\n') + p:write('\tclasses = {\n') + p:write('\t};\n') + p:write('\tobjectVersion = 45;\n') + p:write('\tobjects = {\n') + p:write('\n') +end + +local function get_projects(raw_nodes, env, hints, ide_script) + local projects = {} + + -- Filter out stuff we don't care about. + local units = util.filter(raw_nodes, function (u) + return u.Decl.Name and project_types[u.Keyword] + end) + + local dag_node_lut = {} -- lookup table of all named, top-level DAG nodes + local name_to_dags = {} -- table mapping unit name to array of dag nodes (for configs) + + -- Map out all top-level DAG nodes + for _, unit in ipairs(units) do + local decl = unit.Decl + + local dag_nodes = assert(decl.__DagNodes, "no dag nodes for " .. decl.Name) + for build_id, dag_node in pairs(dag_nodes) do + dag_node_lut[dag_node] = unit + local array = name_to_dags[decl.Name] + if not array then + array = {} + name_to_dags[decl.Name] = array + end + array[#array + 1] = dag_node + end + end + + -- Sort units based on dependency complexity. We want to visit the leaf nodes + -- first so that any source file references are picked up as close to the + -- bottom of the dependency chain as possible. + local unit_weights = {} + for _, unit in ipairs(units) do + local decl = unit.Decl + local stack = { } + for _, dag in pairs(decl.__DagNodes) do + stack[#stack + 1] = dag + end + local weight = 0 + while #stack > 0 do + local node = table.remove(stack) + if dag_node_lut[node] then + weight = weight + 1 + end + for _, dep in util.nil_ipairs(node.deps) do + stack[#stack + 1] = dep + end + end + unit_weights[unit] = weight + end + + table.sort(units, function (a, b) + return unit_weights[a] < unit_weights[b] + end) + + -- Keep track of what source files have already been grabbed by other projects. + local grabbed_sources = {} + + for _, unit in ipairs(units) do + local decl = unit.Decl + local name = decl.Name + + local sources = {} + local generated = {} + for build_id, dag_node in pairs(decl.__DagNodes) do + get_sources(dag_node, sources, generated, dag_node_lut) + end + + -- Explicitly add all header files too as they are not picked up from the DAG + -- Also pick up headers from non-toplevel DAGs we're depending on + get_headers(unit, sources, dag_node_lut, name_to_dags) + + -- Figure out which project should get this data. + local output_name = name + local ide_hints = unit.Decl.IdeGenerationHints + if ide_hints then + if ide_hints.OutputProject then + output_name = ide_hints.OutputProject + end + end + + -- Rebuild source list with ids that are needed by the xcode project layout + local source_list = {} + for src, _ in pairs(sources) do + local norm_src = path.normalize(src) + -- if not grabbed_sources[norm_src] then + grabbed_sources[norm_src] = unit + source_list[newid(norm_src)] = norm_src + -- end + end + + projects[name] = { + Type = unit.Keyword, + Decl = decl, + Sources = source_list, + RelativeFilename = name, + Guid = newid(name .. "ProjectId"), + IdeGenerationHints = unit.Decl.IdeGenerationHints + } + end + + for _, unit in ipairs(raw_nodes) do + if unit.Keyword == "OsxBundle" then + local decl = unit.Decl + decl.Name = "OsxBundle" + + local source_list = {[newid(decl.InfoPList)] = decl.InfoPList} + for _, resource in util.nil_ipairs(decl.Resources) do + if resource.Decl then + source_list[newid(resource.Decl.Source)] = resource.Decl.Source + end + end + + projects["OsxBundle"] = { + Type = unit.Keyword, + Decl = decl, + Sources = source_list, + RelativeFilename = "$(OBJECTDIR)/MyApp.app", + Guid = newid("OsxBundle"), + } + end + end + + return projects +end + +local function split(fn) + local dir, file = fn:match("^(.*)[/\\]([^\\/]*)$") + if not dir then + return ".", fn + else + return dir, file + end +end + +local function split_str(str, pat) + local t = {} -- NOTE: use {n = 0} in Lua-5.0 + local fpat = "(.-)" .. pat + local last_end = 1 + local s, e, cap = str:find(fpat, 1) + while s do + if s ~= 1 or cap ~= "" then + table.insert(t,cap) + end + last_end = e+1 + s, e, cap = str:find(fpat, last_end) + end + if last_end <= #str then + cap = str:sub(last_end) + table.insert(t, cap) + end + return t +end + +local function print_children_2(p, groupname, key, children, path) + + for name, c in pairs(children) do + if c.Type > 0 then + print_children_2(p, name, c.Key, c.Children, c.Type == 1 and path..'/'..name or path) + end + end + + p:write('\t\t', key, ' /* ', path, ' */ = {\n') + p:write('\t\t\tisa = PBXGroup;\n') + p:write('\t\t\tchildren = (\n') + + local dirs = {} + local files = {} + + for name, ref in pairs(children) do + if ref.Type > 0 then + dirs[#dirs + 1] = { Key = ref.Key, Name = name } + else + files[#files + 1] = { Key = ref.Key, Name = name } + end + end + + table.sort(dirs, function(a, b) return a.Name < b.Name end) + table.sort(files, function(a, b) return a.Name < b.Name end) + + for i, ref in pairs(dirs) do + p:write(string.format('\t\t\t\t%s /* %s */,\n', ref.Key, path .. '/' .. ref.Name)) + end + + for i, ref in pairs(files) do + p:write(string.format('\t\t\t\t%s /* %s */,\n', ref.Key, path .. '/' .. ref.Name)) + end + + p:write('\t\t\t);\n') + p:write('\t\t\tname = "', groupname, '"; \n'); + p:write('\t\t\tsourceTree = "";\n'); + p:write('\t\t};\n') +end + +local function prune_groups(group) + local i = 0 + local first_name + local first_child + + for name, child in pairs(group.Children) do + first_name = name + first_child = child + i = i + 1 + end + + if i == 1 and first_child.Type > 0 then + local new_name = prune_groups(first_child) + group.Children = first_child.Children; + if not new_name then + new_name = first_name + end + return new_name + + else + local children = {} + for name, child in pairs(group.Children) do + if child.Type > 0 then + local new_name = prune_groups(child) + if new_name then + name = new_name + end + end + children[name] = child + end + group.children = children + return nil + end + +end + + +local function make_groups(p, files, key) + local filelist = sort_filelist(files) + local group = { Type = 2, Key = key, Children = {} } + + for _, entry in pairs(filelist) do + local parent_group = group + local path, filename = split(entry.Value) + for i, part in ipairs(split_str(path, "/")) do + if part ~= '.' then + local grp = parent_group.Children[part] + if grp == nil then + grp = { Type = 1, Key=newid(util.tostring(parent_group)..part), Children={} } + parent_group.Children[part] = grp + end + parent_group = grp + end + end + parent_group.Children[filename] = { Type = 0, Key = entry.Key } + end + + -- prune single-entry groups + prune_groups(group) + + return group +end + + +local function write_groups(p, projects) + p:write('/* Begin PBXGroup section */\n') + + -- Map folder names to array of projects under that folder + local folders = {} + for _, project in ipairs(projects) do + local hints = project.IdeGenerationHints + local msvc_hints = hints and hints.Msvc + local fname = msvc_hints and msvc_hints.SolutionFolder + if fname == nil then + fname = "" + end + local folder = folders[fname] + if folder == nil then + folder = { Type = 2, Key = newid("Folder"..fname), Children = {} } + folders[fname] = folder + end + folder.Children[project.Decl.Name] = make_groups(p, project.Sources, project.Guid) + end + + local root = folders[""]; + for name, folder in pairs(folders) do + if folder ~= root then + root.Children[name] = folder + end + end + + local all_targets_name = "AllTargets.workspace" + local all_targets_id = newid(all_targets_name) + print_children_2(p, all_targets_name, all_targets_id, root.Children, '.'); + + -- write last group that links the projects names above + + -- local all_targets_name = "AllTargets.workspace" + -- local all_targets_id = newid(all_targets_name) + -- p:write('\t\t', all_targets_id, ' /* ', all_targets_name, ' */ = {\n') + -- p:write('\t\t\tisa = PBXGroup;\n') + -- p:write('\t\t\tchildren = (\n') + + -- for _, project in pairs(projects) do + -- p:write(string.format('\t\t\t\t%s /* %s */,\n', project.Guid, project.Decl.Name)) + -- end + -- p:write('\t\t\t);\n') + -- p:write('\t\t\tname = "', all_targets_name, '"; \n'); + -- p:write('\t\t\tsourceTree = "";\n'); + -- p:write('\t\t};\n') + + p:write('/* End PBXGroup section */\n\n') +end + +local function write_project(p, projects) + + local all_targets_name = "AllTargets.workspace" + local all_targets_id = newid(all_targets_name) + + local project_id = newid("ProjectObject") + local project_config_list_id = newid("ProjectObjectConfigList") + + p:write('/* Begin PBXProject section */\n') + p:write('\t\t', project_id, ' /* Project object */ = {\n') + p:write('\t\t\tisa = PBXProject;\n') + p:write('\t\t\tbuildConfigurationList = ', project_config_list_id, ' /* Build configuration list for PBXProject "', "Project Object", '" */;\n') + p:write('\t\t\tcompatibilityVersion = "Xcode 3.1";\n') + p:write('\t\t\thasScannedForEncodings = 1;\n') + p:write('\t\t\tmainGroup = ', all_targets_id, ' /* ', all_targets_name, ' */;\n') + p:write('\t\t\tprojectDirPath = "";\n') + p:write('\t\t\tprojectRoot = "";\n') + p:write('\t\t\ttargets = (\n') + + for _, project in ipairs(projects) do + p:write(string.format('\t\t\t\t%s /* %s */,\n', newid(project.Decl.Name .. "Target"), project.Decl.Name)) + end + + p:write('\t\t\t);\n') + p:write('\t\t};\n') + p:write('/* End PBXProject section */\n') +end + +local function write_shellscripts(p, projects, env) + p:write('/* Begin PBXShellScriptBuildPhase section */\n') + + -- TODO: Do we really need to repeat this for all projects? seems a bit wasteful + + for _, project in ipairs(projects) do + local name = project.Decl.Name + if not project.IsMeta then + p:write('\t\t', newid(name .. "ShellScript"), ' /* ShellScript */ = {\n') + p:write('\t\t\tisa = PBXShellScriptBuildPhase;\n') + p:write('\t\t\tbuildActionMask = 2147483647;\n') + p:write('\t\t\tfiles = (\n') + p:write('\t\t\t);\n') + p:write('\t\t\tinputPaths = (\n') + p:write('\t\t\t);\n') + p:write('\t\t\toutputPaths = (\n') + p:write('\t\t\t);\n') + p:write('\t\t\trunOnlyForDeploymentPostprocessing = 0;\n') + p:write('\t\t\tshellPath = /bin/sh;\n') + p:write('\t\t\tshellScript = "cd ..\\n', TundraExePath, ' $(CONFIG)-$(VARIANT)-$(SUBVARIANT)";\n') + p:write('\t\t};\n') + end + end + + p:write('/* End PBXShellScriptBuildPhase section */\n') +end + +local function get_full_config_name(config) + return config.Config.Name .. '-' .. config.Variant.Name .. '-' .. config.SubVariant +end + +local function write_configs(p, projects, config_tuples, env, set_env) + + p:write('/* Begin XCBuildConfiguration section */\n') + + -- I wonder if we really need to do it this way for all configs? + + for _, project in ipairs(projects) do + for _, tuple in ipairs(config_tuples) do + local full_config_name = get_full_config_name(tuple) + local is_macosx_native = false + + for _, host in util.nil_ipairs(tuple.Config.SupportedHosts) do + if host == "macosx" then + is_macosx_native = true + end + end + + if "macosx" == tuple.Config.DefaultOnHost then + is_macosx_native = true + end + + local config_id = newid(project.Decl.Name .. full_config_name) + + p:write('\t\t', config_id, ' = {\n') + p:write('\t\t\tisa = XCBuildConfiguration;\n') + + -- Don't add any think extra if subvariant is default + + p:write('\t\t\tbuildSettings = {\n') + + if is_macosx_native then + p:write('\t\t\t\tARCHS = "$(NATIVE_ARCH_ACTUAL)";\n') + end + + p:write('\t\t\t\tVARIANT = "', tuple.Variant.Name, '";\n') + p:write('\t\t\t\tCONFIG = "', tuple.Config.Name, '";\n') + p:write('\t\t\t\tSUBVARIANT = "', tuple.SubVariant, '";\n') + + if is_macosx_native and not project.IsMeta then + p:write('\t\t\t\tCONFIGURATION_BUILD_DIR = "', full_config_name, '";\n') + end + + -- this is a little hack to get xcode to clean the whole output folder when using "FullBuild" + p:write('\t\t\t\tPRODUCT_NAME = "',project.Decl.Name , '";\n') + p:write('\t\t\t\tTARGET_NAME = "',project.Decl.Name , '";\n') + + for i, var in ipairs(set_env) do + p:write('\t\t\t\t', var, ' = "', os.getenv(var), '";\n') + end + + p:write('\t\t\t};\n') + p:write('\t\t\tname = "',full_config_name , '";\n') + p:write('\t\t};\n') + end + end + + -- PBXProject configurations + + for _, tuple in ipairs(config_tuples) do + local full_config_name = get_full_config_name(tuple) + local config_id = newid("ProjectObject" .. full_config_name) + + p:write('\t\t', config_id, ' = {\n') + p:write('\t\t\tisa = XCBuildConfiguration;\n') + + p:write('\t\t\tbuildSettings = {\n') + p:write('\t\t\t};\n') + p:write('\t\t\tname = "',full_config_name , '";\n') + p:write('\t\t};\n') + end + + p:write('/* End XCBuildConfiguration section */\n') + +end + +local function write_config_list(p, projects, config_tuples) + p:write('/* Begin XCConfigurationList section */\n') + + local default_config = ""; + + -- find the default config + + for _, tuple in ipairs(config_tuples) do + local is_macosx_native = tuple.Config.Name:match('^(%macosx)%-') + + if is_macosx_native and tuple.Variant.Name == "debug" then + default_config = get_full_config_name(tuple) + break + end + end + + -- if we did't find a default config just grab the first one + + if default_config == "" then + default_config = get_full_config_name(config_tuples[1]) + end + + for __, project in ipairs(projects) do + local config_id = newid(project.Decl.Name .. 'Config') + + p:write('\t\t', config_id, ' /* Build config list for "', project.Decl.Name, '" */ = {\n') + p:write('\t\t\tisa = XCConfigurationList;\n') + + -- Don't add any think extra if subvariant is default + + p:write('\t\t\tbuildConfigurations = (\n') + + for _, tuple in ipairs(config_tuples) do + local full_config_name = get_full_config_name(tuple) + p:write(string.format('\t\t\t\t%s /* %s */,\n', newid(project.Decl.Name .. full_config_name), full_config_name)) + end + + p:write('\t\t\t);\n') + p:write('\t\t\tdefaultConfigurationIsVisible = 1;\n') + p:write('\t\t\tdefaultConfigurationName = "', default_config, '";\n') + + p:write('\t\t};\n') + end + + -- PBXProject configuration list + + local config_id = newid("ProjectObjectConfigList") + + p:write('\t\t', config_id, ' /* Build config list for PBXProject */ = {\n') + p:write('\t\t\tisa = XCConfigurationList;\n') + + -- Don't add any think extra if subvariant is default + + p:write('\t\t\tbuildConfigurations = (\n') + + for _, tuple in ipairs(config_tuples) do + local full_config_name = get_full_config_name(tuple) + p:write(string.format('\t\t\t\t%s /* %s */,\n', newid("ProjectObject" .. full_config_name), full_config_name)) + end + + p:write('\t\t\t);\n') + p:write('\t\t\tdefaultConfigurationIsVisible = 1;\n') + p:write('\t\t\tdefaultConfigurationName = "', default_config, '";\n') + p:write('\t\t};\n') + + p:write('/* End XCConfigurationList section */\n') + +end + +local function write_footer(p) + p:write('\t};\n') + p:write('\trootObject = ', newid("ProjectObject"), ' /* Project object */;\n') + p:write('}\n') +end + +local function make_meta_projects(ide_script) + local source_list = { + [newid("tundra.lua")] = "tundra.lua" + } + local units = io.open("units.lua") + if units then + source_list[newid("units.lua")] = "units.lua" + io.close(units) + end + + local meta_name1 = "!BuildWorkspace" + local meta_name2 = "!UpdateWorkspace" + return { + { + Decl = { Name = meta_name1, }, + Type = "LegacyTarget", + RelativeFilename = "", + Sources = source_list, + Guid = newid(meta_name1 .. 'ProjectId'), + IsMeta = true, + MetaData = { BuildArgs = "-v $(CONFIG)-$(VARIANT)-$(SUBVARIANT)", BuildTool = TundraExePath }, + }, + { + Decl = { Name = meta_name2, }, + Type = "LegacyTarget", + RelativeFilename = "", + Sources = source_list, + Guid = newid(meta_name2 .. 'ProjectId'), + IsMeta = true, + MetaData = { BuildArgs = "--g " .. ide_script, BuildTool = TundraExePath }, + } + } +end + +function xcode_generator:generate_files(ngen, config_tuples, raw_nodes, env, default_names, hints, ide_script) + assert(config_tuples and #config_tuples > 0) + + hints = hints or {} + hints = hints.Xcode or {} + local base_dir = hints.BaseDir and (hints.BaseDir .. '/') or env:interpolate('$(OBJECTROOT)$(SEP)') + native.mkdir(base_dir) + + local projects = get_projects(raw_nodes, env, hints, ide_script) + + local source_list = { + [newid("tundra.lua")] = "tundra.lua" + } + local units = io.open("units.lua") + if units then + source_list[newid("units.lua")] = "units.lua" + io.close(units) + end + + local meta_name = "!BuildWorkspace" + local build_project = { + Decl = { Name = meta_name, }, + Type = "LegacyTarget", + RelativeFilename = "", + Sources = source_list, + Guid = newid(meta_name .. 'ProjectId'), + IsMeta = true, + MetaData = { BuildArgs = "$(CONFIG)-$(VARIANT)-$(SUBVARIANT)", BuildTool = TundraExePath }, + } + local meta_name = "!UpdateWorkspace" + local generate_project = { + Decl = { Name = meta_name, }, + Type = "LegacyTarget", + RelativeFilename = "", + Sources = source_list, + Guid = newid(meta_name .. 'ProjectId'), + IsMeta = true, + MetaData = { BuildArgs = "--g " .. ide_script, BuildTool = TundraExePath }, + } + + local solution_hints = hints.Projects + if not solution_hints then + print("No IdeGenerationHints.Xcode.Projects specified - using defaults") + solution_hints = { + ['tundra-generated.sln'] = { } + } + end + + for name, data in pairs(solution_hints) do + local sln_projects = { build_project, generate_project } + + if data.Projects then + for _, pname in ipairs(data.Projects) do + local pp = projects[pname] + if not pp then + errorf("can't find project %s for inclusion in %s -- check your Projects data", pname, name) + end + sln_projects[#sln_projects + 1] = pp + end + else + -- All the projects (that are not meta) + for pname, pp in pairs(projects) do + sln_projects[#sln_projects + 1] = pp + end + end + + local proj_dir = base_dir .. path.drop_suffix(name) .. ".xcodeproj/" + native.mkdir(proj_dir) + + local p = io.open(path.join(proj_dir, "project.pbxproj"), 'wb') + + write_header(p) + write_file_refs(p, sln_projects) + write_groups(p, sln_projects) + write_legacy_targets(p, sln_projects, env) + write_native_targes(p, sln_projects) + write_project(p, sln_projects) + write_shellscripts(p, sln_projects, env) + write_configs(p, sln_projects, config_tuples, env, hints.EnvVars or {}) + write_config_list(p, sln_projects, config_tuples) + write_footer(p) + end +end + +nodegen.set_ide_backend(function(...) + local state = setmetatable({}, xcode_generator) + state:generate_files(...) +end) + diff --git a/ogl_editor/bin/win32/scripts/tundra/init.lua b/ogl_editor/bin/win32/scripts/tundra/init.lua new file mode 100644 index 0000000..5f22ca3 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/init.lua @@ -0,0 +1,34 @@ +module(..., package.seeall) + +init_tundra_lua = [====[ +local CFiles = { ".c", ".h" } +Build { + Configs = { + Config { + Name = "generic-gcc", + DefaultOnHost = "linux", + Tools = { "gcc" }, + }, + Config { + Name = "macosx-gcc", + DefaultOnHost = "macosx", + Tools = { "gcc-osx" }, + }, + Config { + Name = "win64-msvc", + DefaultOnHost = "windows", + Tools = { "msvc-vs2008"; TargetPlatform = "x64" }, + }, + }, + Units = function() + require "tundra.syntax.glob" + Program { + Name = "a.out", + Sources = { Glob { Dir = ".", Extensions = CFiles } }, + } + + Default "a.out" + end, +} +]====] + diff --git a/ogl_editor/bin/win32/scripts/tundra/nodegen.lua b/ogl_editor/bin/win32/scripts/tundra/nodegen.lua new file mode 100644 index 0000000..e560aa1 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/nodegen.lua @@ -0,0 +1,914 @@ +module(..., package.seeall) + +local unitgen = require "tundra.unitgen" +local util = require "tundra.util" +local path = require "tundra.path" +local depgraph = require "tundra.depgraph" +local buildfile = require "tundra.buildfile" +local native = require "tundra.native" + +local ide_backend = nil + +local current = nil + +local _nodegen = { } +_nodegen.__index = _nodegen + +local function syntax_error(msg, ...) + error { Class = 'syntax error', Message = string.format(msg, ...) } +end + +local function validate_boolean(name, value) + if type(value) == "boolean" then + return value + end + syntax_error("%s: expected boolean value, got %q", name, type(value)) +end + +local function validate_string(name, value) + if type(value) == "string" then + return value + end + syntax_error("%s: expected string value, got %q", name, type(value)) +end + +local function validate_pass(name, value) + if type(value) == "string" then + return value + else + syntax_error("%s: expected pass name, got %q", name, type(value)) + end +end + +local function validate_table(name, value) + -- A single string can be converted into a table value very easily + local t = type(value) + if t == "table" then + return value + elseif t == "string" then + return { value } + else + syntax_error("%s: expected table value, got %q", name, t) + end +end + +local function validate_config(name, value) + if type(value) == "table" or type(value) == "string" then + return value + end + syntax_error("%s: expected config, got %q", name, type(value)) +end + +local validators = { + ["string"] = validate_string, + ["pass"] = validate_pass, + ["table"] = validate_table, + ["filter_table"] = validate_table, + ["source_list"] = validate_table, + ["boolean"] = validate_boolean, + ["config"] = validate_config, +} + +function _nodegen:validate() + local decl = self.Decl + for name, detail in pairs(assert(self.Blueprint)) do + local val = decl[name] + if not val then + if detail.Required then + syntax_error("%s: missing argument: '%s'", self.Keyword, name) + end + -- ok, optional value + else + local validator = validators[detail.Type] + decl[name] = validator(name, val) + end + end + for name, detail in pairs(decl) do + if not self.Blueprint[name] then + syntax_error("%s: unsupported argument: '%s'", self.Keyword, name) + end + end +end + +function _nodegen:customize_env(env, raw_data) + -- available for subclasses +end + +function _nodegen:configure_env(env, deps) + local build_id = env:get('BUILD_ID') + local propagate_blocks = {} + local decl = self.Decl + + for _, dep_obj in util.nil_ipairs(deps) do + local data = dep_obj.Decl.Propagate + if data then + propagate_blocks[#propagate_blocks + 1] = data + end + end + + local function push_bindings(env_key, data) + if data then + for _, item in util.nil_ipairs(flatten_list(build_id, data)) do + env:append(env_key, item) + end + end + end + + local function replace_bindings(env_key, data) + if data then + local first = true + for _, item in util.nil_ipairs(flatten_list(build_id, data)) do + if first then + env:replace(env_key, item) + first = false + else + env:append(env_key, item) + end + end + end + end + + -- Push Libs, Defines and so in into the environment of this unit. + -- These are named for convenience but are aliases for syntax niceness. + for decl_key, env_key in util.nil_pairs(self.DeclToEnvMappings) do + -- First pick settings from our own unit. + push_bindings(env_key, decl[decl_key]) + + for _, data in ipairs(propagate_blocks) do + push_bindings(env_key, data[decl_key]) + end + end + + -- Push Env blocks as is + for k, v in util.nil_pairs(decl.Env) do + push_bindings(k, v) + end + + for k, v in util.nil_pairs(decl.ReplaceEnv) do + replace_bindings(k, v) + end + + for _, block in util.nil_ipairs(propagate_blocks) do + for k, v in util.nil_pairs(block.Env) do + push_bindings(k, v) + end + + for k, v in util.nil_pairs(block.ReplaceEnv) do + replace_bindings(k, v) + end + end +end + +local function resolve_sources(env, items, accum, base_dir) + local ignored_exts = util.make_lookup_table(env:get_list("IGNORED_AUTOEXTS", {})) + for _, item in util.nil_ipairs(items) do + local type_name = type(item) + + assert(type_name ~= "function") + + if type_name == "userdata" then + accum[#accum + 1] = item + elseif type_name == "table" then + if depgraph.is_node(item) then + accum[#accum + 1] = item + elseif getmetatable(item) then + accum[#accum + 1] = item:get_dag(env) + else + resolve_sources(env, item, accum, item.SourceDir or base_dir) + end + else + assert(type_name == "string") + local ext = path.get_extension(item) + if not ignored_exts[ext] then + if not base_dir or path.is_absolute(item) then + accum[#accum + 1] = item + else + local p = path.join(base_dir, item) + accum[#accum + 1] = p + end + end + end + end + return accum +end + +-- Analyze source list, returning list of input files and list of dependencies. +-- +-- This is so you can pass a mix of actions producing files and regular +-- filenames as inputs to the next step in the chain and the output files of +-- such nodes will be used automatically. +-- +-- list - list of source files and nodes that produce source files +-- suffixes - acceptable source suffixes to pick up from nodes in source list +local function analyze_sources(env, pass, list, suffixes) + if not list then + return nil + end + + list = util.flatten(list) + local deps = {} + + local function implicit_make(source_file) + local t = type(source_file) + if t == "table" then + return source_file + end + assert(t == "string") + + local make = env:get_implicit_make_fn(source_file) + if make then + return make(env, pass, source_file) + else + return nil + end + end + + local function transform(output, fn) + if type(fn) ~= "string" then + error(util.tostring(fn) .. " is not a string", 2) + end + + local t = implicit_make(fn) + if t then + deps[#deps + 1] = t + t:insert_output_files(output, suffixes) + else + output[#output + 1] = fn + end + end + + local files = {} + for _, src in ipairs(list) do + if depgraph.is_node(src) then + deps[#deps + 1] = src + src:insert_output_files(files, suffixes) + elseif type(src) == "table" then + error("non-DAG node in source list at this point") + else + files[#files + 1] = src + end + end + + while true do + local result = {} + local old_dep_count = #deps + for _, src in ipairs(files) do + transform(result, src) + end + files = result + if #deps == old_dep_count then + --print("scan", util.tostring(list), util.tostring(suffixes), util.tostring(result)) + return result, deps + end + end +end + +local function x_identity(self, name, info, value, env, out_deps) + return value +end + +local function x_source_list(self, name, info, value, env, out_deps) + local build_id = env:get('BUILD_ID') + local source_files + if build_id then + source_files = filter_structure(build_id, value) + else + source_files = value + end + local sources = resolve_sources(env, source_files, {}, self.Decl.SourceDir) + local source_exts = env:get_list(info.ExtensionKey) + local inputs, ideps = analyze_sources(env, resolve_pass(self.Decl.Pass), sources, source_exts) + if ideps then + util.append_table(out_deps, ideps) + end + return inputs +end + +local function x_filter_table(self, name, info, value, env, out_deps) + local build_id = env:get('BUILD_ID') + return flatten_list(build_id, value) +end + +local function find_named_node(name_or_dag) + if type(name_or_dag) == "table" then + return name_or_dag:get_dag(current.default_env) + elseif type(name_or_dag) == "string" then + local generator = current.units[name_or_dag] + if not generator then + errorf("unknown node specified: %q", tostring(name_or_dag)) + end + return generator:get_dag(current.default_env) + else + errorf("illegal node specified: %q", tostring(name_or_dag)) + end +end + +-- Special resolver for dependencies in a nested (config-filtered) list. +local function resolve_dependencies(decl, raw_deps, env) + if not raw_deps then + return {} + end + + local build_id = env:get('BUILD_ID') + local deps = flatten_list(build_id, raw_deps) + return util.map_in_place(deps, function (i) + if type(i) == "string" then + local n = current.units[i] + if not n then + errorf("%s: Unknown 'Depends' target %q", decl.Name, i) + end + return n + elseif type(i) == "table" and getmetatable(i) and i.Decl then + return i + else + errorf("bad 'Depends' value of type %q", type(i)) + end + end) +end + +local function x_pass(self, name, info, value, env, out_deps) + return resolve_pass(value) +end + +local decl_transformers = { + -- the x_identity data types have already been checked at script time through validate_xxx + ["string"] = x_identity, + ["table"] = x_identity, + ["config"] = x_identity, + ["boolean"] = x_identity, + ["pass"] = x_pass, + ["source_list"] = x_source_list, + ["filter_table"] = x_filter_table, +} + +-- Create input data for the generator's DAG creation function based on the +-- blueprint passed in when the generator was registered. This is done here +-- centrally rather than in all the different node generators to reduce code +-- duplication and keep the generators miminal. If you need to do something +-- special, you can override create_input_data() in your subclass. +function _nodegen:create_input_data(env) + local decl = self.Decl + local data = {} + local deps = {} + + for name, detail in pairs(assert(self.Blueprint)) do + local val = decl[name] + if val then + local xform = decl_transformers[detail.Type] + data[name] = xform(self, name, detail, val, env, deps) + end + end + + return data, deps +end + +function get_pass(self, name) + if not name then + return nil + end + +end + +local pattern_cache = {} +local function get_cached_pattern(p) + local v = pattern_cache[p] + if not v then + local comp = '[%w_]+' + local sub_pattern = p:gsub('*', '[%%w_]+') + local platform, tool, variant, subvariant = unitgen.match_build_id(sub_pattern, comp) + v = string.format('^%s%%-%s%%-%s%%-%s$', platform, tool, variant, subvariant) + pattern_cache[p] = v + end + return v +end + +local function config_matches(pattern, build_id) + local ptype = type(pattern) + if ptype == "nil" then + return true + elseif ptype == "string" then + local fpattern = get_cached_pattern(pattern) + return build_id:match(fpattern) + elseif ptype == "table" then + for _, pattern_item in ipairs(pattern) do + if config_matches(pattern_item, build_id) then + return true + end + end + return false + else + error("bad 'Config' pattern type: " .. ptype) + end +end + +local function make_unit_env(unit) + -- Select an environment for this unit based on its SubConfig tag + -- to support cross compilation. + local env + local subconfig = unit.Decl.SubConfig or current.default_subconfig + if subconfig and current.base_envs then + env = current.base_envs[subconfig] + if Options.VeryVerbose then + if env then + printf("%s: using subconfig %s (%s)", unit.Decl.Name, subconfig, env:get('BUILD_ID')) + else + if current.default_subconfig then + errorf("%s: couldn't find a subconfig env", unit.Decl.Name) + else + printf("%s: no subconfig %s found; using default env", unit.Decl.Name, subconfig) + end + end + end + end + + if not env then + env = current.default_env + end + + return env:clone() +end + +local anon_count = 1 +function _nodegen:get_dag(parent_env) + local build_id = parent_env:get('BUILD_ID') + local dag = self.DagCache[build_id] + + if not dag then + if build_id:len() > 0 and not config_matches(self.Decl.Config, build_id) then + -- Unit has been filtered out via Config attribute. + -- Create a fresh dummy node for it. + local name + if not self.Decl.Name then + name = string.format("Dummy node %d", anon_count) + else + name = string.format("Dummy node %d for %s", anon_count, self.Decl.Name) + end + anon_count = anon_count + 1 + + dag = depgraph.make_node { + Env = parent_env, + Pass = resolve_pass(self.Decl.Pass), + Label = name, + } + else + local unit_env = make_unit_env(self) + + if self.Decl.Name then + unit_env:set('UNIT_PREFIX', '__' .. self.Decl.Name) + end + + -- Before accessing the unit's dependencies, resolve them via filtering. + local deps = resolve_dependencies(self.Decl, self.Decl.Depends, unit_env) + + self:configure_env(unit_env, deps) + self:customize_env(unit_env, self.Decl, deps) + + local input_data, input_deps = self:create_input_data(unit_env, parent_env) + -- Copy over dependencies which have been pre-resolved + input_data.Depends = deps + + for _, dep in util.nil_ipairs(deps) do + input_deps[#input_deps + 1] = dep:get_dag(parent_env) + end + + dag = self:create_dag(unit_env, input_data, input_deps, parent_env) + + if not dag then + error("create_dag didn't generate a result node") + end + end + self.DagCache[build_id] = dag + end + + return dag +end + +local _generator = { + Evaluators = {}, +} +_generator.__index = _generator + +local function new_generator(s) + s = s or {} + s.units = {} + return setmetatable(s, _generator) +end + +local function create_unit_map(state, raw_nodes) + -- Build name=>decl mapping + for _, unit in ipairs(raw_nodes) do + assert(unit.Decl) + local name = unit.Decl.Name + if name and type(name) == "string" then + if state.units[name] then + errorf("duplicate unit name: %s", name) + end + state.units[name] = unit + end + end +end + +function _generate_dag(args) + local envs = assert(args.Envs) + local raw_nodes = assert(args.Declarations) + + local state = new_generator { + base_envs = envs, + root_env = envs["__default"], -- the outmost config's env in a cross-compilation scenario + config = assert(args.Config), + variant = assert(args.Variant), + passes = assert(args.Passes), + } + + current = state + + create_unit_map(state, raw_nodes) + + local subconfigs = state.config.SubConfigs + + -- Pick a default environment which is used for + -- 1. Nodes without a SubConfig declaration + -- 2. Nodes with a missing SubConfig declaration + -- 3. All nodes if there are no SubConfigs set for the current config + if subconfigs then + state.default_subconfig = assert(state.config.DefaultSubConfig) + state.default_env = assert(envs[state.default_subconfig], "unknown DefaultSubConfig specified") + else + state.default_env = assert(envs["__default"]) + end + + + local always_lut = util.make_lookup_table(args.AlwaysNodes) + local default_lut = util.make_lookup_table(args.DefaultNodes) + + local always_nodes = util.map(args.AlwaysNodes, find_named_node) + local default_nodes = util.map(args.DefaultNodes, find_named_node) + + local named_nodes = {} + for name, _ in pairs(state.units) do + named_nodes[name] = find_named_node(name) + end + + current = nil + + return { always_nodes, default_nodes, named_nodes } +end + +function generate_dag(args) + local success, result = xpcall(function () return _generate_dag(args) end, buildfile.syntax_error_catcher) + + if success then + return result[1], result[2], result[3] + else + croak("%s", result) + end + +end + +function resolve_pass(name) + assert(current) + if name then + local p = current.passes[name] + if not p then + syntax_error("%q is not a valid pass name", name) + end + return p + else + return nil + end +end + +function get_target(data, suffix, prefix) + local target = data.Target + if not target then + assert(data.Name) + target = "$(OBJECTDIR)/" .. (prefix or "") .. data.Name .. (suffix or "") + end + return target +end + +function get_evaluator(name) + return _generator.Evaluators[name] +end + +function is_evaluator(name) + if _generator.Evaluators[name] then return true else return false end +end + +local common_blueprint = { + Propagate = { + Help = "Declarations to propagate to dependent units", + Type = "filter_table", + }, + Depends = { + Help = "Dependencies for this node", + Type = "table", -- handled specially + }, + Env = { + Help = "Data to append to the environment for the unit", + Type = "filter_table", + }, + ReplaceEnv = { + Help = "Data to replace in the environment for the unit", + Type = "filter_table", + }, + Pass = { + Help = "Specify build pass", + Type = "pass", + }, + SourceDir = { + Help = "Specify base directory for source files", + Type = "string", + }, + Config = { + Help = "Specify configuration this unit will build in", + Type = "config", + }, + SubConfig = { + Help = "Specify sub-configuration this unit will build in", + Type = "config", + }, + __DagNodes = { + Help = "Internal node to keep track of DAG nodes generated so far", + Type = "table", + } +} + +function create_eval_subclass(meta_tbl, base) + base = base or _nodegen + setmetatable(meta_tbl, base) + meta_tbl.__index = meta_tbl + return meta_tbl +end + +function add_evaluator(name, meta_tbl, blueprint) + assert(type(name) == "string") + assert(type(meta_tbl) == "table") + assert(type(blueprint) == "table") + + -- Set up this metatable as a subclass of _nodegen unless it is already + -- configured. + if not getmetatable(meta_tbl) then + setmetatable(meta_tbl, _nodegen) + meta_tbl.__index = meta_tbl + end + + -- Install common blueprint items. + for name, val in pairs(common_blueprint) do + if not blueprint[name] then + blueprint[name] = val + end + end + + -- Expand environment shortcuts into options. + for decl_key, env_key in util.nil_pairs(meta_tbl.DeclToEnvMappings) do + blueprint[decl_key] = { + Type = "filter_table", + Help = "Shortcut for environment key " .. env_key, + } + end + + for name, val in pairs(blueprint) do + local type_ = assert(val.Type) + if not validators[type_] then + errorf("unsupported blueprint type %q", type_) + end + + if val.Type == "source_list" and not val.ExtensionKey then + errorf("%s: source_list must provide ExtensionKey", name) + end + end + + -- Record blueprint for use when validating user constructs. + meta_tbl.Keyword = name + meta_tbl.Blueprint = blueprint + + -- Store this evaluator under the keyword that will trigger it. + _generator.Evaluators[name] = meta_tbl +end + +-- Called when processing build scripts, keywords is something previously +-- registered as an evaluator here. +function evaluate(eval_keyword, data) + local meta_tbl = assert(_generator.Evaluators[eval_keyword]) + + -- Give the evaluator change to fix up the data before we validate it. + data = meta_tbl:preprocess_data(data) + + local object = setmetatable({ + DagCache = {}, -- maps BUILD_ID -> dag node + Decl = data + }, meta_tbl) + + -- Expose the dag cache to the raw input data so the IDE generator can find it later + data.__DagNodes = object.DagCache + object.__index = object + + -- Validate data according to Blueprint settings + object:validate() + return object +end + +-- Given a list of strings or nested lists, flatten the structure to a single +-- list of strings while applying configuration filters. Configuration filters +-- match against the current build identifier like this: +-- +-- { "a", "b", { "nixfile1", "nixfile2"; Config = "unix-*-*" }, "bar", { "debugfile"; Config = "*-*-debug" }, } +-- +-- If 'exclusive' is set, then: +-- If 'build_id' is set, only values _with_ a 'Config' filter are included. +-- If 'build_id' is nil, only values _without_ a 'Config' filter are included. +function flatten_list(build_id, list, exclusive) + if not list then return nil end + local filter_defined = build_id ~= nil + + -- Helper function to apply filtering recursively and append results to an + -- accumulator table. + local function iter(node, accum, filtered) + local node_type = type(node) + if node_type == "table" and not getmetatable(node) then + if node.Config then filtered = true end + if not filter_defined or config_matches(node.Config, build_id) then + for _, item in ipairs(node) do + iter(item, accum, filtered) + end + end + elseif not exclusive or (filtered == filter_defined) then + accum[#accum + 1] = node + end + end + + local results = {} + iter(list, results, false) + return results +end + +-- Conceptually similar to flatten_list(), but retains table structure. +-- Use to keep source tables as they are passed in, to retain nested SourceDir attributes. +local empty_leaf = {} -- constant +function filter_structure(build_id, data, exclusive) + if type(data) == "table" then + if getmetatable(data) then + return data -- it's already a DAG node; use as-is + end + + local filtered = data.Config and true or false + + if not data.Config or config_matches(data.Config, build_id) then + local result = {} + for k, item in pairs(data) do + if type(k) == "number" then + -- Filter array elements. + result[#result + 1] = filter_structure(build_id, item, filtered) + elseif k ~= "Config" then + -- Copy key-value data through. + result[k] = item + end + end + return result + else + return empty_leaf + end + else + return data + end +end + +-- Processes an "Env" table. For each value, the corresponding variable in +-- 'env' is appended to if its "Config" filter matches 'build_id'. If +-- 'build_id' is nil, filtered values are skipped. +function append_filtered_env_vars(env, values_to_append, build_id, exclusive) + for key, val in util.pairs(values_to_append) do + if type(val) == "table" then + local list = flatten_list(build_id, val, exclusive) + for _, subvalue in ipairs(list) do + env:append(key, subvalue) + end + elseif not (exclusive and build_id) then + env:append(key, val) + end + end +end + +-- Like append_filtered_env_vars(), but replaces existing variables instead +-- of appending to them. +function replace_filtered_env_vars(env, values_to_replace, build_id, exclusive) + for key, val in util.pairs(values_to_replace) do + if type(val) == "table" then + local list = flatten_list(build_id, val, exclusive) + if #list > 0 then + env:replace(key, list) + end + elseif not (exclusive and build_id) then + env:replace(key, val) + end + end +end + +function generate_ide_files(config_tuples, default_names, raw_nodes, env, hints, ide_script) + local state = new_generator { default_env = env } + assert(state.default_env) + create_unit_map(state, raw_nodes) + local backend_fn = assert(ide_backend) + backend_fn(state, config_tuples, raw_nodes, env, default_names, hints, ide_script) +end + +function set_ide_backend(backend_fn) + ide_backend = backend_fn +end + +-- Expose the DefRule helper which is used to register builder syntax in a +-- simplified way. + +function _G.DefRule(ruledef) + local name = assert(ruledef.Name, "Missing Name string in DefRule") + local setup_fn = assert(ruledef.Setup, "Missing Setup function in DefRule " .. name) + local cmd = assert(ruledef.Command, "Missing Command string in DefRule " .. name) + local blueprint = assert(ruledef.Blueprint, "Missing Blueprint in DefRule " .. name) + local mt = create_eval_subclass {} + local annot = ruledef.Annotation + + if not annot then + annot = name .. " $(<)" + end + + local preproc = ruledef.Preprocess + + local function verify_table(v, tag) + if not v then + errorf("No %s returned from DefRule %s", tag, name) + end + + if type(v) ~= "table" then + errorf("%s returned from DefRule %s is not a table", tag, name) + end + end + + local function make_node(input_files, output_files, env, data, deps, scanner) + return depgraph.make_node { + Env = env, + Label = annot, + Action = cmd, + Pass = data.Pass or resolve_pass(ruledef.Pass), + InputFiles = input_files, + OutputFiles = output_files, + ImplicitInputs = ruledef.ImplicitInputs, + Scanner = scanner, + Dependencies = deps, + } + end + + if ruledef.ConfigInvariant then + local cache = {} + + function mt:create_dag(env, data, deps) + local setup_data = setup_fn(env, data) + local input_files = setup_data.InputFiles + local output_files = setup_data.OutputFiles + verify_table(input_files, "InputFiles") + verify_table(output_files, "OutputFiles") + + local mashup = { } + for _, input in util.nil_ipairs(input_files) do + mashup[#mashup + 1] = input + end + mashup[#mashup + 1] = "@@" + for _, output in util.nil_ipairs(output_files) do + mashup[#mashup + 1] = output + end + mashup[#mashup + 1] = "@@" + for _, implicit_input in util.nil_ipairs(setup_data.ImplicitInputs) do + mashup[#mashup + 1] = implicit_input + end + local key = native.digest_guid(table.concat(mashup, ';')) + + local key = util.tostring(key) + if cache[key] then + return cache[key] + else + local node = make_node(input_files, output_files, env, data, deps, setup_data.Scanner) + cache[key] = node + return node + end + end + else + function mt:create_dag(env, data, deps) + local setup_data = setup_fn(env, data) + verify_table(setup_data.InputFiles, "InputFiles") + verify_table(setup_data.OutputFiles, "OutputFiles") + return make_node(setup_data.InputFiles, setup_data.OutputFiles, env, data, deps, setup_data.Scanner) + end + end + + if preproc then + function mt:preprocess_data(raw_data) + return preproc(raw_data) + end + end + + add_evaluator(name, mt, blueprint) +end + +function _nodegen:preprocess_data(data) + return data +end diff --git a/ogl_editor/bin/win32/scripts/tundra/path.lua b/ogl_editor/bin/win32/scripts/tundra/path.lua new file mode 100644 index 0000000..f5d7068 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/path.lua @@ -0,0 +1,50 @@ +module(..., package.seeall) + +local npath = require "tundra.native.path" + +split = npath.split +normalize = npath.normalize +join = npath.join +get_filename_dir = npath.get_filename_dir +get_filename = npath.get_filename +get_extension = npath.get_extension +drop_suffix = npath.drop_suffix +get_filename_base = npath.get_filename_base +is_absolute = npath.is_absolute + +function remove_prefix(prefix, fn) + if fn:find(prefix, 1, true) == 1 then + return fn:sub(#prefix + 1) + else + return fn + end +end + +function make_object_filename(env, src_fn, suffix) + local object_fn + + local src_suffix = get_extension(src_fn):sub(2) + + -- Drop leading $(OBJECTDIR)[/\\] in the input filename. + do + local pname = src_fn:match("^%$%(OBJECTDIR%)[/\\](.*)$") + if pname then + object_fn = pname + else + object_fn = src_fn + end + end + + -- Compute path under OBJECTDIR we want for the resulting object file. + -- Replace ".." with "dotdot" to avoid creating files outside the + -- object directory. Also salt the generated object name with the source + -- suffix, so that multiple source files with the same base name don't end + -- up clobbering each other (Tundra emits an error for this when checking + -- the DAG) + do + local relative_name = drop_suffix(object_fn:gsub("%.%.", "dotdot")) + object_fn = "$(OBJECTDIR)/$(UNIT_PREFIX)/" .. relative_name .. "__" .. src_suffix .. suffix + end + + return object_fn +end diff --git a/ogl_editor/bin/win32/scripts/tundra/platform.lua b/ogl_editor/bin/win32/scripts/tundra/platform.lua new file mode 100644 index 0000000..402b79d --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/platform.lua @@ -0,0 +1,7 @@ +module(..., package.seeall) + +local native = require "tundra.native" + +function host_platform() + return native.host_platform +end diff --git a/ogl_editor/bin/win32/scripts/tundra/scanner.lua b/ogl_editor/bin/win32/scripts/tundra/scanner.lua new file mode 100644 index 0000000..8750627 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/scanner.lua @@ -0,0 +1,57 @@ +module(..., package.seeall) + +local util = require "tundra.util" +local native = require "tundra.native" + +local _scanner_mt = {} +setmetatable(_scanner_mt, { __index = _scanner_mt }) + +local cpp_scanner_cache = {} +local generic_scanner_cache = {} + +function make_cpp_scanner(paths) + local key = table.concat(paths, '\0') + + if not cpp_scanner_cache[key] then + local data = { Kind = 'cpp', Paths = paths, Index = #cpp_scanner_cache } + cpp_scanner_cache[key] = setmetatable(data, _scanner_mt) + end + + return cpp_scanner_cache[key] +end + +function make_generic_scanner(data) + data.Kind = 'generic' + local mashup = { } + local function add_all(l) + for _, value in util.nil_ipairs(l) do + mashup[#mashup + 1] = value + end + end + add_all(data.Paths) + add_all(data.Keywords) + add_all(data.KeywordsNoFollow) + mashup[#mashup + 1] = '!!' + mashup[#mashup + 1] = data.RequireWhitespace and 'y' or 'n' + mashup[#mashup + 1] = data.UseSeparators and 'y' or 'n' + mashup[#mashup + 1] = data.BareMeansSystem and 'y' or 'n' + local key_str = table.concat(mashup, '\001') + local key = native.digest_guid(key_str) + local value = generic_scanner_cache[key] + if not value then + value = data + generic_scanner_cache[key] = data + end + return value +end + +function all_scanners() + local scanners = {} + for k, v in pairs(cpp_scanner_cache) do + scanners[v.Index + 1] = v + end + for k, v in pairs(generic_scanner_cache) do + scanners[v.Index + 1] = v + end + return scanners +end diff --git a/ogl_editor/bin/win32/scripts/tundra/selftest.lua b/ogl_editor/bin/win32/scripts/tundra/selftest.lua new file mode 100644 index 0000000..f506f92 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/selftest.lua @@ -0,0 +1,37 @@ +module(..., package.seeall) + +local error_count = 0 + +function _G.unit_test(label, fn) + local t_mt = { + check_equal = function (obj, a, b) + if a ~= b then + error { Message = "Equality test failed: " .. tostring(a) .. " != " .. tostring(b) } + end + end + } + t_mt.__index = t_mt + + local t = setmetatable({}, t_mt) + local function stack_dumper(err_obj) + if type(err_obj) == "table" then + return err_obj.Message + end + local debug = require 'debug' + return debug.traceback(err_obj, 2) + end + + io.stdout:write("Testing ", label, ": ") + io.stdout:flush() + local ok, err = xpcall(function () fn(t) end, stack_dumper) + if not ok then + io.stdout:write("failed\n") + io.stdout:write(tostring(err), "\n") + error_count = error_count + 1 + else + io.stderr:write("OK\n") + end +end + +require "tundra.test.t_env" +require "tundra.test.t_path" diff --git a/ogl_editor/bin/win32/scripts/tundra/syntax/alias.lua b/ogl_editor/bin/win32/scripts/tundra/syntax/alias.lua new file mode 100644 index 0000000..361c07a --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/syntax/alias.lua @@ -0,0 +1,40 @@ +-- alias.lua -- support for named aliases in the DAG + +module(..., package.seeall) + +local nodegen = require "tundra.nodegen" +local depgraph = require "tundra.depgraph" +local util = require "tundra.util" + +local _alias_mt = nodegen.create_eval_subclass {} + +function _alias_mt:create_dag(env, data, input_deps) + + local deps = util.clone_table(input_deps) + + for _, dep in util.nil_ipairs(data.Depends) do + deps[#deps+1] = dep:get_dag(env:get_parent()) + end + + local dag = depgraph.make_node { + Env = env, + Label = "Named alias " .. data.Name .. " for " .. env:get('BUILD_ID'), + Pass = data.Pass, + Dependencies = deps, + } + + -- Remember this dag node for IDE file generation purposes + data.__DagNode = dag + + return dag +end + +local alias_blueprint = { + Name = { + Required = true, + Help = "Set alias name", + Type = "string", + }, +} + +nodegen.add_evaluator("Alias", _alias_mt, alias_blueprint) diff --git a/ogl_editor/bin/win32/scripts/tundra/syntax/bison.lua b/ogl_editor/bin/win32/scripts/tundra/syntax/bison.lua new file mode 100644 index 0000000..a1bcd3c --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/syntax/bison.lua @@ -0,0 +1,42 @@ +module(..., package.seeall) + +local nodegen = require "tundra.nodegen" +local path = require "tundra.path" +local depgraph = require "tundra.depgraph" + +local _bison_mt = nodegen.create_eval_subclass {} + +local bison_blueprint = { + Source = { Required = true, Type = "string" }, + OutputFile = { Required = false, Type = "string" }, + TokenDefines = { Required = false, Type = "boolean" }, +} + +function _bison_mt:create_dag(env, data, deps) + local src = data.Source + local out_src + if data.OutputFile then + out_src = "$(OBJECTDIR)$(SEP)" .. data.OutputFile + else + local targetbase = "$(OBJECTDIR)$(SEP)bisongen_" .. path.get_filename_base(src) + out_src = targetbase .. ".c" + end + local defopt = "" + local outputs = { out_src } + if data.TokenDefines then + local out_hdr = path.drop_suffix(out_src) .. ".h" + defopt = "--defines=" .. out_hdr + outputs[#outputs + 1] = out_hdr + end + return depgraph.make_node { + Env = env, + Pass = data.Pass, + Label = "Bison $(@)", + Action = "$(BISON) $(BISONOPT) " .. defopt .. " --output-file=$(@:[1]) $(<)", + InputFiles = { src }, + OutputFiles = outputs, + Dependencies = deps, + } +end + +nodegen.add_evaluator("Bison", _bison_mt, bison_blueprint) diff --git a/ogl_editor/bin/win32/scripts/tundra/syntax/dotnet.lua b/ogl_editor/bin/win32/scripts/tundra/syntax/dotnet.lua new file mode 100644 index 0000000..eef4722 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/syntax/dotnet.lua @@ -0,0 +1,117 @@ +module(..., package.seeall) + +local util = require "tundra.util" +local nodegen = require "tundra.nodegen" +local depgraph = require "tundra.depgraph" + +local _csbase_mt = nodegen.create_eval_subclass { + DeclToEnvMappings = { + References = "CSLIBS", + RefPaths = "CSLIBPATH", + }, +} + +local _csexe_mt = nodegen.create_eval_subclass({ + Label = "CSharpExe $(@)", + Suffix = "$(CSPROGSUFFIX)", + Action = "$(CSCEXECOM)" +}, _csbase_mt) + +local _cslib_mt = nodegen.create_eval_subclass({ + Label = "CSharpLib $(@)", + Suffix = "$(CSLIBSUFFIX)", + Action = "$(CSCLIBCOM)" +}, _csbase_mt) + + +local csSourceExts = { ".cs" } +local csResXExts = { ".resx" } + +local function setup_refs_from_dependencies(env, dep_nodes, deps) + local dll_exts = { env:interpolate("$(CSLIBSUFFIX)") } + local refs = {} + local parent_env = env:get_parent() + for _, x in util.nil_ipairs(dep_nodes) do + if x.Keyword == "CSharpLib" then + local outputs = {} + local dag = x:get_dag(parent_env) + deps[#deps + 1] = dag + dag:insert_output_files(refs, dll_exts) + end + end + for _, r in ipairs(refs) do + env:append("CSLIBS", r) + end +end + +local function setup_resources(generator, env, assembly_name, resx_files, pass) + local result_files = {} + local deps = {} + local i = 1 + for _, resx in util.nil_ipairs(resx_files) do + local basename = path.get_filename_base(resx) + local result_file = string.format("$(OBJECTDIR)/_rescompile/%s.%s.resources", assembly_name, basename) + result_files[i] = result_file + deps[i] = depgraph.make_node { + Env = env, + Pass = pass, + Label = "resgen $(@)", + Action = "$(CSRESGEN)", + InputFiles = { resx }, + OutputFiles = { result_file }, + } + env:append("CSRESOURCES", result_file) + i = i + 1 + end + return result_files, deps +end + +function _csbase_mt:create_dag(env, data, deps) + local sources = data.Sources + local resources = data.Resources or {} + for _, r in util.nil_ipairs(resources) do + env:append("CSRESOURCES", r) + end + + sources = util.merge_arrays_2(sources, resources) + + setup_refs_from_dependencies(env, data.Depends, deps) + + return depgraph.make_node { + Env = env, + Pass = data.Pass, + Label = self.Label, + Action = self.Action, + InputFiles = sources, + OutputFiles = { nodegen.get_target(data, self.Suffix, self.Prefix) }, + Dependencies = util.uniq(deps), + } +end + +do + local csblueprint = { + Name = { + Required = true, + Help = "Set output (base) filename", + Type = "string", + }, + Sources = { + Required = true, + Help = "List of source files", + Type = "source_list", + ExtensionKey = "DOTNET_SUFFIXES", + }, + Resources = { + Help = "List of resource files", + Type = "source_list", + ExtensionKey = "DOTNET_SUFFIXES_RESOURCE", + }, + Target = { + Help = "Override target location", + Type = "string", + }, + } + + nodegen.add_evaluator("CSharpExe", _csexe_mt, csblueprint) + nodegen.add_evaluator("CSharpLib", _cslib_mt, csblueprint) +end diff --git a/ogl_editor/bin/win32/scripts/tundra/syntax/embed_lua.lua b/ogl_editor/bin/win32/scripts/tundra/syntax/embed_lua.lua new file mode 100644 index 0000000..9bc49c6 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/syntax/embed_lua.lua @@ -0,0 +1,65 @@ +module(..., package.seeall) + +local util = require "tundra.util" +local path = require "tundra.path" +local glob = require "tundra.syntax.glob" +local nodegen = require "tundra.nodegen" +local depgraph = require "tundra.depgraph" + +local lua_exts = { ".lua" } +local luac_mt_ = nodegen.create_eval_subclass {} + +local function luac(env, src, pass) + local target = "$(OBJECTDIR)/" .. path.drop_suffix(src) .. ".luac" + return target, depgraph.make_node { + Env = env, + Pass = pass, + Label = "LuaC $(@)", + Action = "$(LUAC) -o $(@) -- $(<)", + InputFiles = { src }, + OutputFiles = { target }, + ImplicitInputs = { "$(LUAC)" }, + } +end + +function luac_mt_:create_dag(env, data, deps) + local files = {} + local deps = {} + local inputs = {} + local action_fragments = {} + + for _, base_dir in ipairs(data.Dirs) do + local lua_files = glob.Glob { Dir = base_dir, Extensions = lua_exts } + local dir_len = base_dir:len() + for _, filename in pairs(lua_files) do + local rel_name = filename:sub(dir_len+2) + local pkg_name = rel_name:gsub("[/\\]", "."):gsub("%.lua$", "") + inputs[#inputs + 1] = filename + if env:get("LUA_EMBED_ASCII", "no") == "no" then + files[#files + 1], deps[#deps + 1] = luac(env, filename, data.Pass) + else + files[#files + 1] = filename + end + action_fragments[#action_fragments + 1] = pkg_name + action_fragments[#action_fragments + 1] = files[#files] + end + end + + return depgraph.make_node { + Env = env, + Label = "EmbedLuaSources $(@)", + Pass = data.Pass, + Action = "$(GEN_LUA_DATA) " .. table.concat(action_fragments, " ") .. " > $(@)", + InputFiles = inputs, + OutputFiles = { "$(OBJECTDIR)/" .. data.OutputFile }, + Dependencies = deps, + ImplicitInputs = { "$(GEN_LUA_DATA)" }, + } +end + +local blueprint = { + Dirs = { Type = "table", Required = "true" }, + OutputFile = { Type = "string", Required = "true" }, +} + +nodegen.add_evaluator("EmbedLuaSources", luac_mt_, blueprint) diff --git a/ogl_editor/bin/win32/scripts/tundra/syntax/files.lua b/ogl_editor/bin/win32/scripts/tundra/syntax/files.lua new file mode 100644 index 0000000..05cdb40 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/syntax/files.lua @@ -0,0 +1,50 @@ +module(..., package.seeall) + +local decl = require "tundra.decl" +local depgraph = require "tundra.depgraph" + +local common_blueprint = { + Source = { + Required = true, + Help = "Source filename", + Type = "string", + }, + Target = { + Required = true, + Help = "Target filename", + Type = "string", + }, +} + +local function def_copy_rule(name, command, cfg_invariant) + DefRule { + Name = name, + ConfigInvariant = cfg_invariant, + Blueprint = common_blueprint, + Command = command, + Setup = function (env, data) + return { + InputFiles = { data.Source }, + OutputFiles = { data.Target }, + } + end, + } +end + +def_copy_rule('CopyFile', '$(_COPY_FILE)') +def_copy_rule('CopyFileInvariant', '$(_COPY_FILE)', true) +def_copy_rule('HardLinkFile', '$(_HARDLINK_FILE)') +def_copy_rule('HardLinkFileInvariant', '$(_HARDLINK_FILE)', true) + + +function hardlink_file(env, src, dst, pass, deps) + return depgraph.make_node { + Env = env, + Annotation = "HardLink $(<)", + Action = "$(_HARDLINK_FILE)", + InputFiles = { src }, + OutputFiles = { dst }, + Dependencies = deps, + Pass = pass, + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/syntax/flex.lua b/ogl_editor/bin/win32/scripts/tundra/syntax/flex.lua new file mode 100644 index 0000000..6e796a9 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/syntax/flex.lua @@ -0,0 +1,28 @@ +-- flex.lua - Support for FLEX + +module(..., package.seeall) + +local path = require "tundra.path" + +DefRule { + Name = "Flex", + Command = "flex --outfile=$(@:[1]) --header-file=$(@:[2]) $(<)", + ConfigInvariant = true, + + Blueprint = { + Source = { Required = true, Type = "string" }, + OutputCFile = { Required = false, Type = "string" }, + OutputHeaderFile = { Required = false, Type = "string" }, + }, + + Setup = function (env, data) + local src = data.Source + local base_name = path.drop_suffix(src) + local gen_c = data.OutputCFile or (base_name .. '.c') + local gen_h = data.OutputHeaderFileFile or (base_name .. '.h') + return { + InputFiles = { src }, + OutputFiles = { gen_c, gen_h }, + } + end, +} diff --git a/ogl_editor/bin/win32/scripts/tundra/syntax/glob.lua b/ogl_editor/bin/win32/scripts/tundra/syntax/glob.lua new file mode 100644 index 0000000..02a623f --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/syntax/glob.lua @@ -0,0 +1,122 @@ +-- glob.lua - Glob syntax elements for declarative tundra.lua usage + +module(..., package.seeall) + +local util = require "tundra.util" +local path = require "tundra.path" +local decl = require "tundra.decl" +local dirwalk = require "tundra.dirwalk" + +local ignored_dirs = util.make_lookup_table { ".git", ".svn", "CVS" } + +local function glob(directory, recursive, filter_fn) + local result = {} + + local function dir_filter(dir_name) + if not recursive or ignored_dirs[dir_name] then + return false + end + return true + end + + for _, path in ipairs(dirwalk.walk(directory, dir_filter)) do + if filter_fn(path) then + result[#result + 1] = path + end + end + return result +end + +-- Glob syntax - Search for source files matching extension list +-- +-- Synopsis: +-- Glob { +-- Dir = "...", +-- Extensions = { ".ext", ... }, +-- [Recursive = false,] +-- } +-- +-- Options: +-- Dir = "directory" (required) +-- - Base directory to search in +-- +-- Extensions = { ".ext1", ".ext2" } (required) +-- - List of file extensions to include +-- +-- Recursive = boolean (optional, default: true) +-- - Specified whether to recurse into subdirectories +function Glob(args) + local recursive = args.Recursive + if type(recursive) == "nil" then + recursive = true + end + if not args.Extensions then + croak("no 'Extensions' specified in Glob (Dir is '%s')", args.Dir) + end + local extensions = assert(args.Extensions) + local ext_lookup = util.make_lookup_table(extensions) + return glob(args.Dir, recursive, function (fn) + local ext = path.get_extension(fn) + return ext_lookup[ext] + end) +end + +-- FGlob syntax - Search for source files matching extension list with +-- configuration filtering +-- +-- Usage: +-- FGlob { +-- Dir = "...", +-- Extensions = { ".ext", .... }, +-- Filters = { +-- { Pattern = "/[Ww]in32/", Config = "win32-*-*" }, +-- { Pattern = "/[Dd]ebug/", Config = "*-*-debug" }, +-- ... +-- }, +-- [Recursive = false], +-- } +local function FGlob(args) + -- Use the regular glob to fetch the file list. + local files = Glob(args) + local pats = {} + local result = {} + + -- Construct a mapping from { Pattern = ..., Config = ... } + -- to { Pattern = { Config = ... } } with new arrays per config that can be + -- embedded in the source result. + for _, fitem in ipairs(args.Filters) do + if not fitem.Config then + croak("no 'Config' specified in FGlob (Pattern is '%s')", fitem.Pattern) + end + local tab = { Config = assert(fitem.Config) } + pats[assert(fitem.Pattern)] = tab + result[#result + 1] = tab + end + + -- Traverse all files and see if they match any configuration filters. If + -- they do, stick them in matching list. Otherwise, just keep them in the + -- main list. This has the effect of returning an array such as this: + -- { + -- { "foo.c"; Config = "abc-*-*" }, + -- { "bar.c"; Config = "*-*-def" }, + -- "baz.c", "qux.m" + -- } + for _, f in ipairs(files) do + local filtered = false + for filter, list in pairs(pats) do + if f:match(filter) then + filtered = true + list[#list + 1] = f + break + end + end + if not filtered then + result[#result + 1] = f + end + end + return result +end + +decl.add_function("Glob", Glob) +decl.add_function("FGlob", FGlob) + diff --git a/ogl_editor/bin/win32/scripts/tundra/syntax/install.lua b/ogl_editor/bin/win32/scripts/tundra/syntax/install.lua new file mode 100644 index 0000000..c8dedcd --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/syntax/install.lua @@ -0,0 +1,40 @@ +-- install.lua - Express file copying in unit form. + +module(..., package.seeall) + +local nodegen = require "tundra.nodegen" +local files = require "tundra.syntax.files" +local path = require "tundra.path" +local util = require "tundra.util" +local depgraph = require "tundra.depgraph" + +local _mt = nodegen.create_eval_subclass {} + +local blueprint = { + Sources = { Type = "source_list", Required = true }, + TargetDir = { Type = "string", Required = true }, +} + +function _mt:create_dag(env, data, deps) + local my_pass = data.Pass + local sources = data.Sources + local target_dir = data.TargetDir + + local copies = {} + + -- all the copy operations will depend on all the incoming deps + for _, src in util.nil_ipairs(sources) do + local base_fn = select(2, path.split(src)) + local target = target_dir .. '/' .. base_fn + copies[#copies + 1] = files.copy_file(env, src, target, my_pass, deps) + end + + return depgraph.make_node { + Env = env, + Label = "Install group for " .. decl.Name, + Pass = my_pass, + Dependencies = copies + } +end + +nodegen.add_evaluator("Install", _mt, blueprint) diff --git a/ogl_editor/bin/win32/scripts/tundra/syntax/ispc.lua b/ogl_editor/bin/win32/scripts/tundra/syntax/ispc.lua new file mode 100644 index 0000000..5c212b8 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/syntax/ispc.lua @@ -0,0 +1,25 @@ +-- ispc.lua - Support for Intel SPMD Program Compiler + +module(..., package.seeall) + +local path = require "tundra.path" + +DefRule { + Name = "ISPC", + Command = "$(ISPCCOM)", + + Blueprint = { + Source = { Required = true, Type = "string" }, + }, + + Setup = function (env, data) + local src = data.Source + local base_name = path.drop_suffix(src) + local objFile = "$(OBJECTDIR)$(SEP)" .. base_name .. "__" .. path.get_extension(src):sub(2) .. "$(OBJECTSUFFIX)" + local hFile = "$(OBJECTDIR)$(SEP)" .. base_name .. "_ispc.h" + return { + InputFiles = { src }, + OutputFiles = { objFile, hFile }, + } + end, +} diff --git a/ogl_editor/bin/win32/scripts/tundra/syntax/lemon.lua b/ogl_editor/bin/win32/scripts/tundra/syntax/lemon.lua new file mode 100644 index 0000000..4cf173f --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/syntax/lemon.lua @@ -0,0 +1,27 @@ +-- lemon.lua - Support for the Lemon parser generator + +module(..., package.seeall) + +local path = require "tundra.path" + +DefRule { + Name = "Lemon", + Command = "lemon $(<)", + ConfigInvariant = true, + + Blueprint = { + Source = { Required = true, Type = "string" }, + }, + + Setup = function (env, data) + local src = data.Source + local base_name = path.drop_suffix(src) + local gen_c = base_name .. '.c' + local gen_h = base_name .. '.h' + local gen_out = base_name .. '.out' + return { + InputFiles = { src }, + OutputFiles = { gen_c, gen_h, gen_out }, + } + end, +} diff --git a/ogl_editor/bin/win32/scripts/tundra/syntax/native.lua b/ogl_editor/bin/win32/scripts/tundra/syntax/native.lua new file mode 100644 index 0000000..e57c65c --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/syntax/native.lua @@ -0,0 +1,312 @@ +-- native.lua -- support for programs, static libraries and such + +module(..., package.seeall) + +local util = require "tundra.util" +local nodegen = require "tundra.nodegen" +local path = require "tundra.path" +local depgraph = require "tundra.depgraph" + +local _native_mt = nodegen.create_eval_subclass { + DeclToEnvMappings = { + Libs = "LIBS", + Defines = "CPPDEFS", + Includes = "CPPPATH", + Frameworks = "FRAMEWORKS", + LibPaths = "LIBPATH", + }, +} + +local _object_mt = nodegen.create_eval_subclass({ + Suffix = "$(OBJECTSUFFIX)", + Prefix = "", + Action = "$(OBJCOM)", + Label = "Object $(<)", + OverwriteOutputs = true, +}, _native_mt) + +local _program_mt = nodegen.create_eval_subclass({ + Suffix = "$(PROGSUFFIX)", + Prefix = "$(PROGPREFIX)", + Action = "$(PROGCOM)", + Label = "Program $(@)", + PreciousOutputs = true, + OverwriteOutputs = true, + Expensive = true, +}, _native_mt) + +local _staticlib_mt = nodegen.create_eval_subclass({ + Suffix = "$(LIBSUFFIX)", + Prefix = "$(LIBPREFIX)", + Action = "$(LIBCOM)", + Label = "StaticLibrary $(@)", + -- Play it safe and delete the output files of this node before re-running it. + -- Solves iterative issues with e.g. AR + OverwriteOutputs = false, + IsStaticLib = true, +}, _native_mt) + +local _objgroup_mt = nodegen.create_eval_subclass({ + Label = "ObjGroup $(<)", +}, _native_mt) + +local _shlib_mt = nodegen.create_eval_subclass({ + Suffix = "$(SHLIBSUFFIX)", + Prefix = "$(SHLIBPREFIX)", + Action = "$(SHLIBCOM)", + Label = "SharedLibrary $(@)", + PreciousOutputs = true, + OverwriteOutputs = true, + Expensive = true, +}, _native_mt) + +local _extlib_mt = nodegen.create_eval_subclass({ + Suffix = "", + Prefix = "", + Label = "", +}, _native_mt) + +local cpp_exts = util.make_lookup_table { ".cpp", ".cc", ".cxx", ".C" } + +local _is_native_mt = util.make_lookup_table { _object_mt, _program_mt, _staticlib_mt, _shlib_mt, _extlib_mt, _objgroup_mt } + +function _native_mt:customize_env(env, raw_data) + if env:get('GENERATE_PDB', '0') ~= '0' then + -- Figure out the final linked PDB (the one next to the dll or exe) + if raw_data.Target then + local target = env:interpolate(raw_data.Target) + local link_pdb = path.drop_suffix(target) .. '.pdb' + env:set('_PDB_LINK_FILE', link_pdb) + else + env:set('_PDB_LINK_FILE', "$(OBJECTDIR)/" .. raw_data.Name .. ".pdb") + end + -- Keep the compiler's idea of the PDB file separate + env:set('_PDB_CC_FILE', "$(OBJECTDIR)/" .. raw_data.Name .. "_ccpdb.pdb") + env:set('_USE_PDB_CC', '$(_USE_PDB_CC_OPT)') + env:set('_USE_PDB_LINK', '$(_USE_PDB_LINK_OPT)') + end + + local pch = raw_data.PrecompiledHeader + + if pch and env:get('_PCH_SUPPORTED', '0') ~= '0' then + assert(pch.Header) + if not nodegen.resolve_pass(pch.Pass) then + croak("%s: PrecompiledHeader requires a valid Pass", raw_data.Name) + end + env:set('_PCH_FILE', "$(OBJECTDIR)/" .. raw_data.Name .. ".pch") + env:set('_USE_PCH', '$(_USE_PCH_OPT)') + env:set('_PCH_SOURCE', path.normalize(pch.Source)) + env:set('_PCH_HEADER', pch.Header) + env:set('_PCH_PASS', pch.Pass) + if cpp_exts[path.get_extension(pch.Source)] then + env:set('PCHCOMPILE', '$(PCHCOMPILE_CXX)') + else + env:set('PCHCOMPILE', '$(PCHCOMPILE_CC)') + end + local pch_source = path.remove_prefix(raw_data.SourceDir or '', pch.Source) + if not util.array_contains(raw_data.Sources, pch_source) then + raw_data.Sources[#raw_data.Sources + 1] = pch_source + end + end + + if env:has_key('MODDEF') then + env:set('_USE_MODDEF', '$(_USE_MODDEF_OPT)') + end +end + +function _native_mt:create_dag(env, data, input_deps) + + local build_id = env:get("BUILD_ID") + local my_pass = data.Pass + local sources = data.Sources + local libsuffix = { env:get("LIBSUFFIX") } + local shlibsuffix = { env:get("SHLIBLINKSUFFIX") } + local my_extra_deps = {} + + -- Link with libraries in dependencies. + for _, dep in util.nil_ipairs(data.Depends) do + + if dep.Keyword == "SharedLibrary" then + -- On Win32 toolsets, we need foo.lib + -- On UNIX toolsets, we need -lfoo + -- + -- We only want to add this if the node actually produced any output (i.e + -- it's not completely filtered out.) + local node = dep:get_dag(env:get_parent()) + if #node.outputs > 0 then + my_extra_deps[#my_extra_deps + 1] = node + local target = dep.Decl.Target or dep.Decl.Name + target = target .. "$(SHLIBLINKSUFFIX)" + env:append('LIBS', target) + end + elseif dep.Keyword == "StaticLibrary" then + local node = dep:get_dag(env:get_parent()) + my_extra_deps[#my_extra_deps + 1] = node + if not self.IsStaticLib then + node:insert_output_files(sources, libsuffix) + end + elseif dep.Keyword == "ObjGroup" then + -- We want all .obj files + local objsuffix = { env:get("OBJECTSUFFIX") } + + -- And also .res files, if we know what that is + if env:has_key("W32RESSUFFIX") then + objsuffix[#objsuffix + 1] = env:get("W32RESSUFFIX") + end + + local node = dep:get_dag(env:get_parent()) + my_extra_deps[#my_extra_deps + 1] = node + if not sources then sources = {} end + for _, dep in util.nil_ipairs(node.deps) do + my_extra_deps[#my_extra_deps + 1] = dep + dep:insert_output_files(sources, objsuffix) + end + else + + --[[ + + A note about win32 import libraries: + + It is tempting to add an implicit input dependency on the import + library of the linked-to shared library here; but this would be + suboptimal: + + 1. Because there is a dependency between the nodes themselves, + the import library generation will always run before this link + step is run. Therefore, the import lib will always exist and be + updated before this link step runs. + + 2. Because the import library is regenerated whenever the DLL is + relinked we would have to custom-sign it (using a hash of the + DLLs export list) to avoid relinking the executable all the + time when only the DLL's internals change. + + 3. The DLL's export list should be available in headers anyway, + which is already covered in the compilation of the object files + that actually uses those APIs. + + Therefore the best way right now is to not tell Tundra about the + import lib at all and rely on header scanning to pick up API + changes. + + An implicit input dependency would be needed however if someone + is doing funky things with their import library (adding + non-linker-generated code for example). These cases are so rare + that we can safely put them off. + + ]]-- + end + end + + -- Make sure sources are not specified more than once. This can happen when + -- there are recursive dependencies on object groups. + if data.Sources and #data.Sources > 0 then + data.Sources = util.uniq(data.Sources) + end + + local aux_outputs = env:get_list("AUX_FILES_" .. self.Keyword:upper(), {}) + + if env:get('GENERATE_PDB', '0') ~= '0' then + aux_outputs[#aux_outputs + 1] = "$(_PDB_LINK_FILE)" + aux_outputs[#aux_outputs + 1] = "$(_PDB_CC_FILE)" + end + + local extra_inputs = {} + + if env:has_key('MODDEF') then + extra_inputs[#extra_inputs + 1] = "$(MODDEF)" + end + + local targets = nil + + if self.Action then + targets = { nodegen.get_target(data, self.Suffix, self.Prefix) } + end + + local deps = util.merge_arrays(input_deps, my_extra_deps) + + local dag = depgraph.make_node { + Env = env, + Label = self.Label, + Pass = data.Pass, + Action = self.Action, + PreAction = data.PreAction, + InputFiles = data.Sources, + InputFilesUntracked = data.UntrackedSources, + OutputFiles = targets, + AuxOutputFiles = aux_outputs, + ImplicitInputs = extra_inputs, + Dependencies = deps, + OverwriteOutputs = self.OverwriteOutputs, + PreciousOutputs = self.PreciousOutputs, + Expensive = self.Expensive, + } + + -- Remember this dag node for IDE file generation purposes + data.__DagNode = dag + + return dag +end + +local native_blueprint = { + Name = { + Required = true, + Help = "Set output (base) filename", + Type = "string", + }, + Sources = { + Required = true, + Help = "List of source files", + Type = "source_list", + ExtensionKey = "NATIVE_SUFFIXES", + }, + UntrackedSources = { + Help = "List of input files that are not tracked", + Type = "source_list", + ExtensionKey = "NATIVE_SUFFIXES", + }, + Target = { + Help = "Override target location", + Type = "string", + }, + PreAction = { + Help = "Optional action to run before main action.", + Type = "string", + }, + PrecompiledHeader = { + Help = "Enable precompiled header (if supported)", + Type = "table", + }, + IdeGenerationHints = { + Help = "Data to support control IDE file generation", + Type = "table", + }, +} + +local external_blueprint = { + Name = { + Required = true, + Help = "Set name of the external library", + Type = "string", + }, +} + +local external_counter = 1 + +function _extlib_mt:create_dag(env, data, input_deps) + local name = string.format("dummy node for %s (%d)", data.Name, external_counter) + external_counter = external_counter + 1 + return depgraph.make_node { + Env = env, + Label = name, + Pass = data.Pass, + Dependencies = input_deps, + } +end + +nodegen.add_evaluator("Object", _object_mt, native_blueprint) +nodegen.add_evaluator("Program", _program_mt, native_blueprint) +nodegen.add_evaluator("StaticLibrary", _staticlib_mt, native_blueprint) +nodegen.add_evaluator("SharedLibrary", _shlib_mt, native_blueprint) +nodegen.add_evaluator("ExternalLibrary", _extlib_mt, external_blueprint) +nodegen.add_evaluator("ObjGroup", _objgroup_mt, native_blueprint) diff --git a/ogl_editor/bin/win32/scripts/tundra/syntax/osx-bundle.lua b/ogl_editor/bin/win32/scripts/tundra/syntax/osx-bundle.lua new file mode 100644 index 0000000..db1e052 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/syntax/osx-bundle.lua @@ -0,0 +1,93 @@ +-- osx-bundle.lua - Support for Max OS X bundles + +module(..., package.seeall) + +local nodegen = require "tundra.nodegen" +local files = require "tundra.syntax.files" +local path = require "tundra.path" +local util = require "tundra.util" +local depgraph = require "tundra.depgraph" + +_osx_bundle_mt = nodegen.create_eval_subclass { } +_compile_nib_mt = nodegen.create_eval_subclass { } + +function _osx_bundle_mt:create_dag(env, data, deps) + local bundle_dir = data.Target + local pass = data.Pass + local contents = bundle_dir .. "/Contents" + local copy_deps = {} + + local infoplist = data.InfoPList + copy_deps[#copy_deps+1] = files.hardlink_file(env, data.InfoPList, contents .. "/Info.plist", pass, deps) + + if data.PkgInfo then + copy_deps[#copy_deps+1] = files.hardlink_file(env, data.PkgInfo, contents .. "/PkgInfo", pass, deps) + end + + if data.Executable then + local basename = select(2, path.split(data.Executable)) + copy_deps[#copy_deps+1] = files.hardlink_file(env, data.Executable, contents .. "/MacOS/" .. basename, pass, deps) + end + + local dirs = { + { Tag = "Resources", Dir = contents .. "/Resources/" }, + { Tag = "MacOSFiles", Dir = contents .. "/MacOS/" }, + } + + for _, params in ipairs(dirs) do + local function do_copy(fn) + local basename = select(2, path.split(fn)) + copy_deps[#copy_deps+1] = files.hardlink_file(env, fn, params.Dir .. basename, pass, deps) + end + + local items = data[params.Tag] + for _, dep in util.nil_ipairs(nodegen.flatten_list(env:get('BUILD_ID'), items)) do + if type(dep) == "string" then + do_copy(dep) + else + local node = dep:get_dag(env) + print(node) + deps[#deps+1] = node + local files = {} + node:insert_output_files(files) + for _, fn in ipairs(files) do + do_copy(fn) + end + end + end + end + + return depgraph.make_node { + Env = env, + Pass = pass, + Label = "OsxBundle " .. data.Target, + Dependencies = util.merge_arrays_2(deps, copy_deps), + } +end + +function _compile_nib_mt:create_dag(env, data, deps) + return depgraph.make_node { + Env = env, + Pass = data.Pass, + Label = "CompileNib $(@)", + Action = "$(NIBCC)", + Dependencies = deps, + InputFiles = { data.Source }, + OutputFiles = { "$(OBJECTDIR)/" .. data.Target }, + } +end + +nodegen.add_evaluator("OsxBundle", _osx_bundle_mt, { + Target = { Type = "string", Required = true, Help = "Target .app directory name" }, + Executable = { Type = "string", Help = "Executable to embed" }, + InfoPList = { Type = "string", Required = true, Help = "Info.plist file" }, + PkgInfo = { Type = "string", Help = "PkgInfo file" }, + Resources = { Type = "filter_table", Help = "Files to copy to 'Resources'" }, + MacOSFiles = { Type = "filter_table", Help = "Files to copy to 'MacOS'" }, +}) + +nodegen.add_evaluator("CompileNib", _compile_nib_mt, { + Source = { Type = "string", Required = true }, + Target = { Type = "string", Required = true }, +}) + diff --git a/ogl_editor/bin/win32/scripts/tundra/syntax/pkgconfig.lua b/ogl_editor/bin/win32/scripts/tundra/syntax/pkgconfig.lua new file mode 100644 index 0000000..485291c --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/syntax/pkgconfig.lua @@ -0,0 +1,51 @@ +module(..., package.seeall) + +function ConfigureRaw(cmdline, name, constructor) + local fh = assert(io.popen(cmdline)) + local data = fh:read("*all") + fh:close() + + local cpppath = {} + local libpath = {} + local libs = {} + local defines = {} + local frameworks = {} + + for kind, value in data:gmatch("-([ILlD])([^ \n\r]+)") do + if kind == "I" then + cpppath[#cpppath + 1] = value + elseif kind == "D" then + defines[#defines + 1] = value + elseif kind == "L" then + libpath[#libpath + 1] = value + elseif kind == "l" then + libs[#libs + 1] = value + end + end + + for value in data:gmatch("-framework ([^ \n\r]+)") do + frameworks[#frameworks + 1] = value + end + + -- We don't have access to ExternalLibrary here - user has to pass it in. + return constructor({ + Name = name, + Propagate = { + Env = { + FRAMEWORKS = frameworks, + CPPDEFS = defines, + CPPPATH = cpppath, + LIBS = libs, + LIBPATH = libpath + } + } + }) +end + +function Configure(name, ctor) + return internal_cfg("pkg-config " .. name .. " --cflags --libs", name, ctor) +end + +function ConfigureWithTool(tool, name, ctor) + return internal_cfg(tool .. " --cflags --libs", name, ctor) +end diff --git a/ogl_editor/bin/win32/scripts/tundra/syntax/testsupport.lua b/ogl_editor/bin/win32/scripts/tundra/syntax/testsupport.lua new file mode 100644 index 0000000..d79dd0f --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/syntax/testsupport.lua @@ -0,0 +1,29 @@ +-- testsupport.lua: A simple UpperCaseFile unit used for Tundra's test harness + +module(..., package.seeall) + +local util = require 'tundra.util' +local nodegen = require 'tundra.nodegen' +local depgraph = require 'tundra.depgraph' + +local mt = nodegen.create_eval_subclass {} + +function mt:create_dag(env, data, deps) + return depgraph.make_node { + Env = env, + Pass = data.Pass, + Label = "UpperCaseFile \$(@)", + Action = "tr a-z A-Z < \$(<) > \$(@)", + InputFiles = { data.InputFile }, + OutputFiles = { data.OutputFile }, + Dependencies = deps, + } +end + +nodegen.add_evaluator("UpperCaseFile", mt, { + Name = { Type = "string", Required = "true" }, + InputFile = { Type = "string", Required = "true" }, + OutputFile = { Type = "string", Required = "true" }, +}) + + diff --git a/ogl_editor/bin/win32/scripts/tundra/test/t_env.lua b/ogl_editor/bin/win32/scripts/tundra/test/t_env.lua new file mode 100644 index 0000000..1209e91 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/test/t_env.lua @@ -0,0 +1,62 @@ + +module(..., package.seeall) + +unit_test('scalar interpolation', function (t) + local e = require 'tundra.environment' + local e1, e2, e3 + e1 = e.create(nil, { Foo="Foo", Baz="Strut" }) + e2 = e1:clone({ Foo="Bar" }) + e3 = e1:clone({ Baz="c++" }) + + t:check_equal(e1:get("Foo"), "Foo") + t:check_equal(e1:get("Baz"), "Strut") + t:check_equal(e2:get("Foo"), "Bar") + t:check_equal(e2:get("Baz"), "Strut") + t:check_equal(e3:get("Fransos", "Ost"), "Ost") + + e1:set("Foo", "Foo") + t:check_equal(e1:interpolate("$(Foo)"), "Foo") + t:check_equal(e1:interpolate("$(Foo:u)"), "FOO") + t:check_equal(e1:interpolate("$(Foo:l)"), "foo") + + t:check_equal(e1:interpolate("$(Foo) $(Baz)"), "Foo Strut") + t:check_equal(e2:interpolate("$(Foo) $(Baz)"), "Bar Strut") + t:check_equal(e3:interpolate("$(Foo) $(Baz)"), "Foo c++") + t:check_equal(e1:interpolate("a $(<)", { ['<'] = "foo" }), "a foo") + + e1:set("FILE", "foo/bar.txt") + t:check_equal(e1:interpolate("$(FILE:B)"), "foo/bar") + t:check_equal(e1:interpolate("$(FILE:F)"), "bar.txt") + t:check_equal(e1:interpolate("$(FILE:D)"), "foo") +end) + +unit_test('list interpolation', function (t) + local e = require 'tundra.environment' + local e1 = e.create() + + e1:set("Foo", { "Foo" }) + t:check_equal(e1:interpolate("$(Foo)"), "Foo") + + e1:set("Foo", { "Foo", "Bar" } ) + t:check_equal(e1:interpolate("$(Foo)") , "Foo Bar") + t:check_equal(e1:interpolate("$(Foo:j,)"), "Foo,Bar") + t:check_equal(e1:interpolate("$(Foo:p!)") , "!Foo !Bar") + t:check_equal(e1:interpolate("$(Foo:a!)") , "Foo! Bar!") + t:check_equal(e1:interpolate("$(Foo:p-I:j__)") , "-IFoo__-IBar") + t:check_equal(e1:interpolate("$(Foo:j\\:)"), "Foo:Bar") + t:check_equal(e1:interpolate("$(Foo:u)"), "FOO BAR") + t:check_equal(e1:interpolate("$(Foo:[2])"), "Bar") + t:check_equal(e1:interpolate("$(Foo:Aoo)"), "Foo Baroo") + t:check_equal(e1:interpolate("$(Foo:PF)"), "Foo FBar") + + local lookaside = { + ['@'] = 'output', + ['<'] = { 'a', 'b' }, + } + + t:check_equal(e1:interpolate("$(Foo) $(<)=$(@)", lookaside), "Foo Bar a b=output") + + -- Verify interpolation caching is cleared when keys change. + e1:set("Foo", { "Baz" }) + t:check_equal(e1:interpolate("$(Foo) $(<)=$(@)", lookaside), "Baz a b=output") +end) diff --git a/ogl_editor/bin/win32/scripts/tundra/test/t_path.lua b/ogl_editor/bin/win32/scripts/tundra/test/t_path.lua new file mode 100644 index 0000000..087bb99 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/test/t_path.lua @@ -0,0 +1,81 @@ +module(..., package.seeall) + +local path = require "tundra.path" +local native = require "tundra.native" + +local function check_path(t, p, expected) + p = p:gsub('\\', '/') + t:check_equal(p, expected) +end + +unit_test('path.normalize', function (t) + check_path(t, path.normalize("foo"), "foo") + check_path(t, path.normalize("foo/bar"), "foo/bar") + check_path(t, path.normalize("foo//bar"), "foo/bar") + check_path(t, path.normalize("foo/./bar"), "foo/bar") + check_path(t, path.normalize("foo/../bar"), "bar") + check_path(t, path.normalize("../bar"), "../bar") + check_path(t, path.normalize("foo/../../bar"), "../bar") +end) + +unit_test('path.join', function (t) + check_path(t, path.join("foo", "bar"), "foo/bar") + check_path(t, path.join("foo", "../bar"), "bar") + check_path(t, path.join("/foo", "bar"), "/foo/bar") +end) + +unit_test('path.split', function (t) + local function check_split(p, expected_dir, expected_fn) + local dir, fn = path.split(p) + dir = dir:gsub('\\', '/') + fn = fn:gsub('\\', '/') + t:check_equal(dir, expected_dir) + t:check_equal(fn, expected_fn) + end + + check_split("", ".", "") + check_split("foo", ".", "foo") + check_split("foo/bar", "foo", "bar") + check_split("/foo/bar", "/foo", "bar") + check_split("x:\\foo\\bar", "x:/foo", "bar") +end) + + +unit_test('path.get_filename_dir', function (t) + t:check_equal(path.get_filename_dir("foo/bar"), "foo") + t:check_equal(path.get_filename_dir("foo"), "") +end) + +unit_test('path.get_filename', function (t) + t:check_equal(path.get_filename("foo/bar"), "bar") + t:check_equal(path.get_filename("foo"), "foo") +end) + +unit_test('path.get_extension', function (t) + t:check_equal(path.get_extension("foo"), "") + t:check_equal(path.get_extension("foo."), ".") + t:check_equal(path.get_extension("foo.c"), ".c") + t:check_equal(path.get_extension("foo/bar/.c"), ".c") + t:check_equal(path.get_extension("foo/bar/baz.cpp"), ".cpp") +end) + +unit_test('path.drop_suffix', function (t) + t:check_equal(path.drop_suffix("foo.c"), "foo") + t:check_equal(path.drop_suffix("foo/bar.c"), "foo/bar") + t:check_equal(path.drop_suffix("/foo/bar.c"), "/foo/bar") +end) + +unit_test('path.get_filename_base', function (t) + t:check_equal(path.get_filename_base("foo1"), "foo1") + t:check_equal(path.get_filename_base("foo2.c"), "foo2") + t:check_equal(path.get_filename_base("/path/to/foo3"), "foo3") + t:check_equal(path.get_filename_base("/path/to/foo4.c"), "foo4") +end) + +unit_test('path.is_absolute', function (t) + t:check_equal(path.is_absolute("/foo") and "true" or "false", "true") + t:check_equal(path.is_absolute("foo") and "true" or "false", "false") + if native.host_platform == "windows" then + t:check_equal(path.is_absolute("x:\\foo") and "true" or "false", "true") + end +end) diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/clang-osx.lua b/ogl_editor/bin/win32/scripts/tundra/tools/clang-osx.lua new file mode 100644 index 0000000..bd5b66b --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/clang-osx.lua @@ -0,0 +1,11 @@ +module(..., package.seeall) + +function apply(env, options) + tundra.unitgen.load_toolset("gcc-osx", env) + + env:set_many { + ["CC"] = "clang", + ["CXX"] = "clang++", + ["LD"] = "clang", + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/dotnet.lua b/ogl_editor/bin/win32/scripts/tundra/tools/dotnet.lua new file mode 100644 index 0000000..e669e25 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/dotnet.lua @@ -0,0 +1,28 @@ +module(..., package.seeall) + +local frameworkDir = "c:\\Windows\\Microsoft.NET\\Framework" +local defaultFrameworkVersion = "v3.5" + +function apply(env, options) + tundra.unitgen.load_toolset("generic-dotnet", env) + + local version = options and assert(options.Version) or defaultFrameworkVersion + env:set_external_env_var('FrameworkDir', frameworkDir) + env:set_external_env_var('FrameworkVersion', version) + + local binPath = frameworkDir .. "\\" .. version + env:set_external_env_var('PATH', binPath .. ";" .. env:get_external_env_var('PATH')) + + -- C# support + env:set_many { + ["DOTNET_SUFFIXES"] = { ".cs" }, + ["DOTNET_SUFFIXES_RESOURCE"] = { ".resource" }, + ["CSC"] = "csc.exe", + ["CSPROGSUFFIX"] = ".exe", + ["CSLIBSUFFIX"] = ".dll", + ["CSRESGEN"] = "resgen $(<) $(@)", + ["_CSC_COMMON"] = "-warn:$(CSC_WARNING_LEVEL) /nologo $(CSLIBPATH:b:p/lib\\:) $(CSRESOURCES:b:p/resource\\:) $(CSLIBS:p/reference\\::A.dll)", + ["CSCLIBCOM"] = "$(CSC) $(_CSC_COMMON) $(CSCOPTS) -target:library -out:$(@:b) $(<:b)", + ["CSCEXECOM"] = "$(CSC) $(_CSC_COMMON) $(CSCOPTS) -target:exe -out:$(@:b) $(<:b)", + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/gas.lua b/ogl_editor/bin/win32/scripts/tundra/tools/gas.lua new file mode 100644 index 0000000..59a655c --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/gas.lua @@ -0,0 +1,12 @@ +module(..., package.seeall) + +function apply(env, options) + -- load the generic assembly toolset first + tundra.unitgen.load_toolset("generic-asm", env) + + env:set_many { + ["ASM"] = "as", + ["ASMCOM"] = "$(ASM) -o $(@) $(ASMDEFS:p-D) $(ASMOPTS) $(<)", + ["ASMINC_KEYWORDS"] = { ".include" }, + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/gcc-osx.lua b/ogl_editor/bin/win32/scripts/tundra/tools/gcc-osx.lua new file mode 100644 index 0000000..fb12ddd --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/gcc-osx.lua @@ -0,0 +1,19 @@ +module(..., package.seeall) + +function apply(env, options) + -- load the generic GCC toolset first + tundra.unitgen.load_toolset("gcc", env) + + env:set_many { + ["NATIVE_SUFFIXES"] = { ".c", ".cpp", ".cc", ".cxx", ".m", ".mm", ".a", ".o" }, + ["CXXEXTS"] = { "cpp", "cxx", "cc", "mm" }, + ["FRAMEWORKS"] = "", + ["SHLIBPREFIX"] = "lib", + ["SHLIBOPTS"] = "-shared", + ["_OS_CCOPTS"] = "$(FRAMEWORKS:p-F)", + ["SHLIBCOM"] = "$(LD) $(SHLIBOPTS) $(LIBPATH:p-L) $(LIBS:p-l) $(FRAMEWORKS:p-framework ) -o $(@) $(<)", + ["PROGCOM"] = "$(LD) $(PROGOPTS) $(LIBPATH:p-L) $(LIBS:p-l) $(FRAMEWORKS:p-framework ) -o $(@) $(<)", + ["OBJCCOM"] = "$(CCCOM)", -- objc uses same commandline + ["NIBCC"] = "ibtool --output-format binary1 --compile $(@) $(<)", + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/gcc.lua b/ogl_editor/bin/win32/scripts/tundra/tools/gcc.lua new file mode 100644 index 0000000..7849750 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/gcc.lua @@ -0,0 +1,30 @@ +module(..., package.seeall) + +function apply(env, options) + -- load the generic C toolset first + tundra.unitgen.load_toolset("generic-cpp", env) + + env:set_many { + ["NATIVE_SUFFIXES"] = { ".c", ".cpp", ".cc", ".cxx", ".a", ".o" }, + ["OBJECTSUFFIX"] = ".o", + ["LIBPREFIX"] = "lib", + ["LIBSUFFIX"] = ".a", + ["_GCC_BINPREFIX"] = "", + ["CC"] = "$(_GCC_BINPREFIX)gcc", + ["CXX"] = "$(_GCC_BINPREFIX)g++", + ["LIB"] = "$(_GCC_BINPREFIX)ar", + ["LD"] = "$(_GCC_BINPREFIX)gcc", + ["_OS_CCOPTS"] = "", + ["_OS_CXXOPTS"] = "", + ["CCCOM"] = "$(CC) $(_OS_CCOPTS) -c $(CPPDEFS:p-D) $(CPPPATH:f:p-I) $(CCOPTS) $(CCOPTS_$(CURRENT_VARIANT:u)) -o $(@) $(<)", + ["CXXCOM"] = "$(CXX) $(_OS_CXXOPTS) -c $(CPPDEFS:p-D) $(CPPPATH:f:p-I) $(CXXOPTS) $(CXXOPTS_$(CURRENT_VARIANT:u)) -o $(@) $(<)", + ["PROGOPTS"] = "", + ["PROGCOM"] = "$(LD) $(PROGOPTS) $(LIBPATH:p-L) -o $(@) $(<) $(LIBS:p-l)", + ["PROGPREFIX"] = "", + ["LIBOPTS"] = "", + ["LIBCOM"] = "$(LIB) -rs $(LIBOPTS) $(@) $(<)", + ["SHLIBPREFIX"] = "lib", + ["SHLIBOPTS"] = "-shared", + ["SHLIBCOM"] = "$(LD) $(SHLIBOPTS) $(LIBPATH:p-L) -o $(@) $(<) $(LIBS:p-l)", + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/generic-asm.lua b/ogl_editor/bin/win32/scripts/tundra/tools/generic-asm.lua new file mode 100644 index 0000000..e542eee --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/generic-asm.lua @@ -0,0 +1,78 @@ +module(..., package.seeall) + +local path = require "tundra.path" +local util = require "tundra.util" +local boot = require "tundra.boot" +local scanner = require "tundra.scanner" +local depgraph = require "tundra.depgraph" + +local default_keywords = { "include" } +local default_bin_keywords = { "incbin" } + +local function get_asm_scanner(env, fn) + local function test_bool(name, default) + val = env:get(name, default) + if val == "yes" or val == "true" or val == "1" then + return 1 + else + return 0 + end + end + local function new_scanner() + local paths = util.map(env:get_list("ASMINCPATH"), function (v) return env:interpolate(v) end) + local data = { + Paths = paths, + Keywords = env:get_list("ASMINC_KEYWORDS", default_keywords), + KeywordsNoFollow = env:get_list("ASMINC_BINARY_KEYWORDS", default_bin_keywords), + RequireWhitespace = test_bool("ASMINC_REQUIRE_WHITESPACE", "yes"), + UseSeparators = test_bool("ASMINC_USE_SEPARATORS", "yes"), + BareMeansSystem = test_bool("ASMINC_BARE_MEANS_SYSTEM", "no"), + } + return scanner.make_generic_scanner(data) + end + return env:memoize("ASMINCPATH", "_asm_scanner", new_scanner) +end + +-- Register implicit make functions for assembly files. +-- These functions are called to transform source files in unit lists into +-- object files. This function is registered as a setup function so it will be +-- run after user modifications to the environment, but before nodes are +-- processed. This way users can override the extension lists. +local function generic_asm_setup(env) + local _assemble = function(env, pass, fn) + local object_fn = path.make_object_filename(env, fn, '$(OBJECTSUFFIX)') + + return depgraph.make_node { + Env = env, + Label = 'Asm $(@)', + Pass = pass, + Action = "$(ASMCOM)", + InputFiles = { fn }, + OutputFiles = { object_fn }, + Scanner = get_asm_scanner(env, fn), + } + end + + for _, ext in ipairs(env:get_list("ASM_EXTS")) do + env:register_implicit_make_fn(ext, _assemble) + end +end + +function apply(_outer_env, options) + + _outer_env:add_setup_function(generic_asm_setup) + + _outer_env:set_many { + ["ASM_EXTS"] = { ".s", ".asm" }, + ["ASMINCPATH"] = {}, + ["ASMDEFS"] = "", + ["ASMDEFS_DEBUG"] = "", + ["ASMDEFS_PRODUCTION"] = "", + ["ASMDEFS_RELEASE"] = "", + ["ASMOPTS"] = "", + ["ASMOPTS_DEBUG"] = "", + ["ASMOPTS_PRODUCTION"] = "", + ["ASMOPTS_RELEASE"] = "", + } +end + diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/generic-cpp.lua b/ogl_editor/bin/win32/scripts/tundra/tools/generic-cpp.lua new file mode 100644 index 0000000..548a61c --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/generic-cpp.lua @@ -0,0 +1,103 @@ +module(..., package.seeall) + +local nodegen = require "tundra.nodegen" +local boot = require "tundra.boot" +local util = require "tundra.util" +local path = require "tundra.path" +local scanner = require "tundra.scanner" +local depgraph = require "tundra.depgraph" + +local scanner_cache = {} + +function get_cpp_scanner(env, fn) + local paths = util.map(env:get_list("CPPPATH"), function (v) return env:interpolate(v) end) + return scanner.make_cpp_scanner(paths) +end + +-- Register implicit make functions for C, C++ and Objective-C files. +-- These functions are called to transform source files in unit lists into +-- object files. This function is registered as a setup function so it will be +-- run after user modifications to the environment, but before nodes are +-- processed. This way users can override the extension lists. +local function generic_cpp_setup(env) + local _anyc_compile = function(env, pass, fn, label, action) + local object_fn = path.make_object_filename(env, fn, '$(OBJECTSUFFIX)') + + local output_files = { object_fn } + + local pch_source = env:get('_PCH_SOURCE', '') + local implicit_inputs = nil + + if fn == pch_source then + + label = 'Precompiled header' + pass = nodegen.resolve_pass(env:get('_PCH_PASS', '')) + action = "$(PCHCOMPILE)" + output_files = { "$(_PCH_FILE)", object_fn } + + elseif pch_source ~= '' and fn ~= pch_source then + + -- It would be good to make all non-pch source files dependent upon the .pch node. + -- That would require that we generate the .pch node before generating these nodes. + -- As it stands presently, when .pch compilation fails, the remaining sources + -- fail to compile, but if the dependencies were correctly setup, then they wouldn't + -- even try to compile. + + end + + return depgraph.make_node { + Env = env, + Label = label .. ' $(<)', + Pass = pass, + Action = action, + InputFiles = { fn }, + OutputFiles = output_files, + ImplicitInputs = implicit_inputs, + Scanner = get_cpp_scanner(env, fn), + } + end + + local mappings = { + ["CCEXTS"] = { Label="Cc", Action="$(CCCOM)" }, + ["CXXEXTS"] = { Label="C++", Action="$(CXXCOM)" }, + ["OBJCEXTS"] = { Label="ObjC", Action="$(OBJCCOM)" }, + } + + for key, setup in pairs(mappings) do + for _, ext in ipairs(env:get_list(key)) do + env:register_implicit_make_fn(ext, function(env, pass, fn) + return _anyc_compile(env, pass, fn, setup.Label, setup.Action) + end) + end + end +end + +function apply(_outer_env, options) + + _outer_env:add_setup_function(generic_cpp_setup) + + _outer_env:set_many { + ["IGNORED_AUTOEXTS"] = { ".h", ".hpp", ".hh", ".hxx", ".inl" }, + ["CCEXTS"] = { "c" }, + ["CXXEXTS"] = { "cpp", "cxx", "cc" }, + ["OBJCEXTS"] = { "m" }, + ["PROGSUFFIX"] = "$(HOSTPROGSUFFIX)", + ["SHLIBSUFFIX"] = "$(HOSTSHLIBSUFFIX)", + ["CPPPATH"] = "", + ["CPPDEFS"] = "", + ["LIBS"] = "", + ["LIBPATH"] = "$(OBJECTDIR)", + ["CCOPTS"] = "", + ["CXXOPTS"] = "", + ["CPPDEFS_DEBUG"] = "", + ["CPPDEFS_PRODUCTION"] = "", + ["CPPDEFS_RELEASE"] = "", + ["CCOPTS_DEBUG"] = "", + ["CCOPTS_PRODUCTION"] = "", + ["CCOPTS_RELEASE"] = "", + ["CXXOPTS_DEBUG"] = "", + ["CXXOPTS_PRODUCTION"] = "", + ["CXXOPTS_RELEASE"] = "", + ["SHLIBLINKSUFFIX"] = "", + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/generic-dotnet.lua b/ogl_editor/bin/win32/scripts/tundra/tools/generic-dotnet.lua new file mode 100644 index 0000000..2385440 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/generic-dotnet.lua @@ -0,0 +1,17 @@ +module(..., package.seeall) + +local function generic_dotnet_setup(env) + +end + +function apply(env, options) + env:add_setup_function(generic_dotnet_setup) + + env:set_many { + ["CSLIBS"] = "", -- assembly references + ["CSLIBPATH"] = {}, -- assembly directories + ["CSCOPTS"] = "-optimize", + ["CSRESOURCES"] = "", + ["CSC_WARNING_LEVEL"] = "4", + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/ispc.lua b/ogl_editor/bin/win32/scripts/tundra/tools/ispc.lua new file mode 100644 index 0000000..3f0b1ea --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/ispc.lua @@ -0,0 +1,11 @@ +module(..., package.seeall) + +function apply(env, options) + env:set_many { + ["ISPC_SUFFIXES"] = { ".ispc", }, + ["ISPC"] = "ispc", + ["ISPCOPTS"] = "", + ["ISPCCOM"] = "$(ISPC) $(ISPCOPTS) -o $(@:[1]) -h $(@:[2]) $(<)", + } +end + diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/mingw.lua b/ogl_editor/bin/win32/scripts/tundra/tools/mingw.lua new file mode 100644 index 0000000..4aeff36 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/mingw.lua @@ -0,0 +1,24 @@ +module(..., package.seeall) + +function apply(env, options) + + -- load the generic GCC toolset first + tundra.unitgen.load_toolset("gcc", env) + + -- load support for win32 resource compilation + tundra.unitgen.load_toolset("win32-rc", env) + + env:set_many { + ["NATIVE_SUFFIXES"] = { ".c", ".cpp", ".cc", ".cxx", ".a", ".o", ".rc" }, + ["OBJECTSUFFIX"] = ".o", + ["LIBPREFIX"] = "", + ["LIBSUFFIX"] = ".a", + ["W32RESSUFFIX"] = ".o", + ["CPPDEFS"] = "_WIN32", + ["_CPPDEFS"] = "$(CPPDEFS:p/D) $(CPPDEFS_$(CURRENT_VARIANT:u):p/D)", + ["RC"] = "windres", + ["RCOPTS"] = "", + ["RCCOM"] = "$(RC) $(RCOPTS) --output=$(@:b) $(CPPPATH:b:p-I) --input=$(<:b)", + ["SHLIBLINKSUFFIX"] = ".a", + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/mono.lua b/ogl_editor/bin/win32/scripts/tundra/tools/mono.lua new file mode 100644 index 0000000..553a1cd --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/mono.lua @@ -0,0 +1,17 @@ +module(..., package.seeall) + +function apply(env, options) + tundra.unitgen.load_toolset("generic-dotnet", env) + + env:set_many { + ["DOTNET_SUFFIXES"] = { ".cs" }, + ["DOTNET_SUFFIXES_RESOURCE"] = { ".resource" }, + ["CSC"] = "gmcs", + ["CSPROGSUFFIX"] = ".exe", + ["CSLIBSUFFIX"] = ".dll", + ["CSRESGEN"] = "resgen2 $(<) $(@)", + ["_CSC_COMMON"] = "-warn:$(CSC_WARNING_LEVEL) /nologo $(CSLIBPATH:p-lib\\:) $(CSRESOURCES:p-resource\\:) $(CSLIBS:p-reference\\::A.dll)", + ["CSCLIBCOM"] = "$(CSC) $(_CSC_COMMON) $(CSCOPTS) -target:library -out:$(@) $(<)", + ["CSCEXECOM"] = "$(CSC) $(_CSC_COMMON) $(CSCOPTS) -target:exe -out:$(@) $(<)", + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/msvc-vs2008.lua b/ogl_editor/bin/win32/scripts/tundra/tools/msvc-vs2008.lua new file mode 100644 index 0000000..99edf0f --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/msvc-vs2008.lua @@ -0,0 +1,8 @@ + +module(..., package.seeall) + +local vscommon = require "tundra.tools.msvc-vscommon" + +function apply(env, options) + vscommon.apply_msvc_visual_studio("9.0", env, options) +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/msvc-vs2010.lua b/ogl_editor/bin/win32/scripts/tundra/tools/msvc-vs2010.lua new file mode 100644 index 0000000..5c1ef88 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/msvc-vs2010.lua @@ -0,0 +1,8 @@ + +module(..., package.seeall) + +local vscommon = require "tundra.tools.msvc-vscommon" + +function apply(env, options) + vscommon.apply_msvc_visual_studio("10.0", env, options) +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/msvc-vs2012.lua b/ogl_editor/bin/win32/scripts/tundra/tools/msvc-vs2012.lua new file mode 100644 index 0000000..6c9d60a --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/msvc-vs2012.lua @@ -0,0 +1,8 @@ + +module(..., package.seeall) + +local vscommon = require "tundra.tools.msvc-vscommon" + +function apply(env, options) + vscommon.apply_msvc_visual_studio("11.0", env, options) +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/msvc-vs2013.lua b/ogl_editor/bin/win32/scripts/tundra/tools/msvc-vs2013.lua new file mode 100644 index 0000000..6abddda --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/msvc-vs2013.lua @@ -0,0 +1,8 @@ + +module(..., package.seeall) + +local vscommon = require "tundra.tools.msvc-vscommon" + +function apply(env, options) + vscommon.apply_msvc_visual_studio("12.0", env, options) +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/msvc-vscommon.lua b/ogl_editor/bin/win32/scripts/tundra/tools/msvc-vscommon.lua new file mode 100644 index 0000000..5fad59c --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/msvc-vscommon.lua @@ -0,0 +1,267 @@ +-- msvc-vscommon.lua - utility code for all versions of Visual Studio + +module(..., package.seeall) + +local native = require "tundra.native" +local os = require "os" + +-- Visual Studio tooling layout + +local vc_bin_map = { + ["x86"] = { + ["x86"] = "", + ["x64"] = "x86_amd64", + ["arm"] = "x86_arm", + }, + ["x64"] = { + ["x86"] = "", + ["x64"] = "amd64", + ["arm"] = "x86_arm", -- is this really legal? + }, +} + +local vc_lib_map = { + ["x86"] = { + ["x86"] = "", + ["x64"] = "amd64", + ["arm"] = "arm", + }, + ["x64"] = { + ["x86"] = "", + ["x64"] = "amd64", + ["arm"] = "arm", + }, +} + +-- Windows SDK layout + +local pre_win8_sdk_dir = { + ["bin"] = "bin", + ["include"] = "include", + ["lib"] = "lib", +} + +local win8_sdk_dir = { + ["bin"] = "bin", + ["include"] = "include", + ["lib"] = "lib\\win8\\um", +} + +local win81_sdk_dir = { + ["bin"] = "bin", + ["include"] = "include", + ["lib"] = "lib\\winv6.3\\um", +} + +local pre_win8_sdk = { + ["x86"] = { + ["bin"] = "", + ["include"] = "", + ["lib"] = "", + }, + ["x64"] = { + ["bin"] = "x64", + ["include"] = "", + ["lib"] = "x64", + }, +} + +local post_win8_sdk = { + ["x86"] = { + ["bin"] = "x86", + ["include"] = { "shared", "um" }, + ["lib"] = "x86", + }, + ["x64"] = { + ["bin"] = "x64", + ["include"] = { "shared", "um" }, + ["lib"] = "x64", + }, + ["arm"] = { + ["bin"] = "arm", + ["include"] = { "shared", "um" }, + ["lib"] = "arm", + }, +} + +-- Each quadruplet specifies a registry key value that gets us the SDK location, +-- followed by a folder structure (for each supported target architecture) +-- and finally the corresponding bin, include and lib folder's relative location + +local sdk_map = { + ["9.0"] = { "SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v6.0A", "InstallationFolder", pre_win8_sdk_dir, pre_win8_sdk }, + ["10.0"] = { "SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.0A", "InstallationFolder", pre_win8_sdk_dir, pre_win8_sdk }, + ["11.0"] = { "SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots", "KitsRoot", win8_sdk_dir, post_win8_sdk }, + ["12.0"] = { "SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots", "KitsRoot81", win81_sdk_dir, post_win8_sdk }, +} + +local function get_host_arch() + local snative = native.getenv("PROCESSOR_ARCHITECTURE") + local swow = native.getenv("PROCESSOR_ARCHITEW6432", "") + if snative == "AMD64" or swow == "AMD64" then + return "x64" + elseif snative == "IA64" or swow == "IA64" then + return "itanium"; + else + return "x86" + end +end + +function path_combine(path, path_to_append) + if path == nil then + return path_to_append + end + if path:find("\\$") then + return path .. path_to_append + end + return path .. "\\" .. path_to_append +end + +function path_it(maybe_list) + if type(maybe_list) == "table" then + return ipairs(maybe_list) + end + return ipairs({maybe_list}) +end + +function apply_msvc_visual_studio(version, env, options) + + -- NOTE: don't make changes to `env` until you've asserted + -- that the requested version is in fact installed, + -- the `vs-wild` toolset will call this function + -- repeatedly with a the next version but the same `env`, + -- if a version fails (assert/error) + + if native.host_platform ~= "windows" then + error("the msvc toolset only works on windows hosts") + end + + -- Load basic MSVC environment setup first. + -- We're going to replace the paths to some tools. + tundra.unitgen.load_toolset('msvc', env) + + options = options or {} + + local target_arch = options.TargetArch or "x86" + local host_arch = options.HostArch or get_host_arch() + local sdk_version = options.SdkVersion or version -- we identify SDKs by VS version and fallback to current version + + -- We'll find any edition of VS (including Express) here + local vs_root = native.reg_query("HKLM", "SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VS7", version) + assert(vs_root, "The requested version of Visual Studio isn't installed") + vs_root = string.gsub(vs_root, "\\+$", "\\") + + local vc_lib + local vc_bin + + vc_bin = vc_bin_map[host_arch][target_arch] + if not vc_bin then + errorf("can't build target arch %s on host arch %s", target_arch, host_arch) + end + vc_bin = vs_root .. "vc\\bin\\" .. vc_bin + + vc_lib = vs_root .. "vc\\lib\\" .. vc_lib_map[host_arch][target_arch] + + -- + -- Now fix up the SDK + -- + + local sdk_root + local sdk_bin + local sdk_include = {} + local sdk_lib + + local sdk = sdk_map[sdk_version] + assert(sdk, "The requested version of Visual Studio isn't supported") + + sdk_root = native.reg_query("HKLM", sdk[1], sdk[2]) + assert(sdk_root, "The requested version of the SDK isn't installed") + sdk_root = string.gsub(sdk_root, "\\+$", "\\") + + local sdk_dir_base = sdk[3] + + local sdk_dir = sdk[4][target_arch] + assert(sdk_dir, "The target platform architecture isn't supported by the SDK") + + sdk_bin = sdk_root .. sdk_dir_base["bin"] .. "\\" .. sdk_dir["bin"] + + local sdk_dir_base_include = sdk_dir_base["include"] + for _, v in path_it(sdk_dir["include"]) do + sdk_include[#sdk_include + 1] = sdk_root .. sdk_dir_base_include .. "\\" .. v + end + + sdk_lib = sdk_root .. sdk_dir_base["lib"] .. "\\" .. sdk_dir["lib"] + + -- + -- Tools + -- + + local cl_exe = '"' .. path_combine(vc_bin, "cl.exe") .. '"' + local lib_exe = '"' .. path_combine(vc_bin, "lib.exe") .. '"' + local link_exe = '"' .. path_combine(vc_bin, "link.exe") .. '"' + local rc_exe = '"' .. path_combine(sdk_bin, "rc.exe") .. '"' -- pickup the Resource Compiler from the SDK + + env:set('CC', cl_exe) + env:set('CXX', cl_exe) + env:set('LIB', lib_exe) + env:set('LD', link_exe) + env:set('RC', rc_exe) + + if sdk_version == "9.0" then + env:set("RCOPTS", "") -- clear the "/nologo" option (it was first added in VS2010) + end + + if version == "12.0" then + -- Force MSPDBSRV.EXE + env:set("CCOPTS", "/FS") + env:set("CXXOPTS", "/FS") + end + + -- Wire-up the external environment + + env:set_external_env_var('VSINSTALLDIR', vs_root) + env:set_external_env_var('VCINSTALLDIR', vs_root .. "\\vc") + env:set_external_env_var('DevEnvDir', vs_root .. "Common7\\IDE") + + local include = {} + + for _, v in ipairs(sdk_include) do + include[#include + 1] = v + end + + include[#include + 1] = vs_root .. "VC\\ATLMFC\\INCLUDE" + include[#include + 1] = vs_root .. "VC\\INCLUDE" + + env:set_external_env_var("WindowsSdkDir", sdk_root) + env:set_external_env_var("INCLUDE", table.concat(include, ';')) + + -- if MFC isn't installed with VS + -- the linker will throw an error when looking for libs + -- Lua does not have a "does directory exist function" + -- we could use one here + local lib_str = sdk_lib .. ";" .. vs_root .. "\\VC\\ATLMFC\\lib\\" .. vc_lib_map[host_arch][target_arch] .. ";" .. vc_lib + env:set_external_env_var("LIB", lib_str) + env:set_external_env_var("LIBPATH", lib_str) + + -- Modify %PATH% + + local path = {} + + path[#path + 1] = sdk_root + path[#path + 1] = vs_root .. "Common7\\IDE" + + if "x86" == host_arch then + path[#path + 1] = vs_root .. "\\VC\\Bin" + elseif "x64" == host_arch then + path[#path + 1] = vs_root .. "\\VC\\Bin\\amd64" + elseif "arm" == host_arch then + path[#path + 1] = vs_root .. "\\VC\\Bin\\arm" + end + + path[#path + 1] = vs_root .. "\\Common7\\IDE" + + path[#path + 1] = env:get_external_env_var('PATH') + + env:set_external_env_var("PATH", table.concat(path, ';')) + +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/msvc-vswild.lua b/ogl_editor/bin/win32/scripts/tundra/tools/msvc-vswild.lua new file mode 100644 index 0000000..1804445 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/msvc-vswild.lua @@ -0,0 +1,23 @@ + +module(..., package.seeall) + +local vscommon = require "tundra.tools.msvc-vscommon" + +function apply(env, options) + + local vsvs = options.VsVersions or { "12.0", "11.0", "10.0", "9.0" } + + for _, v in ipairs(vsvs) do + local v1 = v + local success, result = xpcall(function() vscommon.apply_msvc_visual_studio(v1, env, options) end, function(err) return err end) + if success then + print("Visual Studio version " .. v1 .. " found ") + return + else + print("Visual Studio version " .. v1 .. " does not appear to be installed (" .. result .. ")") + end + end + + error("Unable to find suitable version of Visual Studio (please install either version " .. table.concat(vsvs, ", ") .. " of Visual Studio to continue)") + +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/msvc-winsdk.lua b/ogl_editor/bin/win32/scripts/tundra/tools/msvc-winsdk.lua new file mode 100644 index 0000000..5d7f7b1 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/msvc-winsdk.lua @@ -0,0 +1,150 @@ +-- msvc-winsdk.lua - Use Microsoft Windows SDK 7.1 or later to build. + +module(..., package.seeall) + +local native = require "tundra.native" +local os = require "os" + +if native.host_platform ~= "windows" then + error("the msvc toolset only works on windows hosts") +end + +local function get_host_arch() + local snative = native.getenv("PROCESSOR_ARCHITECTURE") + local swow = native.getenv("PROCESSOR_ARCHITEW6432", "") + if snative == "AMD64" or swow == "AMD64" then + return "x64" + elseif snative == "IA64" or swow == "IA64" then + return "itanium"; + else + return "x86" + end +end + +local compiler_dirs = { + ["x86"] = { + ["x86"] = "bin\\", + ["x64"] = "bin\\x86_amd64\\", + ["itanium"] = "bin\\x86_ia64\\", + }, + ["x64"] = { + ["x86"] = "bin\\", + ["x64"] = { + ["11.0"] = "bin\\x86_amd64\\", + "bin\\amd64\\" + }, + ["itanium"] = "bin\\x86_ia64\\", + }, + ["itanium"] = { + ["x86"] = "bin\\x86_ia64\\", + ["itanium"] = "bin\\ia64\\", + }, +} + +local function setup(env, options) + options = options or {} + local target_arch = options.TargetArch or "x86" + local host_arch = options.HostArch or get_host_arch() + local vcversion = options.VcVersion or "10.0" + + local binDir = + compiler_dirs[host_arch][target_arch][vcversion] + or compiler_dirs[host_arch][target_arch][1] + or compiler_dirs[host_arch][target_arch] + + if not binDir then + errorf("can't build target arch %s on host arch %s", target_arch, host_arch) + end + + local sdkDir; + local sdkDirIncludes; + local sdkLibDir; + local vcLibDir; + + if vcversion == "11.0" then + local sdk_key = "SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v8.0" + sdkDir = assert(native.reg_query("HKLM", sdk_key, "InstallationFolder")) + sdkDirIncludes = { sdkDir .. "\\INCLUDE\\UM", sdkDir .. "\\INCLUDE\\SHARED" } + + sdkLibDir = "LIB\\win8\\um\\" + vcLibDir = "LIB" + + if "x86" == target_arch then + sdkLibDir = sdkLibDir .. "x86" + elseif "x64" == target_arch then + sdkLibDir = sdkLibDir .. "x64" + vcLibDir = "LIB\\amd64" + elseif "arm" == target_arch then + sdkLibDir = sdkLibDir .. "arm" + end + else + local sdk_key = "SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows" + sdkDir = assert(native.reg_query("HKLM", sdk_key, "CurrentInstallFolder")) + sdkDirIncludes = { sdkDir .. "\\INCLUDE" }; + + sdkLibDir = "LIB" + vcLibDir = "LIB" + + if "x64" == target_arch then + sdkLibDir = "LIB\\x64" + vcLibDir = "LIB\\amd64" + elseif "itanium" == target_arch then + sdkLibDir = "LIB\\IA64" + vcLibDir = "LIB\\IA64" + end + end + + + local vc_key = "SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VC7" + local vc_dir = assert(native.reg_query("HKLM", vc_key, vcversion)) + if vc_dir:sub(-1) ~= '\\' then + vc_dir = vc_dir .. '\\' + end + + local cl_exe = '"' .. vc_dir .. binDir .. "cl.exe" ..'"' + local lib_exe = '"' .. vc_dir .. binDir .. "lib.exe" ..'"' + local link_exe = '"' .. vc_dir .. binDir .. "link.exe" ..'"' + + env:set('CC', cl_exe) + env:set('CXX', cl_exe) + env:set('LIB', lib_exe) + env:set('LD', link_exe) + + -- Set up the MS SDK associated with visual studio + + env:set_external_env_var("WindowsSdkDir", sdkDir) + env:set_external_env_var("INCLUDE", table.concat(sdkDirIncludes, ";") .. ";" .. vc_dir .. "\\INCLUDE") + + local rc_exe + print("vcversion", vcversion) + if vcversion == "11.0" then + rc_exe = '"' .. sdkDir .. "\\bin\\x86\\rc.exe" ..'"' + else + rc_exe = '"' .. sdkDir .. "\\bin\\rc.exe" ..'"' + end + env:set('RC', rc_exe) + + local libString = sdkDir .. "\\" .. sdkLibDir .. ";" .. vc_dir .. "\\" .. vcLibDir + env:set_external_env_var("LIB", libString) + env:set_external_env_var("LIBPATH", libString) + + local path = { } + local vc_root = vc_dir:sub(1, -4) + if binDir ~= "\\bin\\" then + path[#path + 1] = vc_dir .. "\\bin" + end + path[#path + 1] = vc_root .. "Common7\\Tools" -- drop vc\ at end + path[#path + 1] = vc_root .. "Common7\\IDE" -- drop vc\ at end + path[#path + 1] = sdkDir + path[#path + 1] = vc_dir .. binDir + path[#path + 1] = env:get_external_env_var('PATH') + + env:set_external_env_var("PATH", table.concat(path, ';')) +end + +function apply(env, options) + -- Load basic MSVC environment setup first. We're going to replace the paths to + -- some tools. + tundra.unitgen.load_toolset('msvc', env) + setup(env, options) +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/msvc.lua b/ogl_editor/bin/win32/scripts/tundra/tools/msvc.lua new file mode 100644 index 0000000..ac64254 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/msvc.lua @@ -0,0 +1,53 @@ +-- msvc.lua - common definitions for all flavors of MSVC +module(..., package.seeall) + +function apply(env, options) + + -- load the generic C toolset first + tundra.unitgen.load_toolset("generic-cpp", env) + + -- load support for win32 resource compilation + tundra.unitgen.load_toolset("win32-rc", env) + + env:set_many { + ["NATIVE_SUFFIXES"] = { ".c", ".cpp", ".cc", ".cxx", ".lib", ".obj", ".res", ".rc" }, + ["OBJECTSUFFIX"] = ".obj", + ["LIBPREFIX"] = "", + ["LIBSUFFIX"] = ".lib", + ["CC"] = "cl", + ["CXX"] = "cl", + ["LIB"] = "lib", + ["LD"] = "link", + ["CPPDEFS"] = "_WIN32", + ["_CPPDEFS"] = "$(CPPDEFS:p/D) $(CPPDEFS_$(CURRENT_VARIANT:u):p/D)", + ["_PCH_SUPPORTED"] = "1", + ["_USE_PCH_OPT"] = "/Fp$(_PCH_FILE:b) /Yu$(_PCH_HEADER)", + ["_USE_PCH"] = "", + ["_USE_PDB_CC_OPT"] = "/Zi /Fd$(_PDB_CC_FILE:b)", + ["_USE_PDB_LINK_OPT"] = "/DEBUG /PDB:$(_PDB_LINK_FILE)", + ["_USE_PDB_CC"] = "", + ["_USE_PDB_LINK"] = "", + ["_USE_MODDEF_OPT"] = "/DEF:$(MODDEF)", + ["_USE_MODDEF"] = "", + ["RC"] = "rc", + ["RCOPTS"] = "/nologo", + ["W32RESSUFFIX"] = ".res", + ["RCCOM"] = "$(RC) $(RCOPTS) /fo$(@:b) $(_CPPDEFS) $(CPPPATH:b:p/i) $(<:b)", + ["CCCOM"] = "$(CC) /c @RESPONSE|@|$(_CPPDEFS) $(CPPPATH:b:p/I) /nologo $(CCOPTS) $(CCOPTS_$(CURRENT_VARIANT:u)) $(_USE_PCH) $(_USE_PDB_CC) /Fo$(@:b) $(<:b)", + ["CXXCOM"] = "$(CC) /c @RESPONSE|@|$(_CPPDEFS) $(CPPPATH:b:p/I) /nologo $(CXXOPTS) $(CXXOPTS_$(CURRENT_VARIANT:u)) $(_USE_PCH) $(_USE_PDB_CC) /Fo$(@:b) $(<:b)", + ["PCHCOMPILE_CC"] = "$(CC) /c $(_CPPDEFS) $(CPPPATH:b:p/I) /nologo $(CCOPTS) $(CCOPTS_$(CURRENT_VARIANT:u)) $(_USE_PDB_CC) /Yc$(_PCH_HEADER) /Fp$(@:[1]:b) /Fo$(@:[2]:b) $(<:[1]:b)", + ["PCHCOMPILE_CXX"] = "$(CXX) /c $(_CPPDEFS) $(CPPPATH:b:p/I) /nologo $(CXXOPTS) $(CXXOPTS_$(CURRENT_VARIANT:u)) $(_USE_PDB_CC) /Yc$(_PCH_HEADER) /Fp$(@:[1]:b) /Fo$(@:[2]:b) $(<:[1]:b)", + ["LIBS"] = "", + ["PROGOPTS"] = "", + ["PROGCOM"] = "$(LD) /nologo @RESPONSE|@|$(_USE_PDB_LINK) $(PROGOPTS) $(LIBPATH:b:p/LIBPATH\\:) $(_USE_MODDEF) $(LIBS) /out:$(@:b) $(<:b:p\n)", + ["LIBOPTS"] = "", + ["LIBCOM"] = "$(LIB) /nologo @RESPONSE|@|$(LIBOPTS) /out:$(@:b) $(<:b:p\n)", + ["PROGPREFIX"] = "", + ["SHLIBLINKSUFFIX"] = ".lib", + ["SHLIBPREFIX"] = "", + ["SHLIBOPTS"] = "", + ["SHLIBCOM"] = "$(LD) /DLL /nologo @RESPONSE|@|$(_USE_PDB_LINK) $(SHLIBOPTS) $(LIBPATH:b:p/LIBPATH\\:) $(_USE_MODDEF) $(LIBS) /out:$(@:b) $(<:b)", + ["AUX_FILES_PROGRAM"] = { "$(@:B:a.exe.manifest)", "$(@:B:a.pdb)", "$(@:B:a.exp)", "$(@:B:a.lib)", "$(@:B:a.ilk)", }, + ["AUX_FILES_SHAREDLIBRARY"] = { "$(@:B:a.dll.manifest)", "$(@:B:a.pdb)", "$(@:B:a.exp)", "$(@:B:a.lib)", "$(@:B:a.ilk)", }, + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/msvc6.lua b/ogl_editor/bin/win32/scripts/tundra/tools/msvc6.lua new file mode 100644 index 0000000..17c3019 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/msvc6.lua @@ -0,0 +1,101 @@ +-- msvc6.lua - Visual Studio 6 + +module(..., package.seeall) + +local native = require "tundra.native" +local os = require "os" + +function path_combine(path, path_to_append) + if path == nil then + return path_to_append + end + if path:find("\\$") then + return path .. path_to_append + end + return path .. "\\" .. path_to_append +end + +function path_it(maybe_list) + if type(maybe_list) == "table" then + return ipairs(maybe_list) + end + return ipairs({maybe_list}) +end + +function apply(env, options) + + if native.host_platform ~= "windows" then + error("the msvc6 toolset only works on windows hosts") + end + + -- Load basic MSVC environment setup first. + -- We're going to replace the paths to some tools. + tundra.unitgen.load_toolset('msvc', env) + + options = options or {} + + -- We'll find any edition of VS (including Express) here + local vs_root = native.reg_query("HKLM", "SOFTWARE\\Microsoft\\VisualStudio\\6.0\\Setup\\Microsoft Visual C++", "ProductDir") + assert(vs_root, "The requested version of Visual Studio isn't installed") + vs_root = string.gsub(vs_root, "\\+$", "\\") + + local common_root = native.reg_query("HKLM", "SOFTWARE\\Microsoft\\VisualStudio\\6.0\\Setup", "VsCommonDir") + assert(common_root, "The requested version of Visual Studio isn't installed") + common_root = string.gsub(common_root, "\\+$", "\\") + + local vc_lib + local vc_bin + + vc_bin = vs_root .. "\\bin" + vc_lib = vs_root .. "\\lib" + + -- Tools + + local cl_exe = '"' .. path_combine(vc_bin, "cl.exe") .. '"' + local lib_exe = '"' .. path_combine(vc_bin, "lib.exe") .. '"' + local link_exe = '"' .. path_combine(vc_bin, "link.exe") .. '"' + local rc_exe = '"' .. path_combine(common_root, "MSDev98\\Bin\\rc.exe") .. '"' + + env:set('CC', cl_exe) + env:set('CXX', cl_exe) + env:set('LIB', lib_exe) + env:set('LD', link_exe) + env:set('RC', rc_exe) + + env:set("RCOPTS", "") -- clear the "/nologo" option (it was first added in VS2010) + + -- Wire-up the external environment + env:set_external_env_var('VSINSTALLDIR', vs_root) + env:set_external_env_var('VCINSTALLDIR', vs_root .. "\\vc") + --env:set_external_env_var('DevEnvDir', vs_root .. "Common7\\IDE") + + do + local include = { + path_combine(vs_root, "ATL\\INCLUDE"), + path_combine(vs_root, "INCLUDE"), + path_combine(vs_root, "MFC\\INCLUDE"), + } + env:set_external_env_var("INCLUDE", table.concat(include, ';')) + end + + do + local lib = { + path_combine(vs_root, "LIB"), + path_combine(vs_root, "MFC\\LIB"), + } + local lib_str = table.concat(lib, ';') + env:set_external_env_var("LIB", lib_str) + env:set_external_env_var("LIBPATH", lib_str) + end + + -- Modify %PATH% + + do + local path = { + path_combine(vs_root, "BIN"), + path_combine(common_root, "MSDev98\\BIN"), + env:get_external_env_var('PATH'), + } + env:set_external_env_var("PATH", table.concat(path, ';')) + end +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/openwatcom.lua b/ogl_editor/bin/win32/scripts/tundra/tools/openwatcom.lua new file mode 100644 index 0000000..849024e --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/openwatcom.lua @@ -0,0 +1,61 @@ +-- openwatcom.lua - Support for the Open Watcom compiler C/C++ compiler + +module(..., package.seeall) + +local native = require "tundra.native" +local os = require "os" + +local function setup(env, options) + + if native.host_platform ~= "windows" then + error("the openwatcom toolset only works on windows hosts") + end + + assert(options, "No Options provided") + local dir = assert(options.InstallDir) + env:set_external_env_var("WATCOM", dir) + env:set_external_env_var("EDPATH", dir .. "\\EDDAT") + env:set_external_env_var("WIPFC", dir .. "\\WIPFC") + local p = native.getenv("PATH") .. ";" .. dir .. "\\BINNT\\;" .. dir .. "\\BINW\\" + print(p) + env:set_external_env_var("PATH", p) + local inc = native.getenv("INCLUDE", "") + if inc then + inc = inc .. ";" + end + env:set_external_env_var("INCLUDE", inc .. dir .. "\\H;" .. dir .. "\\H\\NT;" .. dir .. "\\H\\NT\\DIRECTX;" .. dir .. "\\H\\NT\\DDK") + +end + +function apply(env, options) + -- load the generic C toolset first + tundra.unitgen.load_toolset("generic-cpp", env) + + setup(env, options) + + env:set_many { + ["NATIVE_SUFFIXES"] = { ".c", ".cpp", ".cc", ".cxx", ".lib", ".obj" }, + ["OBJECTSUFFIX"] = ".obj", + ["LIBSUFFIX"] = ".lib", + ["CC"] = "wcl386.exe", + ["CXX"] = "wcl386.exe", + ["LIB"] = "wlib.exe", + ["LD"] = "wlink.exe", + ["CPPDEFS"] = "_WIN32", + ["CCOPTS"] = "-wx -we", + ["_CPPDEFS"] = "$(CPPDEFS:p-d) $(CPPDEFS_$(CURRENT_VARIANT:u):p-d)", + ["_USE_PCH_OPT"] = "", + ["_USE_PCH"] = "", + ["_CCCOM"] = "$(CC) /c @RESPONSE|@|$(_CPPDEFS) $(CPPPATH:b:p-i) $(CCOPTS) $(CCOPTS_$(CURRENT_VARIANT:u)) $(_USE_PCH) -fo=$(@:b) $(<:b)", + ["CCCOM"] = "$(_CCCOM)", + ["CXXCOM"] = "$(_CCCOM)", + ["PCHCOMPILE"] = "", + ["LIBS"] = "", + ["PROGOPTS"] = "", + ["PROGCOM"] = "", -- "$(LD) @RESPONSE|@|$(PROGOPTS) $(LIBS) /out:$(@:b) $(<:b)", + ["LIBOPTS"] = "", + ["LIBCOM"] = "", -- "$(LIB) @RESPONSE|@|$(LIBOPTS) /out:$(@:b) $(<:b)", + ["SHLIBOPTS"] = "", + ["SHLIBCOM"] = "", -- "$(LD) /nologo @RESPONSE|@|$(SHLIBOPTS) $(LIBPATH:b:p/LIBPATH\\:) $(LIBS) /out:$(@:b) $(<:b)", + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/vbcc.lua b/ogl_editor/bin/win32/scripts/tundra/tools/vbcc.lua new file mode 100644 index 0000000..1c43a22 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/vbcc.lua @@ -0,0 +1,36 @@ +module(..., package.seeall) + +local native = require "tundra.native" + +function apply(env, options) + -- load the generic C toolset first + tundra.unitgen.load_toolset("generic-cpp", env) + -- Also add assembly support. + tundra.unitgen.load_toolset("generic-asm", env) + + local vbcc_root = assert(native.getenv("VBCC"), "VBCC environment variable must be set") + + env:set_many { + ["NATIVE_SUFFIXES"] = { ".c", ".cpp", ".cc", ".cxx", ".s", ".asm", ".a", ".o" }, + ["OBJECTSUFFIX"] = ".o", + ["LIBPREFIX"] = "", + ["LIBSUFFIX"] = ".a", + ["VBCC_ROOT"] = vbcc_root, + ["CC"] = vbcc_root .. "$(SEP)bin$(SEP)vc$(HOSTPROGSUFFIX)", + ["LIB"] = vbcc_root .. "$(SEP)bin$(SEP)vlink$(HOSTPROGSUFFIX)", + ["LD"] = vbcc_root .. "$(SEP)bin$(SEP)vc$(HOSTPROGSUFFIX)", + ["ASM"] = vbcc_root .. "$(SEP)bin$(SEP)vasmm68k_mot$(HOSTPROGSUFFIX)", + ["VBCC_SDK_INC"] = vbcc_root .. "$(SEP)include$(SEP)sdk", + ["_OS_CCOPTS"] = "", + ["_OS_CXXOPTS"] = "", + ["CCCOM"] = "$(CC) $(_OS_CCOPTS) -c $(CPPDEFS:p-D) $(CPPPATH:f:p-I) $(CCOPTS) $(CCOPTS_$(CURRENT_VARIANT:u)) -o $(@) $(<)", + ["ASMCOM"] = "$(ASM) -quiet -Fhunk -phxass $(ASMOPTS) $(ASMOPTS_$(CURRENT_VARIANT:u)) $(ASMDEFS:p-D) $(ASMINCPATH:f:p-I) -I$(VBCC_SDK_INC) -o $(@) $(<)", + ["PROGOPTS"] = "", + ["PROGCOM"] = "$(LD) $(PROGOPTS) $(LIBPATH:p-L) $(LIBS:p-l) -o $(@) $(<)", + ["PROGPREFIX"] = "", + ["LIBOPTS"] = "", + ["LIBCOM"] = "$(LIB) @RESPONSE|@|-r $(LIBOPTS) -o $(@) $(<)", + ["ASMINC_KEYWORDS"] = { "INCLUDE", "include" }, + ["ASMINC_BINARY_KEYWORDS"] = { "INCBIN", "incbin" }, + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/win32-rc.lua b/ogl_editor/bin/win32/scripts/tundra/tools/win32-rc.lua new file mode 100644 index 0000000..f546ec2 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/win32-rc.lua @@ -0,0 +1,21 @@ +module(..., package.seeall) + +local path = require("tundra.path") +local depgraph = require("tundra.depgraph") +local gencpp = require("tundra.tools.generic-cpp") + +local function compile_resource_file(env, pass, fn) + return depgraph.make_node { + Env = env, + Label = 'Rc $(@)', + Pass = pass, + Action = "$(RCCOM)", + InputFiles = { fn }, + OutputFiles = { path.make_object_filename(env, fn, env:get('W32RESSUFFIX')) }, + Scanner = gencpp.get_cpp_scanner(env, fn), + } +end + +function apply(env, options) + env:register_implicit_make_fn("rc", compile_resource_file) +end diff --git a/ogl_editor/bin/win32/scripts/tundra/tools/yasm.lua b/ogl_editor/bin/win32/scripts/tundra/tools/yasm.lua new file mode 100644 index 0000000..fe01c55 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/tools/yasm.lua @@ -0,0 +1,12 @@ +module(..., package.seeall) + +function apply(env, options) + -- load the generic assembly toolset first + tundra.unitgen.load_toolset("generic-asm", env) + + env:set_many { + ["YASM"] = "yasm", + ["ASMCOM"] = "$(YASM) -o $(@) $(ASMDEFS:p-D ) $(ASMOPTS) $(<)", + ["ASMINC_KEYWORDS"] = { "%include" }, + } +end diff --git a/ogl_editor/bin/win32/scripts/tundra/unitgen.lua b/ogl_editor/bin/win32/scripts/tundra/unitgen.lua new file mode 100644 index 0000000..ba8b251 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/unitgen.lua @@ -0,0 +1,197 @@ +module(..., package.seeall) + +local util = require "tundra.util" +local buildfile = require "tundra.buildfile" +local decl = require "tundra.decl" +local nodegen = require "tundra.nodegen" + +function match_build_id(id, default) + assert(id) + local i = id:gmatch("[^-]+") + local platform_name, toolset, variant, subvariant = i() or default, i() or default, i() or default, i() or default + return platform_name, toolset, variant, subvariant +end + +local function iter_inherits(config, name) + local tab = config + return function() + while tab do + local my_tab = tab + if not my_tab then break end + tab = my_tab.Inherit + local v = my_tab[name] + if v then return v end + end + end +end + +function load_toolset(id, ...) + -- For non-qualified packages, use a default package + if not id:find("%.") then + id = "tundra.tools." .. id + end + + local pkg, err = require(id) + + if err then + errorf("couldn't load extension module %s: %s", id, err) + end + + pkg.apply(...) +end + +local function setup_env(env, build_data, tuple, build_id) + local config = tuple.Config + local variant_name = tuple.Variant.Name + + if not build_id then + build_id = config.Name .. "-" .. variant_name .. "-" .. tuple.SubVariant + end + + local naked_platform, naked_toolset = match_build_id(build_id) + + env:set("CURRENT_PLATFORM", naked_platform) -- e.g. linux or macosx + env:set("CURRENT_TOOLSET", naked_toolset) -- e.g. gcc or msvc + env:set("CURRENT_VARIANT", tuple.Variant.Name) -- e.g. debug or release + env:set("BUILD_ID", build_id) -- e.g. linux-gcc-debug + env:set("OBJECTDIR", "$(OBJECTROOT)" .. SEP .. "$(BUILD_ID)") + + for tools in iter_inherits(config, "Tools") do + for k, v in pairs(tools) do + if type(k) == "string" then + error("Tools must be a plain array - to include options keys wrap them in their own tables:\n " .. + "e.g. Tools = { { 'foo'; Option = ... }, ... }.\n Your Tools:\n" .. util.tostring(tools)) + end + end + for _, data in ipairs(tools) do + local id, options + + if type(data) == "table" then + id = assert(data[1]) + options = data + data = id + end + + if type(data) == "string" then + load_toolset(data, env, options) + elseif type(data) == "function" then + data(env, options) + else + error("bad parameters") + end + end + end + + -- Incorporate matching values from the build data's Env and ReplaceEnv. + if build_data.Env then + nodegen.append_filtered_env_vars(env, build_data.Env, build_id, false) + end + if build_data.ReplaceEnv then + nodegen.replace_filtered_env_vars(env, build_data.ReplaceEnv, build_id, false) + end + + -- Incorporate matching values from the config's Env and ReplaceEnv. + for env_tab in iter_inherits(config, "Env") do + nodegen.append_filtered_env_vars(env, env_tab, build_id, false) + end + for env_tab in iter_inherits(config, "ReplaceEnv") do + nodegen.replace_filtered_env_vars(env, env_tab, build_id, false) + end + + -- Run post-setup functions. This typically sets up implicit make functions. + env:run_setup_functions() + + return env +end + + + +local function setup_envs(tuple, configs, default_env, build_data) + local result = {} + + local top_env = setup_env(default_env:clone(), build_data, tuple) + result["__default"] = top_env + + -- Use the same build id for all subconfigurations + local build_id = top_env:get("BUILD_ID") + + local cfg = configs[tuple.Config.Name] + for moniker, x in util.nil_pairs(cfg.SubConfigs) do + if result[x] then + croak("duplicate subconfig name: %s", x) + end + local sub_tuple = { Config = configs[x], Variant = tuple.Variant, SubVariant = tuple.SubVariant } + if not sub_tuple.Config then + errorf("%s: no such config (in SubConfigs specification)", x) + end + local sub_env = setup_env(default_env:clone(), build_data, sub_tuple, build_id) + result[moniker] = sub_env + end + return result +end + + +function parse_units(build_tuples, args, passes) + if args.SyntaxExtensions then + print("*WARNING* SyntaxExtensions has been deprecated. Use require instead.") + end + for _, id in util.nil_ipairs(args.SyntaxExtensions) do + require(id) + end + + local function chunk () + local raw_nodes, default_nodes, always_nodes = decl.parse(args.Units or "units.lua") + assert(#default_nodes > 0 or #always_nodes > 0, "no default unit name to build was set") + return { raw_nodes, default_nodes, always_nodes } + end + + local success, result = xpcall(chunk, buildfile.syntax_error_catcher) + + if success then + return result[1], result[2], result[3] + else + print("Build script execution failed") + croak("%s", result or "") + end +end + + +-- Inputs +-- build_tuples - the config/variant/subvariant pairs to include in the DAG +-- args - Raw data from Build() call +-- passes - Passes specified in Build() call +-- configs - Configs specified in Build() call +function generate_dag(build_tuples, args, passes, configs, default_env) + local raw_nodes, default_nodes, always_nodes = parse_units(build_tuples, args, passes) + + local results = {} + + -- Let the nodegen code generate DAG nodes for all active + -- configurations/variants. + for _, tuple in pairs(build_tuples) do + printf("Generating DAG for %s-%s-%s", tuple.Config.Name, tuple.Variant.Name, tuple.SubVariant) + local envs = setup_envs(tuple, configs, default_env, args) + local always_nodes, default_nodes, named_nodes = nodegen.generate_dag { + Envs = envs, + Config = tuple.Config, + Variant = tuple.Variant, + Declarations = raw_nodes, + DefaultNodes = default_nodes, + AlwaysNodes = always_nodes, + Passes = passes, + } + + results[#results + 1] = { + Config = assert(tuple.Config), + Variant = assert(tuple.Variant), + SubVariant = assert(tuple.SubVariant), + AlwaysNodes = always_nodes, + DefaultNodes = default_nodes, + NamedNodes = named_nodes, + } + end + + return raw_nodes, results +end + + diff --git a/ogl_editor/bin/win32/scripts/tundra/util.lua b/ogl_editor/bin/win32/scripts/tundra/util.lua new file mode 100644 index 0000000..c6e7073 --- /dev/null +++ b/ogl_editor/bin/win32/scripts/tundra/util.lua @@ -0,0 +1,360 @@ +local _tostring = tostring +module(..., package.seeall) + +function tostring(value, stack) + local str = '' + stack = stack or {} + + if type(value) ~= 'table' then + if type(value) == 'string' then + str = string.format("%q", value) + else + str = _tostring(value) + end + elseif stack[value] then + return '' + else + stack[value] = true + local auxTable = {} + for k, v in pairs(value) do + auxTable[#auxTable + 1] = k + end + table.sort(auxTable, function (a, b) return _tostring(a) < _tostring(b) end) + + str = str..'{' + local separator = "" + local entry = "" + for index, fieldName in ipairs(auxTable) do + if ((tonumber(fieldName)) and (tonumber(fieldName) > 0)) then + entry = tostring(value[tonumber(fieldName)], stack) + else + entry = tostring(fieldName) .. " = " .. tostring(rawget(value, fieldName), stack) + end + str = str..separator..entry + separator = ", " + end + str = str..'}' + + local mt = getmetatable(value) + if mt then + str = str .. ' @meta = ' .. tostring(mt, stack) + end + end + return str +end + +function map_in_place(t, fn) + for x = 1, #t do + t[x] = fn(t[x]) + end + return t +end + +function map(t, fn) + local result = {} + for idx = 1, #t do + result[idx] = fn(t[idx]) + end + return result +end + +function mapnil(table, fn) + if not table then + return nil + else + return map(table, fn) + end +end + +function get_named_arg(tab, name, context) + local v = tab[name] + if v then + return v + else + if context then + error(context .. ": argument " .. name .. " must be specified", 3) + else + error("argument " .. name .. " must be specified", 3) + end + end +end + +function parse_cmdline(args, blueprint) + local index, max = 2, #args + local options, targets = {}, {} + local lookup = {} + + for _, opt in ipairs(blueprint) do + if opt.Short then + lookup[opt.Short] = opt + end + if opt.Long then + lookup[opt.Long] = opt + end + end + + while index <= max do + local s = args[index] + local key, val + + if s:sub(1, 2) == '--' then + key, val = s:match("^%-%-([-a-zA-Z0-9]+)=(.*)$") + if not key then + key = s:sub(3) + end + elseif s:sub(1, 1) == '-' then + key = s:sub(2,2) + if s:len() > 2 then + val = s:sub(3) + end + else + table.insert(targets, s) + end + + if key then + local opt = lookup[key] + if not opt then + return nil, nil, "Unknown option " .. s + end + if opt.HasValue then + if not val then + index = index + 1 + val = args[index] + end + if val then + options[opt.Name] = val + else + return nil, nil, "Missing value for option "..s + end + else + local v = options[opt.Name] or 0 + options[opt.Name] = v + 1 + end + end + + index = index + 1 + end + + return options, targets +end + +function clone_table(t) + if t then + local r = {} + for k, v in pairs(t) do + r[k] = v + end + for k, v in ipairs(t) do + r[k] = v + end + return r + else + return nil + end +end + +function deep_clone_table(t) + local function clone_value(v) + if type(v) == "table" then + return deep_clone_table(v) + else + return v + end + end + if t then + local r = {} + for k, v in pairs(t) do + r[clone_value(k)] = clone_value(v) + end + for k, v in ipairs(t) do + r[k] = clone_value(v) + end + return r + else + return nil + end +end + +function clone_array(t) + local r = {} + for k, v in ipairs(t) do + r[k] = v + end + return r +end + +function merge_arrays(...) + local result = {} + local count = select('#', ...) + for i = 1, count do + local tab = select(i, ...) + if tab then + for _, v in ipairs(tab) do + result[#result + 1] = v + end + end + end + return result +end + +function merge_arrays_2(a, b) + if a and b then + return merge_arrays(a, b) + elseif a then + return a + elseif b then + return b + else + return {} + end +end + +function matches_any(str, patterns) + for _, pattern in ipairs(patterns) do + if str:match(pattern) then + return true + end + end + return false +end + +function return_nil() +end + +function nil_pairs(t) + if t then + return next, t + else + return return_nil + end +end + +function nil_ipairs(t) + if t then + return ipairs(t) + else + return return_nil + end +end + +function clear_table(tab) + local key, val = next(tab) + while key do + tab[key] = nil + key, val = next(tab, key) + end + return tab +end + +function filter(tab, predicate) + local result = {} + for _, x in ipairs(tab) do + if predicate(x) then + result[#result + 1] = x + end + end + return result +end + +function filter_nil(tab, predicate) + if not predicate then return nil end + local result = {} + for _, x in ipairs(tab) do + if predicate(x) then + result[#result + 1] = x + end + end + return result +end + +function filter_in_place(tab, predicate) + local i, limit = 1, #tab + while i <= limit do + if not predicate(tab[i]) then + table.remove(tab, i) + limit = limit - 1 + else + i = i + 1 + end + end + return tab +end + +function append_table(result, items) + local offset = #result + for i = 1, #items do + result[offset + i] = items[i] + end + return result +end + +function flatten(array) + local function iter(item, accum) + if type(item) == 'table' and not getmetatable(item) then + for _, sub_item in ipairs(item) do + iter(sub_item, accum) + end + else + accum[#accum + 1] = item + end + end + local accum = {} + iter(array, accum) + return accum +end + +function memoize(closure) + local result = nil + return function(...) + if not result then + result = assert(closure(...)) + end + return result + end +end + +function uniq(array) + local seen = {} + local result = {} + for _, val in nil_ipairs(array) do + if not seen[val] then + seen[val] = true + result[#result + 1] = val + end + end + return result +end + +function make_lookup_table(array) + local result = {} + for _, item in nil_ipairs(array) do + result[item] = true + end + return result +end + +function table_keys(array) + local result = {} + for k, _ in nil_pairs(array) do + result[#result + 1] = k + end + return result +end + +function table_values(array) + local result = {} + for _, v in nil_pairs(array) do + result[#result + 1] = v + end + return result +end + +function array_contains(array, find) + for _, val in ipairs(array) do + if val == find then + return true + end + end + return false +end + diff --git a/ogl_editor/bin/win32/t2-inspect.exe b/ogl_editor/bin/win32/t2-inspect.exe new file mode 100644 index 0000000000000000000000000000000000000000..2b3372980c040276fa143e407c10042e58560422 GIT binary patch literal 119808 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 WuYvb#;QbnSzXsl~f&Wf5@c#gP+JVCW literal 0 HcmV?d00001 diff --git a/ogl_editor/bin/win32/t2-lua.exe b/ogl_editor/bin/win32/t2-lua.exe new file mode 100644 index 0000000000000000000000000000000000000000..3224ba6222e9285a5592e30c77aedca1b02db9b4 GIT binary patch literal 449024 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

d^L2=<-R6?DJKcZC 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
    vtsW;0x+of6+^37||A8QOfo(`RW?JsmJi{h?K`? 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

    ;H=E+yX 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 DH6v#r literal 0 HcmV?d00001 diff --git a/ogl_editor/bin/win32/tundra2.exe b/ogl_editor/bin/win32/tundra2.exe new file mode 100644 index 0000000000000000000000000000000000000000..d1c91feca54e9e80fc6e0fa636867e1c3c33bd7e GIT binary patch literal 298496 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

sO>|n+DsoPNQs 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