From 2dc554e83b8e3cecf43eb06609bbe026fe7b6b47 Mon Sep 17 00:00:00 2001 From: modeco80 Date: Tue, 13 Jun 2023 03:54:30 -0400 Subject: [PATCH] *: Add CMake build system I haven't yet: - Ensured CMake is generating the same cl flags as Developer Studio (ditto..) The old IDE makefiles are left in attic/ if anyone wants to try matching flags Source structure has been slightly modified: Uppercase directories moved to lowercase isle/res -> isle/src/res (I'm a bit dubious of this myself but eh) isle/*.{cpp, h} -> isle/src lego1/*.h -> lego1/include lego1/*.cpp -> lego1/src All mixed/upper includes have additionally been changed to lowercase, for compatibility with building on both Windows and Linux. --- .github/workflows/build.yml | 53 +++---- .gitignore | 4 +- CMakeLists.txt | 14 ++ README.md | 27 ++-- isle.mak => attic/isle.mak | 0 isle.mdp => attic/isle.mdp | Bin cmake/Toolchain/msvc42-common.cmake | 19 +++ cmake/Toolchain/msvc42-linux.cmake | 14 ++ cmake/Toolchain/msvc42.cmake | 17 +++ cmake/Toolchain/wrappers/build_msvctricks.sh | 2 + cmake/Toolchain/wrappers/cl | 1 + cmake/Toolchain/wrappers/lib | 1 + cmake/Toolchain/wrappers/link | 1 + cmake/Toolchain/wrappers/msvctricks.cpp | 132 ++++++++++++++++++ cmake/Toolchain/wrappers/msvctricks.exe | Bin 0 -> 115004 bytes cmake/Toolchain/wrappers/rc | 1 + cmake/Toolchain/wrappers/wine-msvc.sh | 59 ++++++++ cmake/dx5sdk.cmake | 36 +++++ dx5sdk/cdrom/setup.iss | 2 +- isle/CMakeLists.txt | 28 ++++ {ISLE => isle}/ext/lego1.def | 0 {ISLE => isle}/ext/lego1.exp | Bin {ISLE => isle}/ext/lego1.lib | Bin {ISLE => isle/src}/define.cpp | 0 {ISLE => isle/src}/define.h | 0 {ISLE => isle/src}/isle.cpp | 2 +- {ISLE => isle/src}/isle.h | 2 +- {ISLE => isle/src}/main.cpp | 4 +- {ISLE => isle/src}/res/arrow.cur | Bin {ISLE => isle/src}/res/busy.cur | Bin {ISLE => isle/src}/res/isle.ico | Bin {ISLE => isle/src}/res/isle.rc | Bin 1600 -> 1520 bytes {ISLE => isle/src}/res/no.cur | Bin {ISLE/res => isle/src}/resource.h | 0 lego1/CMakeLists.txt | 24 ++++ .../include}/legoanimationmanager.h | 0 .../include}/legobackgroundcolor.h | 0 .../include}/legobuildingmanager.h | 0 {LEGO1 => lego1/include}/legoentity.h | 0 {LEGO1 => lego1/include}/legogamestate.h | 0 {LEGO1 => lego1/include}/legoinputmanager.h | 0 {LEGO1 => lego1/include}/legomodelpresenter.h | 0 {LEGO1 => lego1/include}/legonavcontroller.h | 0 {LEGO1 => lego1/include}/legoomni.h | 0 {LEGO1 => lego1/include}/legopartpresenter.h | 0 {LEGO1 => lego1/include}/legoroi.h | 0 {LEGO1 => lego1/include}/legovideomanager.h | 0 {LEGO1 => lego1/include}/legoworld.h | 0 {LEGO1 => lego1/include}/legoworldpresenter.h | 0 {LEGO1 => lego1/include}/mxatomid.h | 0 .../include}/mxbackgroundaudiomanager.h | 0 {LEGO1 => lego1/include}/mxbitmap.h | 0 {LEGO1 => lego1/include}/mxbool.h | 0 {LEGO1 => lego1/include}/mxcore.h | 0 {LEGO1 => lego1/include}/mxcriticalsection.h | 0 {LEGO1 => lego1/include}/mxdirectdraw.h | 0 {LEGO1 => lego1/include}/mxdsaction.h | 0 {LEGO1 => lego1/include}/mxdsfile.h | 0 {LEGO1 => lego1/include}/mxdsobject.h | 0 {LEGO1 => lego1/include}/mxioinfo.h | 0 {LEGO1 => lego1/include}/mxomni.h | 0 {LEGO1 => lego1/include}/mxomnicreateflags.h | 0 {LEGO1 => lego1/include}/mxomnicreateparam.h | 2 +- .../include}/mxomnicreateparambase.h | 0 {LEGO1 => lego1/include}/mxpalette.h | 0 {LEGO1 => lego1/include}/mxpresenter.h | 0 {LEGO1 => lego1/include}/mxrect32.h | 0 {LEGO1 => lego1/include}/mxresult.h | 0 {LEGO1 => lego1/include}/mxscheduler.h | 0 {LEGO1 => lego1/include}/mxstreamcontroller.h | 0 {LEGO1 => lego1/include}/mxstreamer.h | 0 {LEGO1 => lego1/include}/mxstring.h | 0 {LEGO1 => lego1/include}/mxticklemanager.h | 0 {LEGO1 => lego1/include}/mxtimer.h | 0 .../include}/mxtransitionmanager.h | 0 {LEGO1 => lego1/include}/mxvariabletable.h | 0 {LEGO1 => lego1/include}/mxvideomanager.h | 0 {LEGO1 => lego1/include}/mxvideoparam.h | 0 {LEGO1 => lego1/include}/mxvideoparamflags.h | 0 {LEGO1 => lego1/include}/realtimeview.h | 0 {LEGO1 => lego1/include}/viewmanager.h | 0 {LEGO1 => lego1/src}/dllmain.cpp | 0 {LEGO1 => lego1/src}/legoomni.cpp | 0 {LEGO1 => lego1/src}/mxcore.cpp | 0 {LEGO1 => lego1/src}/mxcriticalsection.cpp | 0 .../src}/mxomnicreateparambase.cpp | 0 scripts/cm420 | 8 ++ 87 files changed, 400 insertions(+), 53 deletions(-) create mode 100644 CMakeLists.txt rename isle.mak => attic/isle.mak (100%) rename isle.mdp => attic/isle.mdp (100%) create mode 100644 cmake/Toolchain/msvc42-common.cmake create mode 100644 cmake/Toolchain/msvc42-linux.cmake create mode 100644 cmake/Toolchain/msvc42.cmake create mode 100755 cmake/Toolchain/wrappers/build_msvctricks.sh create mode 100755 cmake/Toolchain/wrappers/cl create mode 100755 cmake/Toolchain/wrappers/lib create mode 100755 cmake/Toolchain/wrappers/link create mode 100644 cmake/Toolchain/wrappers/msvctricks.cpp create mode 100755 cmake/Toolchain/wrappers/msvctricks.exe create mode 100755 cmake/Toolchain/wrappers/rc create mode 100755 cmake/Toolchain/wrappers/wine-msvc.sh create mode 100644 cmake/dx5sdk.cmake create mode 100644 isle/CMakeLists.txt rename {ISLE => isle}/ext/lego1.def (100%) rename {ISLE => isle}/ext/lego1.exp (100%) rename {ISLE => isle}/ext/lego1.lib (100%) rename {ISLE => isle/src}/define.cpp (100%) rename {ISLE => isle/src}/define.h (100%) rename {ISLE => isle/src}/isle.cpp (99%) rename {ISLE => isle/src}/isle.h (98%) rename {ISLE => isle/src}/main.cpp (98%) rename {ISLE => isle/src}/res/arrow.cur (100%) rename {ISLE => isle/src}/res/busy.cur (100%) rename {ISLE => isle/src}/res/isle.ico (100%) rename {ISLE => isle/src}/res/isle.rc (80%) rename {ISLE => isle/src}/res/no.cur (100%) rename {ISLE/res => isle/src}/resource.h (100%) create mode 100644 lego1/CMakeLists.txt rename {LEGO1 => lego1/include}/legoanimationmanager.h (100%) rename {LEGO1 => lego1/include}/legobackgroundcolor.h (100%) rename {LEGO1 => lego1/include}/legobuildingmanager.h (100%) rename {LEGO1 => lego1/include}/legoentity.h (100%) rename {LEGO1 => lego1/include}/legogamestate.h (100%) rename {LEGO1 => lego1/include}/legoinputmanager.h (100%) rename {LEGO1 => lego1/include}/legomodelpresenter.h (100%) rename {LEGO1 => lego1/include}/legonavcontroller.h (100%) rename {LEGO1 => lego1/include}/legoomni.h (100%) rename {LEGO1 => lego1/include}/legopartpresenter.h (100%) rename {LEGO1 => lego1/include}/legoroi.h (100%) rename {LEGO1 => lego1/include}/legovideomanager.h (100%) rename {LEGO1 => lego1/include}/legoworld.h (100%) rename {LEGO1 => lego1/include}/legoworldpresenter.h (100%) rename {LEGO1 => lego1/include}/mxatomid.h (100%) rename {LEGO1 => lego1/include}/mxbackgroundaudiomanager.h (100%) rename {LEGO1 => lego1/include}/mxbitmap.h (100%) rename {LEGO1 => lego1/include}/mxbool.h (100%) rename {LEGO1 => lego1/include}/mxcore.h (100%) rename {LEGO1 => lego1/include}/mxcriticalsection.h (100%) rename {LEGO1 => lego1/include}/mxdirectdraw.h (100%) rename {LEGO1 => lego1/include}/mxdsaction.h (100%) rename {LEGO1 => lego1/include}/mxdsfile.h (100%) rename {LEGO1 => lego1/include}/mxdsobject.h (100%) rename {LEGO1 => lego1/include}/mxioinfo.h (100%) rename {LEGO1 => lego1/include}/mxomni.h (100%) rename {LEGO1 => lego1/include}/mxomnicreateflags.h (100%) rename {LEGO1 => lego1/include}/mxomnicreateparam.h (96%) rename {LEGO1 => lego1/include}/mxomnicreateparambase.h (100%) rename {LEGO1 => lego1/include}/mxpalette.h (100%) rename {LEGO1 => lego1/include}/mxpresenter.h (100%) rename {LEGO1 => lego1/include}/mxrect32.h (100%) rename {LEGO1 => lego1/include}/mxresult.h (100%) rename {LEGO1 => lego1/include}/mxscheduler.h (100%) rename {LEGO1 => lego1/include}/mxstreamcontroller.h (100%) rename {LEGO1 => lego1/include}/mxstreamer.h (100%) rename {LEGO1 => lego1/include}/mxstring.h (100%) rename {LEGO1 => lego1/include}/mxticklemanager.h (100%) rename {LEGO1 => lego1/include}/mxtimer.h (100%) rename {LEGO1 => lego1/include}/mxtransitionmanager.h (100%) rename {LEGO1 => lego1/include}/mxvariabletable.h (100%) rename {LEGO1 => lego1/include}/mxvideomanager.h (100%) rename {LEGO1 => lego1/include}/mxvideoparam.h (100%) rename {LEGO1 => lego1/include}/mxvideoparamflags.h (100%) rename {LEGO1 => lego1/include}/realtimeview.h (100%) rename {LEGO1 => lego1/include}/viewmanager.h (100%) rename {LEGO1 => lego1/src}/dllmain.cpp (100%) rename {LEGO1 => lego1/src}/legoomni.cpp (100%) rename {LEGO1 => lego1/src}/mxcore.cpp (100%) rename {LEGO1 => lego1/src}/mxcriticalsection.cpp (100%) rename {LEGO1 => lego1/src}/mxomnicreateparambase.cpp (100%) create mode 100755 scripts/cm420 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 55a1eb50..668e3a4e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,50 +13,51 @@ jobs: steps: - uses: actions/checkout@v3 - - uses: actions/checkout@v3 - with: - repository: 'itsmattkc/msvc420' - path: msvc420 - - - name: Restore cached DX5 SDK - id: cache-dx5 + - name: Restore cached kit + id: cache-kit uses: actions/cache/restore@v3 with: - path: dx5sdk - key: dx5sdk + path: C:\islekit + key: islekit - name: Download DX5 SDK - if: steps.cache-dx5.outputs.cache-hit != 'true' + if: steps.cache-kit.outputs.cache-hit != 'true' run: | cd dx5sdk - C:\msys64\usr\bin\wget.exe https://archive.org/download/idx5sdk/idx5sdk.exe + curl -LO https://archive.org/download/idx5sdk/idx5sdk.exe 7z x .\idx5sdk.exe 7z x .\DX5SDK.EXE cd cdrom + + - name: Setup MSVC 4.20 + if: steps.cache-kit.outputs.cache-hit != 'true' + run: | + git clone --depth 1 https://github.com/itsmattkc/msvc420 c:\islekit\msvc420 - - name: Cache DX5 SDK - if: steps.cache-dx5.outputs.cache-hit != 'true' + - name: Setup DX5 SDK + if: steps.cache-kit.outputs.cache-hit != 'true' + run: | + cd dx5sdk + move cdrom c:\islekit\dx5sdk + + - name: Cache kit + if: steps.cache-kit.outputs.cache-hit != 'true' id: save-dx5 uses: actions/cache/save@v3 with: - path: dx5sdk - key: dx5sdk - - - name: Setup DX5 SDK - run: | - cd dx5sdk - cd cdrom - .\SETUP.EXE /s - + path: C:\islekit + key: islekit + - name: Build shell: cmd run: | - call .\msvc420\bin\VCVARS32.BAT x86 - mkdir Release - .\msvc420\bin\NMAKE.EXE /f isle.mak CFG="ISLE - Win32 Release" + set ISLE_KIT_ROOT=C:/islekit + call "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" amd64 + cmake -GNinja -Bbuild --toolchain cmake/Toolchain/msvc42.cmake -DCMAKE_BUILD_TYPE=Release + cmake --build build -j 1 - name: Upload Artifact uses: actions/upload-artifact@master with: name: Win32 - path: Release + path: build/isle/isle.exe diff --git a/.gitignore b/.gitignore index b1838781..567609b1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1 @@ -Debug/ -Release/ -*.ncb +build/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..8fb84c45 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.10) # just for sanity's sake + +project( + isle + LANGUAGES C CXX +) + +include(${PROJECT_SOURCE_DIR}/cmake/dx5sdk.cmake) + +if(ISLE_BUILD_LEGO1) + add_subdirectory(lego1) +endif() + +add_subdirectory(isle) diff --git a/README.md b/README.md index b4d73934..a6839b51 100644 --- a/README.md +++ b/README.md @@ -12,30 +12,21 @@ Currently `ISLE.EXE` is completely decompiled, however there are some known inac ## Building -LEGO Island was compiled with Microsoft Visual C++ 4.20, so that's what this decompilation targets. However it should compile with NMAKE on newer versions of Visual Studio too. +LEGO Island was compiled with Microsoft Visual C++ 4.20, so that's what this decompilation targets. However, building with newer versions of Visual C++ using CMake should also work. -### Recommended Instructions: +### Assembling Kit -These instructions use the development IDE from Visual C++ 4.20. By modern standards, it can be a little clunky to use, especially on newer versions of Windows, however it's still relatively straightforward. If you prefer a command line process that can fit into a modern workflow/IDE, see the instructions below. +Pick a directory without spaces to use as the root of your kit. Set this as the `ISLE_KIT_ROOT` in your preferred shell (on Windows, for instance `set ISLE_KIT_ROOT=X:/path/to/kit`). -1. Install Microsoft Visual C++ 4.20. This can be found on many abandonware sites, but the installer can be a little iffy on modern versions of Windows. For convenience, I made a [portable version](https://github.com/itsmattkc/msvc420) that can be downloaded and used quickly instead. -2. Download and install the DirectX 5 SDK. Similarly, this can be found on many abandonware sites. -3. Open "Microsoft Developer Studio" (`BIN/MSDEV.EXE` for those using the portable). -4. `File` > `Open Workspace` -5. Select `ISLE.MDP` from this repository. -6. Select a build configuration. `ISLE - Win32 Release` is recommended because, at this point in time, you'll almost certainly be pairing it with the retail `LEGO1.DLL`, which is also a release build. -7. `Build` > `Build ISLE.EXE`. This will build `ISLE.EXE` in a folder called `Release`. It will also build `LEGO1.DLL` since it's listed as a dependency, however the `LEGO1.DLL` produced is too incomplete to be usable at this time. +Clone [MSVC420](https://github.com/itsmattkc/msvc420) to your kit root. -### Command Line Instructions +Install the DirectX 5 SDK, changing the location to [kit root]/dx5sdk. -For some users, this may be preferable to using an obsolete graphical IDE. Any modern IDE should support custom command line build steps, making this potentially easier to fit into a familiar contemporary workflow. This guide assumes a general familiarity with the Windows command prompt. +### Configuring CMake -1. Acquire Visual Studio/Visual C++. Any version after 4.20 should work here, but 4.20 is the only one guaranteed to work. If you wish to use 4.20, it can be found on many abandonware sites, but the installer can be a little iffy on modern versions of Windows. For convenience, I made a [portable version](https://github.com/itsmattkc/msvc420) that can be downloaded and used quickly instead. -2. Download and install the DirectX 5 SDK. Similarly, this can be found on many abandonware sites, but later versions of Visual Studio include the DirectX SDK by default, so this step may be skippable (you definitely need it for MSVC 4.20). -3. Open an x86/32-bit developer command prompt. Depending on the version of VS you're using, you may have a start menu item for it already (e.g. `x86 Native Tools Command Prompt`). Alternatively, you can start a normal command prompt (`cmd`) and run `vcvars32.bat` from the Visual Studio folder (run `BIN/VCVARS32.BAT x86` if you're using the portable 4.20). -4. `cd` to the folder you cloned this repository to. -5. `mkdir Release` if the folder doesn't already exist. Some versions of NMAKE may make this folder by itself, but some don't. -6. Run `nmake /f isle.mak CFG="ISLE - Win32 Release"`. This will build `ISLE.EXE` in the `Release` folder you just made. It will also build `LEGO1.DLL` since it's listed as a dependency, however the `LEGO1.DLL` produced is too incomplete to be usable at this time. +`cmake -Bbuild --toolchain cmake/Toolchain/msvc42.cmake -DCMAKE_BUILD_TYPE=Release` + +On Linux, you need to use `scripts/cm420` to configure the build. ## Usage diff --git a/isle.mak b/attic/isle.mak similarity index 100% rename from isle.mak rename to attic/isle.mak diff --git a/isle.mdp b/attic/isle.mdp similarity index 100% rename from isle.mdp rename to attic/isle.mdp diff --git a/cmake/Toolchain/msvc42-common.cmake b/cmake/Toolchain/msvc42-common.cmake new file mode 100644 index 00000000..b5401ede --- /dev/null +++ b/cmake/Toolchain/msvc42-common.cmake @@ -0,0 +1,19 @@ +# Common place for msvc42 toolchain stuff that Doesn't change + +# these don't seem to actually be listened to but in the rare case they are +# set them anyways +set(MSVC_INCREMENTAL_DEFAULT OFF CACHE STRING "") +set(CMAKE_COMPILER_SUPPORTS_PDBTYPE OFF CACHE STRING "") + +foreach(lang C CXX) + set(CMAKE_${lang}_FLAGS "/DWIN32 /D_WINDOWS /W3 /Zm1000 /I$ENV{ISLE_KIT_ROOT}/msvc420/include" CACHE STRING "") + set(CMAKE_${lang}_FLAGS_DEBUG "/MDd /Zi /Ob0 /Od" CACHE STRING "") + + set(CMAKE_${lang}_FLAGS_INIT "/DWIN32 /D_WINDOWS /W3 /Zm1000 /I$ENV{ISLE_KIT_ROOT}/msvc420/include" CACHE STRING "") + set(CMAKE_${lang}_FLAGS_INIT_DEBUG "/MDd /Zi /Ob0 /Od" CACHE STRING "") +endforeach() + +set(CMAKE_EXE_LINKER_FLAGS "/LIBPATH:$ENV{ISLE_KIT_ROOT}/msvc420/lib /incremental:no") +set(CMAKE_EXE_LINKER_FLAGS_DEBUG "/debug /incremental:no") +set(CMAKE_SHARED_LINKER_FLAGS "/LIBPATH:$ENV{ISLE_KIT_ROOT}/msvc420/lib /incremental:no") + diff --git a/cmake/Toolchain/msvc42-linux.cmake b/cmake/Toolchain/msvc42-linux.cmake new file mode 100644 index 00000000..f58b2336 --- /dev/null +++ b/cmake/Toolchain/msvc42-linux.cmake @@ -0,0 +1,14 @@ +set(CMAKE_SYSTEM_NAME Windows) + +include(${CMAKE_CURRENT_LIST_DIR}/msvc42-common.cmake) + +set(CMAKE_C_COMPILER ${CMAKE_SOURCE_DIR}/cmake/Toolchain/wrappers/cl) +set(CMAKE_CXX_COMPILER ${CMAKE_C_COMPILER}) +set(CMAKE_RC_COMPILER ${CMAKE_SOURCE_DIR}/cmake/Toolchain/wrappers/rc) +set(CMAKE_AR ${CMAKE_SOURCE_DIR}/cmake/Toolchain/wrappers/lib) +set(CMAKE_LINKER ${CMAKE_SOURCE_DIR}/cmake/Toolchain/wrappers/link) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/cmake/Toolchain/msvc42.cmake b/cmake/Toolchain/msvc42.cmake new file mode 100644 index 00000000..d91f807e --- /dev/null +++ b/cmake/Toolchain/msvc42.cmake @@ -0,0 +1,17 @@ +set(CMAKE_SYSTEM_NAME Windows) + +include(${CMAKE_CURRENT_LIST_DIR}/msvc42-common.cmake) + +set(CMAKE_C_COMPILER $ENV{ISLE_KIT_ROOT}/msvc420/bin/cl.exe) +set(CMAKE_CXX_COMPILER ${CMAKE_C_COMPILER}) +set(CMAKE_RC_COMPILER $ENV{ISLE_KIT_ROOT}/msvc420/bin/rc.exe) +set(CMAKE_AR $ENV{ISLE_KIT_ROOT}/msvc420/bin/lib.exe) +set(CMAKE_LINKER $ENV{ISLE_KIT_ROOT}/msvc420/bin/link.exe) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + +set(CMAKE_C_COMPILER_WORKS ON) +set(CMAKE_CXX_COMPILER_WORKS ON) diff --git a/cmake/Toolchain/wrappers/build_msvctricks.sh b/cmake/Toolchain/wrappers/build_msvctricks.sh new file mode 100755 index 00000000..56e3645a --- /dev/null +++ b/cmake/Toolchain/wrappers/build_msvctricks.sh @@ -0,0 +1,2 @@ +#!/bin/bash +i686-w64-mingw32-g++ -O3 -fno-ident -fno-stack-protector -static msvctricks.cpp -municode -lshlwapi -o msvctricks.exe diff --git a/cmake/Toolchain/wrappers/cl b/cmake/Toolchain/wrappers/cl new file mode 100755 index 00000000..a8d377bc --- /dev/null +++ b/cmake/Toolchain/wrappers/cl @@ -0,0 +1 @@ +$(dirname $0)/wine-msvc.sh ${ISLE_KIT_ROOT}/msvc420/bin/cl.exe "$@" diff --git a/cmake/Toolchain/wrappers/lib b/cmake/Toolchain/wrappers/lib new file mode 100755 index 00000000..deed170b --- /dev/null +++ b/cmake/Toolchain/wrappers/lib @@ -0,0 +1 @@ +$(dirname $0)/wine-msvc.sh ${ISLE_KIT_ROOT}/msvc420/bin/lib.exe "$@" diff --git a/cmake/Toolchain/wrappers/link b/cmake/Toolchain/wrappers/link new file mode 100755 index 00000000..e1e62370 --- /dev/null +++ b/cmake/Toolchain/wrappers/link @@ -0,0 +1 @@ +$(dirname $0)/wine-msvc.sh ${ISLE_KIT_ROOT}/msvc420/bin/link.exe "$@" diff --git a/cmake/Toolchain/wrappers/msvctricks.cpp b/cmake/Toolchain/wrappers/msvctricks.cpp new file mode 100644 index 00000000..36a2e2ef --- /dev/null +++ b/cmake/Toolchain/wrappers/msvctricks.cpp @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2023 Huang Qinjin + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +//#pragma comment(lib, "shell32.lib") +//#pragma comment(lib, "shlwapi.lib") +//#pragma comment(linker, "/ENTRY:wWinMainCRTStartup") +//#pragma comment(linker, "/SUBSYSTEM:CONSOLE") + + +static HANDLE hStdIn = INVALID_HANDLE_VALUE; +static HANDLE hStdOut = INVALID_HANDLE_VALUE; +static HANDLE hStdErr = INVALID_HANDLE_VALUE; + +static DWORD run(LPWSTR lpCmdLine) +{ + STARTUPINFOW si = {}; + si.cb = sizeof(si); + si.dwFlags = STARTF_USESTDHANDLES; + si.hStdInput = hStdIn; + si.hStdOutput = hStdOut; + si.hStdError = hStdErr; + + PROCESS_INFORMATION pi = {}; + + DWORD dwExitCode; + if (CreateProcessW(nullptr, lpCmdLine, nullptr, nullptr, TRUE, 0, nullptr, nullptr, &si, &pi)) + { + WaitForSingleObject(pi.hProcess, INFINITE); + + if (!GetExitCodeProcess(pi.hProcess, &dwExitCode)) + { + dwExitCode = GetLastError(); + } + + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + else + { + dwExitCode = GetLastError(); + } + + return dwExitCode; +} + +static DWORD mt(LPWSTR lpCmdLine) +{ + DWORD dwExitCode = run(lpCmdLine); + // https://gitlab.kitware.com/cmake/cmake/-/blob/v3.26.0/Source/cmcmd.cxx#L2405 + if (dwExitCode == 0x41020001) + dwExitCode = 0xbb; + return dwExitCode; +} + +int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) +{ + (void) hInstance; + (void) hPrevInstance; + (void) nCmdShow; + + int argc = 0; + wchar_t** argv = CommandLineToArgvW(lpCmdLine, &argc); + if (argc <= 0) return 0; + + wchar_t buf[32768]; + if (GetEnvironmentVariableW(L"WINE_MSVC_STDIN", buf, ARRAYSIZE(buf))) + { + SECURITY_ATTRIBUTES attr = {}; + attr.nLength = sizeof(attr); + attr.bInheritHandle = TRUE; + + hStdIn = CreateFileW(buf, GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + &attr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); + } + if (GetEnvironmentVariableW(L"WINE_MSVC_STDOUT", buf, ARRAYSIZE(buf))) + { + SECURITY_ATTRIBUTES attr = {}; + attr.nLength = sizeof(attr); + attr.bInheritHandle = TRUE; + + hStdOut = CreateFileW(buf, GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + &attr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); + } + if (GetEnvironmentVariableW(L"WINE_MSVC_STDERR", buf, ARRAYSIZE(buf))) + { + SECURITY_ATTRIBUTES attr = {}; + attr.nLength = sizeof(attr); + attr.bInheritHandle = TRUE; + + hStdErr = CreateFileW(buf, GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, + &attr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr); + } + + if (hStdIn == INVALID_HANDLE_VALUE) + { + hStdIn = GetStdHandle(STD_INPUT_HANDLE); + } + if (hStdOut == INVALID_HANDLE_VALUE) + { + hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); + } + if (hStdErr == INVALID_HANDLE_VALUE) + { + hStdErr = GetStdHandle(STD_ERROR_HANDLE); + } + + LPCWSTR const exe = PathFindFileNameW(argv[0]); + + if (PathMatchSpecW(exe, L"mt.exe")) + return mt(lpCmdLine); + + return run(lpCmdLine); +} diff --git a/cmake/Toolchain/wrappers/msvctricks.exe b/cmake/Toolchain/wrappers/msvctricks.exe new file mode 100755 index 0000000000000000000000000000000000000000..c86cf322b36fbd79f49200708d0a5582eb2534cc GIT binary patch literal 115004 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 A`Tzg` literal 0 HcmV?d00001 diff --git a/cmake/Toolchain/wrappers/rc b/cmake/Toolchain/wrappers/rc new file mode 100755 index 00000000..80bdde5c --- /dev/null +++ b/cmake/Toolchain/wrappers/rc @@ -0,0 +1 @@ +$(dirname $0)/wine-msvc.sh ${ISLE_KIT_ROOT}/msvc420/bin/rc.exe "$@" diff --git a/cmake/Toolchain/wrappers/wine-msvc.sh b/cmake/Toolchain/wrappers/wine-msvc.sh new file mode 100755 index 00000000..707fc3da --- /dev/null +++ b/cmake/Toolchain/wrappers/wine-msvc.sh @@ -0,0 +1,59 @@ +#!/bin/bash +# +# Copyright (c) 2018 Martin Storsjo +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +EXE=$(dirname $0)/msvctricks.exe +HAS_MSVCTRICKS=true + +ARGS=() +while [ $# -gt 0 ]; do + a=$1 + case $a in + [-/][A-Za-z][A-Za-z]/*) + opt=${a:0:3} + path=${a:3} + if [ -d "$(dirname "$path")" ] && [ "$(dirname "$path")" != "/" ]; then + a=${opt}z:$path + fi + ;; + /*) + if [ -d "$(dirname "$a")" ] && [ "$(dirname "$a")" != "/" ]; then + a=z:$a + fi + ;; + *) + ;; + esac + ARGS+=("$a") + shift +done + +unixify_path='s/\r// ; s/z:\([\\/]\)/\1/i ; /^Note:/s,\\,/,g' + +export WINE_MSVC_STDOUT=${TMPDIR:-/tmp}/wine-msvc.stdout.$$ +export WINE_MSVC_STDERR=${TMPDIR:-/tmp}/wine-msvc.stderr.$$ + +cleanup() { + wait + rm -f $WINE_MSVC_STDOUT $WINE_MSVC_STDERR +} + +trap cleanup EXIT + +cleanup && mkfifo $WINE_MSVC_STDOUT $WINE_MSVC_STDERR || exit 1 + +sed -e "$unixify_path" <$WINE_MSVC_STDOUT & +sed -e "$unixify_path" <$WINE_MSVC_STDERR >&2 & +WINEDEBUG=-all wine64 "$EXE" "${ARGS[@]}" &>/dev/null diff --git a/cmake/dx5sdk.cmake b/cmake/dx5sdk.cmake new file mode 100644 index 00000000..d5654f1f --- /dev/null +++ b/cmake/dx5sdk.cmake @@ -0,0 +1,36 @@ +# Make sure the user provided a valid kit root. +if("$ENV{ISLE_KIT_ROOT}" STREQUAL "") + message(FATAL_ERROR "ISLE_KIT_ROOT needs to be set to build") +endif() + + +set(__DX5_SDK_PATH "$ENV{ISLE_KIT_ROOT}/dx5sdk/sdk") + +# There are no seperated includes, so for nicity just define a common interface target +# that nets us includes, that all DX5 targets include from. +# This techinically means a project can do a no-no and use, say D3D apis w/o linking D3D, +# but that's a footgun that requires knowledge of this so I'm not particulary.. worried about it? +add_library(__DX5_Inc INTERFACE) +target_include_directories(__DX5_Inc INTERFACE ${__DX5_SDK_PATH}/inc) + +# Bootstrapping problems are fun. +add_library(DX5::Guid STATIC IMPORTED) +set_property(TARGET DX5::Guid PROPERTY + IMPORTED_LOCATION $ENV{ISLE_KIT_ROOT}/dx5sdk/sdk/lib/dxguid.lib + ) + + +macro(__add_dx5_lib name libname) + add_library(DX5::${name} SHARED IMPORTED) + target_link_libraries(DX5::${name} INTERFACE __DX5_Inc DX5::Guid) + set_property(TARGET DX5::${name} PROPERTY + IMPORTED_IMPLIB ${__DX5_SDK_PATH}/lib/${libname} + ) +endmacro() + + +__add_dx5_lib(D3DRM d3drm.lib) +__add_dx5_lib(DDraw ddraw.lib) +__add_dx5_lib(DInput dinput.lib) +__add_dx5_lib(DSound dsound.lib) + diff --git a/dx5sdk/cdrom/setup.iss b/dx5sdk/cdrom/setup.iss index 65d3f56f..35a44dd8 100644 --- a/dx5sdk/cdrom/setup.iss +++ b/dx5sdk/cdrom/setup.iss @@ -17,7 +17,7 @@ Result=1 [SdSetupTypeEx-0] Result=Compact [SdAskDestPath-0] -szDir=C:\dxsdk +szDir=C:\islekit\dxsdk Result=1 [SdSelectFolder-0] szFolder=Microsoft DirectX 5 SDK diff --git a/isle/CMakeLists.txt b/isle/CMakeLists.txt new file mode 100644 index 00000000..f3aa218b --- /dev/null +++ b/isle/CMakeLists.txt @@ -0,0 +1,28 @@ +add_executable(isle WIN32 + src/define.cpp + src/main.cpp + src/isle.cpp + src/res/isle.rc + + ../lego1/src/mxomnicreateparambase.cpp +) + +# Left for when lego1 is featured enough to be bootstrappable. +#if(ISLE_BUILD_LEGO1) +# target_link_libraries(isle PRIVATE lego1) +#else() + target_include_directories(isle PRIVATE ${PROJECT_SOURCE_DIR}/lego1/include) + target_link_libraries(isle PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/ext/lego1.lib + ) +#endif() + + +target_include_directories(isle PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src +) + +target_link_libraries(isle PRIVATE + DX5::DSound + winmm +) diff --git a/ISLE/ext/lego1.def b/isle/ext/lego1.def similarity index 100% rename from ISLE/ext/lego1.def rename to isle/ext/lego1.def diff --git a/ISLE/ext/lego1.exp b/isle/ext/lego1.exp similarity index 100% rename from ISLE/ext/lego1.exp rename to isle/ext/lego1.exp diff --git a/ISLE/ext/lego1.lib b/isle/ext/lego1.lib similarity index 100% rename from ISLE/ext/lego1.lib rename to isle/ext/lego1.lib diff --git a/ISLE/define.cpp b/isle/src/define.cpp similarity index 100% rename from ISLE/define.cpp rename to isle/src/define.cpp diff --git a/ISLE/define.h b/isle/src/define.h similarity index 100% rename from ISLE/define.h rename to isle/src/define.h diff --git a/ISLE/isle.cpp b/isle/src/isle.cpp similarity index 99% rename from ISLE/isle.cpp rename to isle/src/isle.cpp index f4d9cfeb..276a1f8a 100644 --- a/ISLE/isle.cpp +++ b/isle/src/isle.cpp @@ -5,7 +5,7 @@ #include "mxdirectdraw.h" #include "mxdsaction.h" #include "mxomni.h" -#include "res/resource.h" +#include "resource.h" RECT windowRect = {0, 0, 640, 480}; diff --git a/ISLE/isle.h b/isle/src/isle.h similarity index 98% rename from ISLE/isle.h rename to isle/src/isle.h index e23fb8cb..389e8630 100644 --- a/ISLE/isle.h +++ b/isle/src/isle.h @@ -1,7 +1,7 @@ #ifndef ISLE_H #define ISLE_H -#include +#include #include "mxresult.h" #include "mxvideoparam.h" diff --git a/ISLE/main.cpp b/isle/src/main.cpp similarity index 98% rename from ISLE/main.cpp rename to isle/src/main.cpp index 9ef4466e..ba912342 100644 --- a/ISLE/main.cpp +++ b/isle/src/main.cpp @@ -1,5 +1,5 @@ -#include -#include +#include +#include #include "define.h" #include "isle.h" diff --git a/ISLE/res/arrow.cur b/isle/src/res/arrow.cur similarity index 100% rename from ISLE/res/arrow.cur rename to isle/src/res/arrow.cur diff --git a/ISLE/res/busy.cur b/isle/src/res/busy.cur similarity index 100% rename from ISLE/res/busy.cur rename to isle/src/res/busy.cur diff --git a/ISLE/res/isle.ico b/isle/src/res/isle.ico similarity index 100% rename from ISLE/res/isle.ico rename to isle/src/res/isle.ico diff --git a/ISLE/res/isle.rc b/isle/src/res/isle.rc similarity index 80% rename from ISLE/res/isle.rc rename to isle/src/res/isle.rc index 59bd314b32dcd7d7adf78adba2263046f3b36e01..14100e9f128dfd6e141b07b89f3a8711ae68eec3 100644 GIT binary patch delta 51 zcmX@W^MQLp+{6McL1%_gh9HJu27e%_z`)6%G;zQ6WFAH>Zchehpr9W}Xmcdva~1$m C01L+e delta 113 zcmeyseSl{|oS-K|FoO?+D}z2m5ko3NF@yfZSnY`iM6ig@w8kQMSzDQt!IQz6!Jom8 UL4ko22$g_*G&47IGCpSk0Fsdx00000 diff --git a/ISLE/res/no.cur b/isle/src/res/no.cur similarity index 100% rename from ISLE/res/no.cur rename to isle/src/res/no.cur diff --git a/ISLE/res/resource.h b/isle/src/resource.h similarity index 100% rename from ISLE/res/resource.h rename to isle/src/resource.h diff --git a/lego1/CMakeLists.txt b/lego1/CMakeLists.txt new file mode 100644 index 00000000..ca77f241 --- /dev/null +++ b/lego1/CMakeLists.txt @@ -0,0 +1,24 @@ +add_library(lego1 SHARED + src/dllmain.cpp + + # OMNI source + src/mxcore.cpp + src/mxcriticalsection.cpp + src/mxomnicreateparambase.cpp + + # legoomni source + src/legoomni.cpp +) + +target_include_directories(lego1 PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/include +) + +target_include_directories(lego1 PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src +) + +target_link_libraries(lego1 PRIVATE + DX5::DSound + winmm +) diff --git a/LEGO1/legoanimationmanager.h b/lego1/include/legoanimationmanager.h similarity index 100% rename from LEGO1/legoanimationmanager.h rename to lego1/include/legoanimationmanager.h diff --git a/LEGO1/legobackgroundcolor.h b/lego1/include/legobackgroundcolor.h similarity index 100% rename from LEGO1/legobackgroundcolor.h rename to lego1/include/legobackgroundcolor.h diff --git a/LEGO1/legobuildingmanager.h b/lego1/include/legobuildingmanager.h similarity index 100% rename from LEGO1/legobuildingmanager.h rename to lego1/include/legobuildingmanager.h diff --git a/LEGO1/legoentity.h b/lego1/include/legoentity.h similarity index 100% rename from LEGO1/legoentity.h rename to lego1/include/legoentity.h diff --git a/LEGO1/legogamestate.h b/lego1/include/legogamestate.h similarity index 100% rename from LEGO1/legogamestate.h rename to lego1/include/legogamestate.h diff --git a/LEGO1/legoinputmanager.h b/lego1/include/legoinputmanager.h similarity index 100% rename from LEGO1/legoinputmanager.h rename to lego1/include/legoinputmanager.h diff --git a/LEGO1/legomodelpresenter.h b/lego1/include/legomodelpresenter.h similarity index 100% rename from LEGO1/legomodelpresenter.h rename to lego1/include/legomodelpresenter.h diff --git a/LEGO1/legonavcontroller.h b/lego1/include/legonavcontroller.h similarity index 100% rename from LEGO1/legonavcontroller.h rename to lego1/include/legonavcontroller.h diff --git a/LEGO1/legoomni.h b/lego1/include/legoomni.h similarity index 100% rename from LEGO1/legoomni.h rename to lego1/include/legoomni.h diff --git a/LEGO1/legopartpresenter.h b/lego1/include/legopartpresenter.h similarity index 100% rename from LEGO1/legopartpresenter.h rename to lego1/include/legopartpresenter.h diff --git a/LEGO1/legoroi.h b/lego1/include/legoroi.h similarity index 100% rename from LEGO1/legoroi.h rename to lego1/include/legoroi.h diff --git a/LEGO1/legovideomanager.h b/lego1/include/legovideomanager.h similarity index 100% rename from LEGO1/legovideomanager.h rename to lego1/include/legovideomanager.h diff --git a/LEGO1/legoworld.h b/lego1/include/legoworld.h similarity index 100% rename from LEGO1/legoworld.h rename to lego1/include/legoworld.h diff --git a/LEGO1/legoworldpresenter.h b/lego1/include/legoworldpresenter.h similarity index 100% rename from LEGO1/legoworldpresenter.h rename to lego1/include/legoworldpresenter.h diff --git a/LEGO1/mxatomid.h b/lego1/include/mxatomid.h similarity index 100% rename from LEGO1/mxatomid.h rename to lego1/include/mxatomid.h diff --git a/LEGO1/mxbackgroundaudiomanager.h b/lego1/include/mxbackgroundaudiomanager.h similarity index 100% rename from LEGO1/mxbackgroundaudiomanager.h rename to lego1/include/mxbackgroundaudiomanager.h diff --git a/LEGO1/mxbitmap.h b/lego1/include/mxbitmap.h similarity index 100% rename from LEGO1/mxbitmap.h rename to lego1/include/mxbitmap.h diff --git a/LEGO1/mxbool.h b/lego1/include/mxbool.h similarity index 100% rename from LEGO1/mxbool.h rename to lego1/include/mxbool.h diff --git a/LEGO1/mxcore.h b/lego1/include/mxcore.h similarity index 100% rename from LEGO1/mxcore.h rename to lego1/include/mxcore.h diff --git a/LEGO1/mxcriticalsection.h b/lego1/include/mxcriticalsection.h similarity index 100% rename from LEGO1/mxcriticalsection.h rename to lego1/include/mxcriticalsection.h diff --git a/LEGO1/mxdirectdraw.h b/lego1/include/mxdirectdraw.h similarity index 100% rename from LEGO1/mxdirectdraw.h rename to lego1/include/mxdirectdraw.h diff --git a/LEGO1/mxdsaction.h b/lego1/include/mxdsaction.h similarity index 100% rename from LEGO1/mxdsaction.h rename to lego1/include/mxdsaction.h diff --git a/LEGO1/mxdsfile.h b/lego1/include/mxdsfile.h similarity index 100% rename from LEGO1/mxdsfile.h rename to lego1/include/mxdsfile.h diff --git a/LEGO1/mxdsobject.h b/lego1/include/mxdsobject.h similarity index 100% rename from LEGO1/mxdsobject.h rename to lego1/include/mxdsobject.h diff --git a/LEGO1/mxioinfo.h b/lego1/include/mxioinfo.h similarity index 100% rename from LEGO1/mxioinfo.h rename to lego1/include/mxioinfo.h diff --git a/LEGO1/mxomni.h b/lego1/include/mxomni.h similarity index 100% rename from LEGO1/mxomni.h rename to lego1/include/mxomni.h diff --git a/LEGO1/mxomnicreateflags.h b/lego1/include/mxomnicreateflags.h similarity index 100% rename from LEGO1/mxomnicreateflags.h rename to lego1/include/mxomnicreateflags.h diff --git a/LEGO1/mxomnicreateparam.h b/lego1/include/mxomnicreateparam.h similarity index 96% rename from LEGO1/mxomnicreateparam.h rename to lego1/include/mxomnicreateparam.h index f72623aa..cbdf0a34 100644 --- a/LEGO1/mxomnicreateparam.h +++ b/lego1/include/mxomnicreateparam.h @@ -1,7 +1,7 @@ #ifndef MXOMNICREATEPARAM_H #define MXOMNICREATEPARAM_H -#include +#include #include "mxomnicreateflags.h" #include "mxomnicreateparambase.h" diff --git a/LEGO1/mxomnicreateparambase.h b/lego1/include/mxomnicreateparambase.h similarity index 100% rename from LEGO1/mxomnicreateparambase.h rename to lego1/include/mxomnicreateparambase.h diff --git a/LEGO1/mxpalette.h b/lego1/include/mxpalette.h similarity index 100% rename from LEGO1/mxpalette.h rename to lego1/include/mxpalette.h diff --git a/LEGO1/mxpresenter.h b/lego1/include/mxpresenter.h similarity index 100% rename from LEGO1/mxpresenter.h rename to lego1/include/mxpresenter.h diff --git a/LEGO1/mxrect32.h b/lego1/include/mxrect32.h similarity index 100% rename from LEGO1/mxrect32.h rename to lego1/include/mxrect32.h diff --git a/LEGO1/mxresult.h b/lego1/include/mxresult.h similarity index 100% rename from LEGO1/mxresult.h rename to lego1/include/mxresult.h diff --git a/LEGO1/mxscheduler.h b/lego1/include/mxscheduler.h similarity index 100% rename from LEGO1/mxscheduler.h rename to lego1/include/mxscheduler.h diff --git a/LEGO1/mxstreamcontroller.h b/lego1/include/mxstreamcontroller.h similarity index 100% rename from LEGO1/mxstreamcontroller.h rename to lego1/include/mxstreamcontroller.h diff --git a/LEGO1/mxstreamer.h b/lego1/include/mxstreamer.h similarity index 100% rename from LEGO1/mxstreamer.h rename to lego1/include/mxstreamer.h diff --git a/LEGO1/mxstring.h b/lego1/include/mxstring.h similarity index 100% rename from LEGO1/mxstring.h rename to lego1/include/mxstring.h diff --git a/LEGO1/mxticklemanager.h b/lego1/include/mxticklemanager.h similarity index 100% rename from LEGO1/mxticklemanager.h rename to lego1/include/mxticklemanager.h diff --git a/LEGO1/mxtimer.h b/lego1/include/mxtimer.h similarity index 100% rename from LEGO1/mxtimer.h rename to lego1/include/mxtimer.h diff --git a/LEGO1/mxtransitionmanager.h b/lego1/include/mxtransitionmanager.h similarity index 100% rename from LEGO1/mxtransitionmanager.h rename to lego1/include/mxtransitionmanager.h diff --git a/LEGO1/mxvariabletable.h b/lego1/include/mxvariabletable.h similarity index 100% rename from LEGO1/mxvariabletable.h rename to lego1/include/mxvariabletable.h diff --git a/LEGO1/mxvideomanager.h b/lego1/include/mxvideomanager.h similarity index 100% rename from LEGO1/mxvideomanager.h rename to lego1/include/mxvideomanager.h diff --git a/LEGO1/mxvideoparam.h b/lego1/include/mxvideoparam.h similarity index 100% rename from LEGO1/mxvideoparam.h rename to lego1/include/mxvideoparam.h diff --git a/LEGO1/mxvideoparamflags.h b/lego1/include/mxvideoparamflags.h similarity index 100% rename from LEGO1/mxvideoparamflags.h rename to lego1/include/mxvideoparamflags.h diff --git a/LEGO1/realtimeview.h b/lego1/include/realtimeview.h similarity index 100% rename from LEGO1/realtimeview.h rename to lego1/include/realtimeview.h diff --git a/LEGO1/viewmanager.h b/lego1/include/viewmanager.h similarity index 100% rename from LEGO1/viewmanager.h rename to lego1/include/viewmanager.h diff --git a/LEGO1/dllmain.cpp b/lego1/src/dllmain.cpp similarity index 100% rename from LEGO1/dllmain.cpp rename to lego1/src/dllmain.cpp diff --git a/LEGO1/legoomni.cpp b/lego1/src/legoomni.cpp similarity index 100% rename from LEGO1/legoomni.cpp rename to lego1/src/legoomni.cpp diff --git a/LEGO1/mxcore.cpp b/lego1/src/mxcore.cpp similarity index 100% rename from LEGO1/mxcore.cpp rename to lego1/src/mxcore.cpp diff --git a/LEGO1/mxcriticalsection.cpp b/lego1/src/mxcriticalsection.cpp similarity index 100% rename from LEGO1/mxcriticalsection.cpp rename to lego1/src/mxcriticalsection.cpp diff --git a/LEGO1/mxomnicreateparambase.cpp b/lego1/src/mxomnicreateparambase.cpp similarity index 100% rename from LEGO1/mxomnicreateparambase.cpp rename to lego1/src/mxomnicreateparambase.cpp diff --git a/scripts/cm420 b/scripts/cm420 new file mode 100755 index 00000000..4d0ad42b --- /dev/null +++ b/scripts/cm420 @@ -0,0 +1,8 @@ +#!/bin/bash +# Helper wrapper to use the Linux MSVC4.2 toolchain +# This requires ISLE_KIT_ROOT to be set properly. + +cmake \ + --toolchain cmake/Toolchain/msvc42-linux.cmake \ + -DCMAKE_CROSSCOMPILING_EMULATOR=/usr/bin/wine \ + $@