Add compile notes for FreeBSD and Solaris, add detailed notes about portability of codebase

This commit is contained in:
UnknownShadow200 2019-03-29 10:15:21 +11:00
parent d92093dc9a
commit c688aa148f
5 changed files with 109 additions and 38 deletions

80
misc/portability.md Normal file
View File

@ -0,0 +1,80 @@
Although most of the code is platform-independent, some per-platform functionality is required.
By default I try to automatically define appropriate backends for your OS in Core.h. Define ```CC_BUILD_MANUAL``` to disable this.
Listed below are the requirements for implementing each platform-dependent file.
You should try to take advantage of existing backends when porting to other platforms.
### Platform
General platform specific functionality.
- Get exe path, start/exit process, open url in browser
- Dynamic library management
- Allocate, free, copy, set memory
- Current system time, stopwatch time
- File I/O, Directory I/O, Socket I/O
- Threading, signalable wait, mutex
- Drawing/measuring native font
- Native font text drawing and measuring
- Encrypt/decrypt data, getting command line args
Define:
- ```CC_BUILD_WIN``` - Use Win32 API (Windows)
- ```CC_BUILD_POSIX``` - Use posix API
posix note: Some functions are not covered. (stopwatch, getting exe path, open url in browser)
These must still be implemented for each operating system
### Window
Create a window, show a dialog window, set window contents, keyboard/mouse input
Also monitor size, clipboard, cursor, raw relative mouse movement (optional)
Define:
- ```CC_BUILD_WINGUI``` - Use Win32 API (Windows)
- ```CC_BUILD_GARBON``` - Use Carbon (OSX)
- ```CC_BUILD_X11``` - Use X11/XLib
- ```CC_BUILD_SDL``` - Use SDL library
If using OpenGL, also OpenGL context creation
Define:
- ```CC_BUILD_WGL``` - Use WGL (Windows OpenGL)
- ```CC_BUILD_GARBON``` - Use AGL (Apple OpenGL)
- ```CC_BUILD_GLX``` - Use glX (X11/XLib)
- ```CC_BUILD_EGL``` - Use EGL (mainly for GLES)
- ```CC_BUILD_SDL``` - Use SDL library
### Logger
Dump registers and backtrace, log unhandled errors (e.g. invalid memory read)
Define:
- ```CC_BUILD_WIN``` - Use Win32 api
- ```CC_BUILD_POSIX``` - Use POSIX api
posix note: Register access is highly dependent on OS and architecture.
(e.g. Linux uses &r.gregs[REG_EAX] while FreeBSD uses &r.mc_eax)
### Audio
Play multiple audio streams with varying sample rates
Define:
- ```CC_BUILD_WIN``` - Use WinMM for audio
- ```CC_BUILD_POSIX``` - Use OpenAL for audio
### 3D Graphics
Texturing, depth buffer, alpha, etc (See Graphics.h for full list)
Define:
- ```CC_BUILD_D3D9``` - Use Direct3D9 for 3D graphics
- ```CC_BUILD_GL``` - Use OpenGL for 3D graphics (1.5/1.2 + ARB_VERTEX_BUFFER_OBJECT)
- ```CC_BUILD_GL11``` - Use OpenGL 1.1 features only
- ```CC_BUILD_GLMODERN``` - Use OpenGL/OpenGLES 2.0 shaders
### Http
HTTP, HTTPS, and cookies (ETag and Last-Modified recommended)
Define:
- ```CC_BUILD_WIN``` - use WinINet as http backend
- ```CC_BUILD_POSIX``` - use libcurl as http backend

View File

@ -1,17 +1,3 @@
### Platform
Although the majority of the code is designed to be platform-independent, some per-platform functionality is required.
Some of the per-platform functionality you'll be required to implement is:
- 3D graphics API (shader support is not required)
- File I/O, Directory I/O, Socket I/O
- Error handling (including unhandled errors/exceptions)
- Application window, keyboard state, mouse state
- Text drawing, fonts
- Threading, signalable wait, mutex
- Stopwatch timer, current system time
- Http and https, getting command line args
- Memory allocation, copying, setting
### Types ### Types
* Integers generally use plain ```int```, floating point numbers use ```float``` or ```double```. * Integers generally use plain ```int```, floating point numbers use ```float``` or ```double```.
* Explicit integer types are also provided in ```Core.h```. * Explicit integer types are also provided in ```Core.h```.

View File

@ -1,4 +1,4 @@
ClassiCube is a custom Minecraft Classic and ClassiCube client written in C that works on Windows, Linux and OSX. ClassiCube is a custom Minecraft Classic and ClassiCube client written in C that works on Windows, OSX, Linux, BSD, and Solaris.
**It is not affiliated with (or supported by) Mojang AB, Minecraft, or Microsoft in any way.** **It is not affiliated with (or supported by) Mojang AB, Minecraft, or Microsoft in any way.**
![screenshot_n](http://i.imgur.com/FCiwl27.png) ![screenshot_n](http://i.imgur.com/FCiwl27.png)
@ -66,24 +66,19 @@ I am assuming you used the installer from http://www.mingw.org/
2. Run *msys.bat* in the *C:\MinGW\msys\1.0* folder. 2. Run *msys.bat* in the *C:\MinGW\msys\1.0* folder.
3. Compile with the same flags as **MinGW-w64**, but also add ```-DUNICODE``` 3. Compile with the same flags as **MinGW-w64**, but also add ```-DUNICODE```
#### Linux #### Linux
Install appropriate libs as required. For ubuntu this means: libx11-dev, libgl1-mesa-dev, libopenal-dev, libcurl4-gnutls-dev or libcurl4-openssl-dev Install appropriate libs as required. For ubuntu these are: libx11-dev, libgl1-mesa-dev, libopenal-dev, libcurl4-gnutls-dev or libcurl4-openssl-dev
Compiling for linux: ```gcc *.c -o ClassiCube -lm -lpthread -lX11 -lGL -lcurl -lopenal -ldl```
```gcc *.c -o ClassiCube -lX11 -lpthread -lGL -lm -lcurl -lopenal -ldl``` ##### Cross compiling for windows:
Cross compiling for windows:
```i586-mingw32msvc-gcc *.c -o ClassiCube.exe -mwindows -lws2_32 -lwininet -lwinmm -limagehlp -lcrypt32 -ld3d9``` ```i586-mingw32msvc-gcc *.c -o ClassiCube.exe -mwindows -lws2_32 -lwininet -lwinmm -limagehlp -lcrypt32 -ld3d9```
Explicitly: #### FreeBSD
```i586-mingw32msvc-gcc *.c -DCC_BUILD_MANUAL -DCC_BUILD_WIN -DCC_BUILD_WINGUI -DCC_BUILD_D3D9 -o ClassiCube.exe -mwindows -lws2_32 -lwininet -lwinmm -limagehlp -lcrypt32 -ld3d9``` ```gcc *.c -o ClassiCube -I /usr/local/include -L /usr/Xlocal/lib -lm -lpthread -lX11 -lGL -lcurl -lopenal -lexecinfo```
```i586-mingw32msvc-gcc *.c -DCC_BUILD_MANUAL -DCC_BUILD_WIN -DCC_BUILD_WINGUI -DCC_BUILD_WGL -o ClassiCube.exe -mwindows -lws2_32 -lwininet -lwinmm -limagehlp -lcrypt32 -lopengl32```
#### OpenBSD #### OpenBSD
@ -93,10 +88,20 @@ Install libexecinfo package if needed.
#### NetBSD #### NetBSD
```gcc *.c -o ClassiCube -I /usr/X11R7/include -I /usr/pkg/include -L /usr/X11R7/lib -L /usr/pkg/lib -lX11 -lGL -lcurl -lopenal -lpthread -lexecinfo``` ```gcc *.c -o ClassiCube -I /usr/X11R7/include -I /usr/pkg/include -L /usr/X11R7/lib -L /usr/pkg/lib -lpthread -lX11 -lGL -lcurl -lopenal -lexecinfo```
#### Solaris
```gcc *.c -o ClassiCube -lm -lsocket -lX11 -lGL -lcurl -lopenal```
NOTE: You have to change entry->d_type == DT_DIR to Directory_Exists(&path) (TODO do this automatically)
#### Other
You'll have to write the necessary code. You should read portability.md in misc folder.
### Documentation ### Documentation
Functions and variables in .h files are mostly documented. Functions and variables in .h files are mostly documented.
General information (e.g. portablity) for the game's source code can be found in the misc folder. Further information (e.g. portablity, style) for the game's source code can be found in the misc folder.

View File

@ -120,8 +120,8 @@ struct MenuOptionsScreen {
char ExtHelp_Buffer[MENUOPTIONS_MAX_DESC * TEXTGROUPWIDGET_LEN]; char ExtHelp_Buffer[MENUOPTIONS_MAX_DESC * TEXTGROUPWIDGET_LEN];
}; };
/* Data for a menu option button */ /* Describes a menu option button */
struct MenuOptionData { struct MenuOptionDesc {
short Dir, Y; short Dir, Y;
const char* Name; const char* Name;
Widget_LeftClick OnClick; Widget_LeftClick OnClick;
@ -2044,7 +2044,7 @@ static bool MenuOptionsScreen_MouseMove(void* screen, int x, int y) {
return true; return true;
} }
static void MenuOptionsScreen_MakeButtons(struct MenuOptionsScreen* s, const struct MenuOptionData* btns, int count) { static void MenuOptionsScreen_MakeButtons(struct MenuOptionsScreen* s, const struct MenuOptionDesc* btns, int count) {
String title; char titleBuffer[STRING_SIZE]; String title; char titleBuffer[STRING_SIZE];
struct ButtonWidget* btn; struct ButtonWidget* btn;
int i; int i;
@ -2234,7 +2234,7 @@ static void ClassicOptionsScreen_ContextRecreated(void* screen) {
const static String title = String_FromConst("Controls..."); const static String title = String_FromConst("Controls...");
struct MenuOptionsScreen* s = screen; struct MenuOptionsScreen* s = screen;
const static struct MenuOptionData buttons[9] = { const static struct MenuOptionDesc buttons[9] = {
{ -1, -150, "Music", MenuOptionsScreen_Bool, { -1, -150, "Music", MenuOptionsScreen_Bool,
ClassicOptionsScreen_GetMusic, ClassicOptionsScreen_SetMusic }, ClassicOptionsScreen_GetMusic, ClassicOptionsScreen_SetMusic },
{ -1, -100, "Invert mouse", MenuOptionsScreen_Bool, { -1, -100, "Invert mouse", MenuOptionsScreen_Bool,
@ -2319,7 +2319,7 @@ static void EnvSettingsScreen_ContextRecreated(void* screen) {
struct MenuOptionsScreen* s = screen; struct MenuOptionsScreen* s = screen;
struct Widget** widgets = s->Widgets; struct Widget** widgets = s->Widgets;
const static struct MenuOptionData buttons[10] = { const static struct MenuOptionDesc buttons[10] = {
{ -1, -150, "Clouds col", MenuOptionsScreen_Input, { -1, -150, "Clouds col", MenuOptionsScreen_Input,
EnvSettingsScreen_GetCloudsCol, EnvSettingsScreen_SetCloudsCol }, EnvSettingsScreen_GetCloudsCol, EnvSettingsScreen_SetCloudsCol },
{ -1, -100, "Sky col", MenuOptionsScreen_Input, { -1, -100, "Sky col", MenuOptionsScreen_Input,
@ -2434,7 +2434,7 @@ static void GraphicsOptionsScreen_ContextRecreated(void* screen) {
struct MenuOptionsScreen* s = screen; struct MenuOptionsScreen* s = screen;
struct Widget** widgets = s->Widgets; struct Widget** widgets = s->Widgets;
const static struct MenuOptionData buttons[6] = { const static struct MenuOptionDesc buttons[6] = {
{ -1, -50, "FPS mode", MenuOptionsScreen_Enum, { -1, -50, "FPS mode", MenuOptionsScreen_Enum,
MenuOptionsScreen_GetFPS, MenuOptionsScreen_SetFPS }, MenuOptionsScreen_GetFPS, MenuOptionsScreen_SetFPS },
{ -1, 0, "View distance", MenuOptionsScreen_Input, { -1, 0, "View distance", MenuOptionsScreen_Input,
@ -2541,7 +2541,7 @@ static void GuiOptionsScreen_ContextRecreated(void* screen) {
struct MenuOptionsScreen* s = screen; struct MenuOptionsScreen* s = screen;
struct Widget** widgets = s->Widgets; struct Widget** widgets = s->Widgets;
const static struct MenuOptionData buttons[10] = { const static struct MenuOptionDesc buttons[10] = {
{ -1, -150, "Black text shadows", MenuOptionsScreen_Bool, { -1, -150, "Black text shadows", MenuOptionsScreen_Bool,
GuiOptionsScreen_GetShadows, GuiOptionsScreen_SetShadows }, GuiOptionsScreen_GetShadows, GuiOptionsScreen_SetShadows },
{ -1, -100, "Show FPS", MenuOptionsScreen_Bool, { -1, -100, "Show FPS", MenuOptionsScreen_Bool,
@ -2691,7 +2691,7 @@ static void HacksSettingsScreen_ContextRecreated(void* screen) {
struct Widget** widgets = s->Widgets; struct Widget** widgets = s->Widgets;
Event_RegisterVoid(&UserEvents.HackPermissionsChanged, s, HacksSettingsScreen_CheckHacksAllowed); Event_RegisterVoid(&UserEvents.HackPermissionsChanged, s, HacksSettingsScreen_CheckHacksAllowed);
const static struct MenuOptionData buttons[10] = { const static struct MenuOptionDesc buttons[10] = {
{ -1, -150, "Hacks enabled", MenuOptionsScreen_Bool, { -1, -150, "Hacks enabled", MenuOptionsScreen_Bool,
HacksSettingsScreen_GetHacks, HacksSettingsScreen_SetHacks }, HacksSettingsScreen_GetHacks, HacksSettingsScreen_SetHacks },
{ -1, -100, "Speed multiplier", MenuOptionsScreen_Input, { -1, -100, "Speed multiplier", MenuOptionsScreen_Input,
@ -2793,7 +2793,7 @@ static void MiscOptionsScreen_ContextRecreated(void* screen) {
struct MenuOptionsScreen* s = screen; struct MenuOptionsScreen* s = screen;
struct Widget** widgets = s->Widgets; struct Widget** widgets = s->Widgets;
const static struct MenuOptionData buttons[8] = { const static struct MenuOptionDesc buttons[8] = {
{ -1, -100, "Reach distance", MenuOptionsScreen_Input, { -1, -100, "Reach distance", MenuOptionsScreen_Input,
MiscOptionsScreen_GetReach, MiscOptionsScreen_SetReach }, MiscOptionsScreen_GetReach, MiscOptionsScreen_SetReach },
{ -1, -50, "Music volume", MenuOptionsScreen_Input, { -1, -50, "Music volume", MenuOptionsScreen_Input,
@ -2881,7 +2881,7 @@ static void NostalgiaScreen_ContextRecreated(void* screen) {
struct MenuOptionsScreen* s = screen; struct MenuOptionsScreen* s = screen;
static struct TextWidget desc; static struct TextWidget desc;
const static struct MenuOptionData buttons[8] = { const static struct MenuOptionDesc buttons[8] = {
{ -1, -150, "Classic hand model", MenuOptionsScreen_Bool, { -1, -150, "Classic hand model", MenuOptionsScreen_Bool,
NostalgiaScreen_GetHand, NostalgiaScreen_SetHand }, NostalgiaScreen_GetHand, NostalgiaScreen_SetHand },
{ -1, -100, "Classic walk anim", MenuOptionsScreen_Bool, { -1, -100, "Classic walk anim", MenuOptionsScreen_Bool,

View File

@ -697,7 +697,7 @@ void Mutex_Free(void* handle) { }
void Mutex_Lock(void* handle) { } void Mutex_Lock(void* handle) { }
void Mutex_Unlock(void* handle) { } void Mutex_Unlock(void* handle) { }
void* Waitable_Create(void) { eeturn NULL; } void* Waitable_Create(void) { return NULL; }
void Waitable_Free(void* handle) { } void Waitable_Free(void* handle) { }
void Waitable_Signal(void* handle) { } void Waitable_Signal(void* handle) { }
void Waitable_Wait(void* handle) { } void Waitable_Wait(void* handle) { }