1# vi: syntax=python:et:ts=4
2import os
3from SCons.Script import *
4from config_check_utils import *
5from os import environ
6from SCons.Util import PrependPath
7
8def CheckSDL(context, sdl_lib = "SDL", require_version = None, header_file = None):
9    if require_version:
10        version = require_version.split(".", 2)
11        major_version = int(version[0])
12        minor_version = int(version[1])
13        try:
14            patchlevel    = int(version[2])
15        except (ValueError, IndexError):
16            patch_level = 0
17
18    if header_file:
19        sdl_header = header_file
20    else:
21        sdl_header = sdl_lib
22
23    backup = backup_env(context.env, ["CPPPATH", "LIBPATH", "LIBS"])
24
25    sdldir = context.env.get("sdldir", "")
26    if sdl_lib == "SDL":
27        if require_version:
28            context.Message("Checking for Simple DirectMedia Layer library version >= %d.%d.%d... " % (major_version, minor_version, patchlevel))
29        else:
30            context.Message("Checking for Simple DirectMedia Layer library... ")
31        if major_version == 2:
32            sdl_config_name = "sdl2-config"
33            sdl_include_dir = "include/SDL2"
34            sdl_lib_name = "SDL2"
35            sdl_lib_name_pkgconfig = "sdl2"
36            sdlmain_name = "SDL2main"
37        else:
38            sdl_config_name = "sdl-config"
39            sdl_include_dir = "include/SDL"
40            sdl_lib_name = "SDL"
41            sdl_lib_name_pkgconfig = "sdl"
42            sdlmain_name = "SDLmain"
43        env = context.env
44        if sdldir:
45            env["ENV"]["PATH"] = PrependPath(environ["PATH"], join(sdldir, "bin"))
46            env["ENV"]["PKG_CONFIG_PATH"] = PrependPath(environ.get("PKG_CONFIG_PATH", ""), join(sdldir, "lib/pkgconfig"))
47        if env["PLATFORM"] != "win32" or sys.platform == "msys":
48            for foo_config in [
49                "pkg-config --cflags --libs $PKG_CONFIG_FLAGS %s" % sdl_lib_name_pkgconfig,
50                "%s --cflags --libs" % sdl_config_name
51                ]:
52                try:
53                    env.ParseConfig(foo_config)
54                except OSError:
55                    pass
56                else:
57                    break
58        else:
59            if sdldir:
60                env.AppendUnique(CPPPATH = [os.path.join(sdldir, sdl_include_dir)], LIBPATH = [os.path.join(sdldir, "lib")])
61            env.AppendUnique(CCFLAGS = ["-D_GNU_SOURCE"])
62            env.AppendUnique(LIBS = Split("mingw32 %s %s" % (sdlmain_name, sdl_lib_name)))
63            env.AppendUnique(LINKFLAGS = ["-mwindows"])
64    else:
65        if require_version:
66            context.Message("Checking for %s library version >= %d.%d.%d... " % (sdl_lib, major_version, minor_version, patchlevel))
67        else:
68            context.Message("Checking for %s library... " % sdl_lib)
69        context.env.AppendUnique(LIBS = [sdl_lib])
70    test_program = """
71        #include <%s.h>
72        \n""" % sdl_header
73    if require_version:
74        test_program += "#if SDL_VERSIONNUM(%s, %s, %s) < SDL_VERSIONNUM(%d, %d, %d)\n#error Library is too old!\n#endif\n" % \
75            (sdl_lib.upper() + "_MAJOR_VERSION", \
76             sdl_lib.upper() + "_MINOR_VERSION", \
77             sdl_lib.upper() + "_PATCHLEVEL", \
78             major_version, minor_version, patchlevel)
79    test_program += """
80        int main(int argc, char** argv)
81        {
82            SDL_Init(0);
83            SDL_Quit();
84        }
85        \n"""
86    if context.TryLink(test_program, ".c"):
87        context.Result("yes")
88        return True
89    else:
90        context.Result("no")
91        restore_env(context.env, backup)
92        return False
93
94def CheckOgg(context):
95    test_program = '''
96#include <stdlib.h>
97#include <stdio.h>
98
99#include <SDL.h>
100#include <SDL_mixer.h>
101
102int main(int argc, char ** argv)
103{
104    if (SDL_Init(SDL_INIT_AUDIO) < 0) {
105        fprintf(stdout, "Cannot initialize SDL Audio: %s\\n", SDL_GetError());
106        return (EXIT_FAILURE);
107    }
108
109    if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024) == -1) {
110        fprintf(stdout, "Cannot initialize SDL Mixer: %s\\n", Mix_GetError());
111        return (EXIT_FAILURE);
112    }
113
114    if (Mix_Init(MIX_INIT_OGG) != MIX_INIT_OGG) {
115        fprintf(stdout, "Cannot initialize OGG codec: %s\\n", Mix_GetError());
116        Mix_CloseAudio();
117        return (EXIT_FAILURE);
118    }
119
120    Mix_Music* music = Mix_LoadMUS("$TESTFILE");
121    if (music == NULL) {
122        fprintf(stdout, "Cannot load music file: %s\\n", Mix_GetError());
123        Mix_CloseAudio();
124        return (EXIT_FAILURE);
125    }
126
127    fprintf(stdout, "Success\\n");
128    Mix_FreeMusic(music);
129    Mix_CloseAudio();
130    return (EXIT_SUCCESS);
131}
132\n
133'''
134    nodepath = File("data/core/music/main_menu.ogg").rfile().abspath.replace("\\", "\\\\")
135    test_program1 = context.env.Clone(TESTFILE = nodepath).subst(test_program)
136    #context.env.AppendUnique(LIBS = "SDL_mixer")
137    context.Message("Checking for Ogg Vorbis support in SDL... ")
138    if context.env["host"]:
139        context.Result("n/a (cross-compile)")
140        return True
141    context.env["ENV"]["SDL_AUDIODRIVER"] = "dummy"
142    (result, output) = context.TryRun(test_program1, ".c")
143    if result:
144        context.Result("yes")
145        return True
146    else:
147        test_program2 = context.env.Clone(TESTFILE = "data/core/music/main_menu.ogg").subst(test_program)
148        (result, output) = context.TryRun(test_program2, ".c")
149        if result:
150            context.Result("yes")
151            return True
152        else:
153            context.Result("no")
154            return False
155
156def CheckPNG(context):
157    test_program = '''
158    #include <SDL_image.h>
159    #include <stdlib.h>
160
161    int main(int argc, char **argv)
162    {
163            SDL_RWops *src;
164            char *testimage = "$TESTFILE";
165
166            src = SDL_RWFromFile(testimage, "rb");
167            if (src == NULL) {
168                    exit(2);
169            }
170            exit(!IMG_isPNG(src));
171    }
172\n
173'''
174    nodepath = File("images/buttons/button_normal/button_H22-pressed.png").rfile().abspath.replace("\\", "\\\\")
175    test_program1 = context.env.Clone(TESTFILE = nodepath).subst(test_program)
176    context.Message("Checking for PNG support in SDL... ")
177    if context.env["host"]:
178        context.Result("n/a (cross-compile)")
179        return True
180    (result, output) = context.TryRun(test_program1, ".c")
181    if result:
182        context.Result("yes")
183        return True
184    else:
185        test_program2 = context.env.Clone(TESTFILE = "images/buttons/button_normal/button_H22-pressed.png").subst(test_program)
186        (result, output) = context.TryRun(test_program2, ".c")
187        if result:
188            context.Result("yes")
189            return True
190        else:
191            context.Result("no")
192            return False
193
194def CheckJPG(context):
195    test_program = '''
196    #include <SDL_image.h>
197    #include <stdlib.h>
198
199    int main(int argc, char **argv)
200    {
201            SDL_RWops *src;
202            char *testimage = "$TESTFILE";
203
204            src = SDL_RWFromFile(testimage, "rb");
205            if (src == NULL) {
206                    exit(2);
207            }
208            exit(!IMG_isJPG(src));
209    }
210\n
211'''
212    nodepath = File("data/core/images/maps/background.jpg").rfile().abspath.replace("\\", "\\\\")
213    test_program1 = context.env.Clone(TESTFILE = nodepath).subst(test_program)
214    context.Message("Checking for JPG support in SDL... ")
215    if context.env["host"]:
216        context.Result("n/a (cross-compile)")
217        return True
218    (result, output) = context.TryRun(test_program1, ".c")
219    if result:
220        context.Result("yes")
221        return True
222    else:
223        test_program2 = context.env.Clone(TESTFILE = "data/core/images/maps/background.jpg").subst(test_program)
224        (result, output) = context.TryRun(test_program2, ".c")
225        if result:
226            context.Result("yes")
227            return True
228        else:
229            context.Result("no")
230            return False
231
232config_checks = { 'CheckSDL' : CheckSDL,
233                  'CheckOgg' : CheckOgg,
234                  'CheckPNG' : CheckPNG,
235                  'CheckJPG' : CheckJPG }
236