From d5e263390ec89b27842d209ffa970892814710de Mon Sep 17 00:00:00 2001 From: Kbz-8 Date: Sat, 9 Dec 2023 13:24:40 +0100 Subject: [PATCH] adding build readme for xmake, fixing windows workflow --- .github/workflows/windows.yml | 4 +-- README.md | 6 ++++ XMAKE_BUILD.md | 47 ++++++++++++++++++++++++++++++++ res/screenshot_test_windows.png | Bin 0 -> 13375 bytes 4 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 XMAKE_BUILD.md create mode 100644 res/screenshot_test_windows.png diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index f5d2000..e82f86c 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -68,8 +68,8 @@ jobs: # Build the mlx - name: Build MacroLibX - run: xmake --yes -v + run: xmake --yes # Build the test - name: Build Test - run: xmake build --yes -v Test + run: xmake build --yes Test diff --git a/README.md b/README.md index b46ab02..cfdd314 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ + +
@@ -46,6 +48,10 @@ brew install molten-vk brew install SDL2 ``` +### 🪟 Windows + +To build on Windows you may need to use the [xmake](https://xmake.io) build. [Here's](./XMAKE_BUILD.md) how you can use it. + ### Clone and Build Finally, you can clone the Git repository. When inside it, run the GNU `make` command to compile MacroLibX. diff --git a/XMAKE_BUILD.md b/XMAKE_BUILD.md new file mode 100644 index 0000000..b0e5218 --- /dev/null +++ b/XMAKE_BUILD.md @@ -0,0 +1,47 @@ +# 🏗️ xmake build +To build on Windows (if you don't use [WSL](https://learn.microsoft.com/en-us/windows/wsl/install)) or on other OS, the MacroLibX uses [xmake](https://xmake.io), a build system which will download and compile all dependencies it won't find on your computer. + +## 💾 Install xmake +You can find how to install it on your system [here](https://xmake.io/#/guide/installation). Note that you can also download a [portable version](https://github.com/xmake-io/xmake/releases) of xmake if you wish not to install it. + +## ⚙️ Configure the MacroLibX build +Just as the Makfile build system, you can configure how xmake should build the MacroLibX. The base command to configure it is `xmake config [opts...]` or `xmake f [opts...]`. + +### 📦 Compile mode +You can configure xmake to build the mlx in debug mode or in release mode (release mode is enabled by default). To do so you can use `xmake config --mode=debug` or `xmake config --mode=release`. + +### 🛠️ Set the toolchain +To change the compilation toolchain using `xmake config --toolchain=[gcc|clang|...]` + +### 🖼️ Image optimisations +If you run into glitches when writing or reading pixels from images you can turn off image optimisations using `xmake config --images_optimized=n`. + +### 🖥️ Force the use of the integrated GPU (not recommended) +You can force the mlx to use your integrated GPU using `xmake config --force_integrated_gpu=y`. Note that there are a lot of chances that your application crashes using that. + +### 💽 Dump the graphics memory +The mlx can dump it's graphics memory use to json files every two seconds by enabling this option `xmake config --graphics_memory_dump=y`. + +### 🪛 A possible build configuration +As a configuration example here's how the command can look like `xmake config --mode=debug --toolchain=clang --graphics_memory_dump=y --images_optimized=n` + +## 🚧 Build the lib + +### Compile using command-line (first method) +Once you're ready to compile the lib, run `xmake` (or `xmake -jX` if you wish not to use all your computer threads, with X being the number of threads you wish to use) and watch as the lib compiles. + +### Generate a project (second method) +xmake can also generate a project file for another tool: +* Visual Studio : `xmake project -k vs` +* CMakeLists.txt (which you can open in CLion and more) : `xmake project -k cmake` +* Makefile : `xmake project -k make` +* Ninja : `xmake project -k ninja` +* XCode : `xmake project -k xcode` + +You should now be able to open the project file with the tool of your choice. + +## 😋 Enjoy +Enjoy you project built with the mlx +

+ drawing +

\ No newline at end of file diff --git a/res/screenshot_test_windows.png b/res/screenshot_test_windows.png new file mode 100644 index 0000000000000000000000000000000000000000..65f5771d72a2d26f678264b649a2583df2431786 GIT binary patch literal 13375 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 literal 0 HcmV?d00001