Sign in Join
Wiki copytemporary

FPC and SDL: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11**Simple DirectMedia Layer** or **SDL** is a cross-platform development library designed to provide low-level access to audio, keyboard, mouse, joystick, and graphics hardware via OpenGL and Direct3D. It is used by video playback software, emulators and popular games.
22
33## Introduction
44
55For general information and documentation about SDL, visit the [Official SDL Website](https://www.libsdl.org/index.php). This page is going to explain how to use SDL with Free Pascal and where to obtain the Pascal headers, etc. More information is available at the [LibSDL Wiki](https://wiki.libsdl.org/SDL2/FrontPage).
66
77## Obtaining FPC headers for SDL2
88
99After installing the SDL library itself on your system, you'll need the Pascal headers for it to be able to use SDL with FPC. Since version 2.2.2, most SDL units are included with FPC. You can, of course, also download them from SDL2-for-Pascal, in case you need some bug fix or a unit that's not in the version shipped with FPC.
1010
1111### SDL2-for-Pascal
1212
1313  **See:** [The SDL2-for-Pascal GitHub Repository](https://github.com/PascalGameDevelopment/SDL2-for-Pascal).
1414
1515You can download the latest release from the [Releases page](https://github.com/PascalGameDevelopment/SDL2-for-Pascal/releases).
1616
1717You can also download and browse the current source code using Git, see [GitHub's "About Remote Repositories" page](https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories) for instructions. In short, just do:
1818
1919```shell
2020git clone https://github.com/PascalGameDevelopment/SDL2-for-Pascal.git
2121```
2222
2323After you download the SDL2-for-Pascal sources, you want to be able to use these units in your programs. For the simplest scenario, just add the following lines to your `fpc.cfg` file:
2424
2525```shell
2626-Fi<jedi-sdl-path>/units/sdl2.pas
2727-Fu<jedi-sdl-path>/units/sdl2.pas
2828-Fu<jedi-sdl-path>/units/sdl2_gfx.pas
2929-Fu<jedi-sdl-path>/units/sdl2_image.pas
3030-Fu<jedi-sdl-path>/units/sdl2_mixer.pas
3131-Fu<jedi-sdl-path>/units/sdl2_net.pas
3232-Fu<jedi-sdl-path>/units/sdl2_ttf.pas
3333```
3434
3535…where `<jedi-sdl-path>` is the path where you placed the SDL2-for-Pascal sources.
3636
3737Alternatively, you can copy all `*.pas` and `*.inc` files from these directories to one chosen directory, and add only this chosen directory to your `fpc.cfg`.
3838
3939### SDL headers from Free Pascal SVN (deprecated)
4040
4141The code can be downloaded with: \<syntaxhighlight lang="shell\> svn co <http://svn.freepascal.org/svn/fpcprojects/contrib/sdl/> fpc-sdl
4242
43-</syntaxhighlight>
44-
4543## Tips and tricks
4644
4745### SDL_mixer library
4846
4947When using SDL_mixer, the call to Mix_OpenAudio MUST happen before the call to SDL_SetVideoMode, otherwise you will get a (sometimes loud) audible pop.
5048
5149### SMPEG Library
5250
5351If you use sdl2_mixer, you'll notice that it's dependent on the [SMPEG Library](https://github.com/icculus/smpeg). For modern Linux distributions this is not a problem, because smpeg is distributed with many of them, but it can be more troublesome for FreeBSD and Windows:
5452
5553- You can install smpeg for FreeBSD from ports: `/usr/ports/multimedia/smpeg`.
5654- You can get smpeg.dll for Windows from [SMPEG for Visual C sources](https://github.com/icculus/smpeg/blob/main/VisualC.zip).
5755
5856Alternatively, you can simply modify the source of SDL_mixer.pas to remove smpeg from it's uses clause and comment out one line in the sources mentioning mp3s (it's a case near the end). Remember that you will also need to have an `sdl2_mixer.dll`/`sdl2_mixer.so` that is *not* linked to smpeg—otherwise the sdl2_mixer library will depend on smpeg anyway.
5957
6058## macOS specific issues
6159
6260### SDL Framework and SDL libraries
6361
6462On macOS, SDL2 uses Cocoa to setup the drawing window and to handle all events (such as keypresses). This is done using a small piece of code that is automatically called when the program starts up, and which subsequently calls a function with the name *SDLmain*.
6563
6664There are however two different ways to package/distribute SDL for macOS, and depending on which version you use, the procedure to get this startup code into your program is slightly different.
6765
6866### The framework version
6967
7068This the version that you get when you download the macOS version of SDL from [libsdl.org](https://libsdl.org/). In this case, the startup code is only available in source form. It is located on the installation disk image, in the folder `devel-lite`. After copying the `SDL.framework` from the disk image to `/Library/Frameworks` and copying the `devel-lite` folder anywhere on your hard drive (e.g., in your home directory), you can compile it into libSDLMain.a by opening a Terminal session, navigating to the copied `devel-lite` folder, and executing the following commands:
7169
7270```shell
7371gcc -c -o SDLMain.o SDLMain.m -I/Library/Frameworks/SDL.framework/Headers
7472ar r libSDLMain.a SDLMain.o
7573ranlib libSDLMain.a
7674```
7775
7876You can then move the generated `libSDLMain.a` library anywhere you want. To make sure the linker can find it when you compile SDL applications, pass the `-Fl``/full/path/to/folder/containing/libSDLMain.a` command line parameter to the compiler.
7977
8078### The Unix library version
8179
8280There is also a "classic Unix" version of SDL for macOS (no framework, just a bunch of separate libraries), which you get if you compile SDL from sources, or if you install SDL using Fink or MacPorts. In this case, `libSDLmain.a` is already included in a compiled form. You just have to use the compiler's `-Fl` parameter, as explained in the previous section, to make sure that the linker can find this library.
8381
8482## For FPC 2.2.2 and later
8583
8684The SDL unit included with FPC includes all necessary framework, library and main procedure name renaming statements, so you no longer have to do anything special. Just add the sdl unit to your program and everything will be taken care of. However, the remarks about libSDLMain in the above section still hold (libSDLMain.a is required by the SDL unit included with FPC).
8785
8886Note that if you use the original units as distributed by the JEDI team, you may still need to follow the instructions in the section below.
8987
9088## For FPC 2.0.2–2.2.0
9189
9290With FPC v2.0.2 to v2.2.0, and possibly also when using the original SDL units as distributed by the JEDI team, you have to use the `-XMSDL_main` command line option and tell the linker to include some frameworks:
9391
94921. Install sdl, for example using fink.
95932. Add the following to your program:
9694 *
9795
9896{\$linklib gcc} {\$linklib SDLmain} uses sdl;
9997
100-</syntaxhighlight>
101-
102981. Then, this command line does it:
10399 *
104100
105101fpc -XMSDL_main -k-L/sw/lib -k-lSDL -k-framework -kOpenGL -k-framework -kCocoa -Fu\<pathtosdl.pas files\> -Fi\<pathtosdl.inc files\> YourProgram.pas
106-
107-</syntaxhighlight>
108102
109103If you installed the SDL libraries using fink, also add `-k-L/sw/lib -k-lSDL` to your fpc command.
110104
111105If `sdl.pas` and `jedi-sdl.inc` are in the directory of your program, you can omit `-Fu<pathtosdl.pas files> -Fi<pathtosdl.inc files>`.
112106
113107## Examples
114108
115109Creating an empty SDL window:
116110
117111``` pascal
118112program sdltest;
119113{$linklib gcc}
120114{$linklib SDLmain}
121115uses sdl;
122116var
123117 scr: PSDL_Surface; // Our main screen
124118begin
125119 SDL_Init(SDL_INIT_VIDEO); // Initialize the video SDL subsystem
126120 scr := SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE); // Create a software window of 640x480x8 and assign to scr
127121 SDL_Quit; // close the subsystems and SDL
128122end.
129123```
130124
131125You can then compile this code with: `fpc -Fu<pathtosdl.pas files> -Fi<pathtosdl.inc files> example.pas`
132126
133127If you use Lazarus, make sure you fill in the "other unit files" and "include files" properly.
134128
135129## Ubuntu
136130
137131With Ubuntu, you can install the following, which saves you having to manually install the SDK packages… `sudo apt install libsdl1.2-dev` …and possibly also… `sudo apt install libsdl2-dev`
138132
139133FPC knows SDL from home.
140134
141135## SDL2 Units
142136
143137### Tutorials
144138
145139See the [Free Pascal meets SDL](https://www.freepascal-meets-sdl.net/sdl-tutorials/) website for tutorials on using Free Pascal and SDL.
146140
147141---
148142*From the Free Pascal wiki, page "FPC and SDL", as it stood on 2023-09-21 after a change by RogueScholar, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
149143Category: Audio
150144Category: FPC
151145Category: Headers and Bindings
152146Category: Multimedia
153147Category: Tutorials
154148Category: Video

Back to history