|
| 1 | +# REDRIVER2 — Build para macOS Apple Silicon |
| 2 | + |
| 3 | +Port de build do REDRIVER2 para macOS arm64 (Apple Silicon — M1/M2/M3/M4). |
| 4 | +Também funciona em macs Intel (x86_64) com pequenas adaptações automáticas. |
| 5 | + |
| 6 | +## Pré-requisitos |
| 7 | + |
| 8 | +1. **Xcode Command Line Tools** |
| 9 | + |
| 10 | + ```bash |
| 11 | + xcode-select --install |
| 12 | + ``` |
| 13 | + |
| 14 | +2. **Homebrew** — https://brew.sh |
| 15 | + |
| 16 | +3. **Dependências via Homebrew** |
| 17 | + |
| 18 | + ```bash |
| 19 | + brew install premake sdl2 jpeg openal-soft |
| 20 | + ``` |
| 21 | + |
| 22 | + No Apple Silicon, o brew instala em `/opt/homebrew`. Em macs Intel, |
| 23 | + o caminho é `/usr/local`. O `premake5.lua` detecta automaticamente. |
| 24 | + |
| 25 | +## Build |
| 26 | + |
| 27 | +```bash |
| 28 | +git clone https://github.com/OpenDriver2/REDRIVER2.git |
| 29 | +cd REDRIVER2 |
| 30 | +git submodule update --init --recursive |
| 31 | +cd src_rebuild |
| 32 | + |
| 33 | +# Gerar Makefiles |
| 34 | +premake5 gmake |
| 35 | + |
| 36 | +cd project_gmake_macosx |
| 37 | + |
| 38 | +# Apple Silicon (arm64) |
| 39 | +make config=release_arm64 -j$(sysctl -n hw.ncpu) |
| 40 | + |
| 41 | +# Intel (x86_64) |
| 42 | +make config=release_x64 -j$(sysctl -n hw.ncpu) |
| 43 | +``` |
| 44 | + |
| 45 | +Configurações disponíveis: `debug_arm64`, `release_arm64`, `release_dev_arm64` |
| 46 | +(e equivalentes para `x64`). |
| 47 | + |
| 48 | +Binário final: `src_rebuild/bin/Release/REDRIVER2`. |
| 49 | + |
| 50 | +## Rodando o jogo |
| 51 | + |
| 52 | +O REDRIVER2 precisa dos arquivos de dados originais do Driver 2 (PSX) ao |
| 53 | +lado do executável. Veja o |
| 54 | +[wiki de instalação](https://github.com/OpenDriver2/REDRIVER2/wiki/Installation-instructions) |
| 55 | +para instruções de extração dos assets. |
| 56 | + |
| 57 | +## Variáveis de ambiente opcionais |
| 58 | + |
| 59 | +Caso queira apontar para instalações não-Homebrew das dependências: |
| 60 | + |
| 61 | +```bash |
| 62 | +export MAC_SDL2_DIR=/caminho/sdl2 |
| 63 | +export MAC_OPENAL_DIR=/caminho/openal-soft |
| 64 | +export MAC_JPEG_DIR=/caminho/jpeg |
| 65 | +``` |
| 66 | + |
| 67 | +## Modificações feitas para macOS arm64 |
| 68 | + |
| 69 | +Resumo das mudanças em relação ao upstream: |
| 70 | + |
| 71 | +### Build system |
| 72 | +- `src_rebuild/premake5.lua` — filtro `system:macosx` com platforms |
| 73 | + `x64` e `arm64`, includes/libdirs do Homebrew, links de |
| 74 | + `OpenGL.framework`/`Cocoa.framework`/`SDL2`/`openal`/`jpeg`, |
| 75 | + rpath para os dylibs do brew. Substituiu o módulo `usage` (incompatível |
| 76 | + com premake5 ≥ beta8) por `dependson`+`links`+`includedirs`. |
| 77 | +- `src_rebuild/premake5_psycross.lua` — filtro `system:macosx` análogo. |
| 78 | +- `src_rebuild/premake_modules/usage/usage.lua` — guard para evitar |
| 79 | + conflito com a API `uses` agora nativa do premake5. |
| 80 | + |
| 81 | +### Portabilidade arm64 / 64-bit |
| 82 | +- `src_rebuild/Game/driver2.h` — `trap()` agora usa `__builtin_trap()` |
| 83 | + no lugar de `__asm__("int3")` (x86-only). |
| 84 | +- `src_rebuild/PsyCross/include/psx/libgpu.h` — `P_LEN = 3` também para |
| 85 | + `__aarch64__`/`__arm64__`/`_M_ARM64`, igualando a configuração de 64-bit. |
| 86 | +- `src_rebuild/PsyCross/include/psx/types.h` — em LP64 (macOS arm64/x64, |
| 87 | + Linux x64), `u_long` e `ulong` viram `uint32_t` para preservar a |
| 88 | + semântica de 32-bit do PSX. Pré-define guards `_U_LONG`/`_U_INT`/ |
| 89 | + `_U_CHAR`/`_U_SHORT` no macOS para impedir o `<sys/types.h>` do sistema |
| 90 | + de redefinir esses tipos como 64-bit. |
| 91 | +- `premake5.lua` adiciona `-include` forçado de `psx/types.h` no filtro |
| 92 | + macOS para garantir que esses guards sejam setados antes de qualquer |
| 93 | + header do sistema. |
| 94 | + |
| 95 | +### Headers macOS-específicos |
| 96 | +- Substituído `<malloc.h>` (não existe no macOS) por `<stdlib.h>` |
| 97 | + com guard em: |
| 98 | + - `src_rebuild/PsyCross/src/psx/LIBCD.C` |
| 99 | + - `src_rebuild/utils/fs.cpp` |
| 100 | + - `src_rebuild/utils/audio_source/snd_wav_cache.cpp` |
| 101 | + - `src_rebuild/utils/targa.cpp` |
| 102 | + - `src_rebuild/Game/dr2locale.c` |
| 103 | + - `src_rebuild/tools/font_tool/font_tool_main.cpp` |
| 104 | +- `LIBCD.C` e `utils/fs.{cpp,h}` — guards `__unix__` ampliados para |
| 105 | + incluir `__APPLE__` (macOS não define `__unix__`). |
| 106 | + |
| 107 | +### Casts pointer→int em LP64 |
| 108 | +Pointers são 64-bit em arm64/x86_64; `(int)ptr` perde informação e |
| 109 | +o clang trata como erro. Usado `(int)(intptr_t)ptr` ou `(u_intptr)ptr` |
| 110 | +em: |
| 111 | +- `src_rebuild/Game/dr2locale.h` — macros `GET_GAME_TXT`/`GET_MISSION_TXT` |
| 112 | +- `src_rebuild/Game/C/civ_ai.c` — `Random2((int)straight)` |
| 113 | +- `src_rebuild/Game/C/dr2roads.c` — `(int)plane & 3` |
| 114 | +- `src_rebuild/Game/C/draw.c` — checagens de `primtab`/`primptr` |
| 115 | +- `src_rebuild/Game/C/event.c` — `FIXEDH((int)ev->node * RSIN(...))` |
| 116 | +- `src_rebuild/Game/C/glaunch.c` — `(int)param` em vários callbacks |
| 117 | +- `src_rebuild/Game/C/mission.c` — `(u_int)((char*)...)` |
| 118 | + |
| 119 | +### C++ stricter checks |
| 120 | +- `src_rebuild/PsyCross/src/psx/LIBETC.C` — cast de pointer para int via |
| 121 | + `intptr_t` (`ResetCallback`/`VSyncCallback`). |
| 122 | +- `src_rebuild/PsyCross/src/psx/LIBGPU.C` — cast explícito `(DR_TPAGE*)opri`. |
| 123 | +- `src_rebuild/PsyCross/src/psx/LIBSPU.C` — include de `psx/libetc.h` |
| 124 | + para `ResetCallback()`. |
| 125 | + |
| 126 | +### Função GTE faltante |
| 127 | +- `src_rebuild/Game/C/targets.c:327` — `RotTransPers()` é declarado mas |
| 128 | + não definido no PsyCross. Substituído pela macro `gte_RotTransPers()` |
| 129 | + com a quinta saída (`otz`) capturada localmente. |
| 130 | + |
| 131 | +## Status |
| 132 | + |
| 133 | +- ✅ Build limpo em arm64 (Apple Silicon) |
| 134 | +- ✅ Binário Mach-O 64-bit nativo (`file` confirma `arm64`) |
| 135 | +- ⚠️ OpenGL no macOS está oficialmente *deprecated* desde 10.14 mas o |
| 136 | + driver legacy ainda funciona até OpenGL 4.1. O PsyCross usa GL 2.x, |
| 137 | + então roda. Para uma migração futura, considerar Metal/MoltenVK. |
| 138 | +- ⚠️ Não foi rodado um playtest completo — o jogo precisa dos assets |
| 139 | + originais do Driver 2 para inicializar. |
0 commit comments