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