wesnoth/scons/sdl.py
loonycyborg 8ff65117c5 scons: don't let pkg-config to add prefix on msys2
This is workaround for windows style path confusing scons if they appear
in CPPATH etc. Paths without prefix still happen to be valid and they
start with "/", not "c:".
2018-06-01 22:45:45 +03:00

235 lines
7.9 KiB
Python

# vi: syntax=python:et:ts=4
import os
from SCons.Script import *
from config_check_utils import *
from os import environ
from SCons.Util import PrependPath
def CheckSDL(context, sdl_lib = "SDL", require_version = None, header_file = None):
if require_version:
version = require_version.split(".", 2)
major_version = int(version[0])
minor_version = int(version[1])
try:
patchlevel = int(version[2])
except (ValueError, IndexError):
patch_level = 0
if header_file:
sdl_header = header_file
else:
sdl_header = sdl_lib
backup = backup_env(context.env, ["CPPPATH", "LIBPATH", "LIBS"])
sdldir = context.env.get("sdldir", "")
if sdl_lib == "SDL":
if require_version:
context.Message("Checking for Simple DirectMedia Layer library version >= %d.%d.%d... " % (major_version, minor_version, patchlevel))
else:
context.Message("Checking for Simple DirectMedia Layer library... ")
if major_version == 2:
sdl_config_name = "sdl2-config"
sdl_include_dir = "include/SDL2"
sdl_lib_name = "SDL2"
sdl_lib_name_pkgconfig = "sdl2"
sdlmain_name = "SDL2main"
else:
sdl_config_name = "sdl-config"
sdl_include_dir = "include/SDL"
sdl_lib_name = "SDL"
sdl_lib_name_pkgconfig = "sdl"
sdlmain_name = "SDLmain"
env = context.env
if sdldir:
env["ENV"]["PATH"] = PrependPath(environ["PATH"], join(sdldir, "bin"))
env["ENV"]["PKG_CONFIG_PATH"] = PrependPath(environ.get("PKG_CONFIG_PATH", ""), join(sdldir, "lib/pkgconfig"))
if env["PLATFORM"] != "win32" or sys.platform == "msys":
for foo_config in [
"pkg-config --cflags --libs $PKG_CONFIG_FLAGS %s" % sdl_lib_name_pkgconfig,
"%s --cflags --libs" % sdl_config_name
]:
try:
env.ParseConfig(foo_config)
except OSError:
pass
else:
break
else:
if sdldir:
env.AppendUnique(CPPPATH = [os.path.join(sdldir, sdl_include_dir)], LIBPATH = [os.path.join(sdldir, "lib")])
env.AppendUnique(CCFLAGS = ["-D_GNU_SOURCE"])
env.AppendUnique(LIBS = Split("mingw32 %s %s" % (sdlmain_name, sdl_lib_name)))
env.AppendUnique(LINKFLAGS = ["-mwindows"])
else:
if require_version:
context.Message("Checking for %s library version >= %d.%d.%d... " % (sdl_lib, major_version, minor_version, patchlevel))
else:
context.Message("Checking for %s library... " % sdl_lib)
context.env.AppendUnique(LIBS = [sdl_lib])
test_program = """
#include <%s.h>
\n""" % sdl_header
if require_version:
test_program += "#if SDL_VERSIONNUM(%s, %s, %s) < SDL_VERSIONNUM(%d, %d, %d)\n#error Library is too old!\n#endif\n" % \
(sdl_lib.upper() + "_MAJOR_VERSION", \
sdl_lib.upper() + "_MINOR_VERSION", \
sdl_lib.upper() + "_PATCHLEVEL", \
major_version, minor_version, patchlevel)
test_program += """
int main(int argc, char** argv)
{
SDL_Init(0);
SDL_Quit();
}
\n"""
if context.TryLink(test_program, ".c"):
context.Result("yes")
return True
else:
context.Result("no")
restore_env(context.env, backup)
return False
def CheckOgg(context):
test_program = '''
#include <stdlib.h>
#include <stdio.h>
#include <SDL.h>
#include <SDL_mixer.h>
int main(int argc, char ** argv)
{
if (SDL_Init(SDL_INIT_AUDIO) < 0) {
fprintf(stdout, "Cannot initialize SDL Audio: %s\\n", SDL_GetError());
return (EXIT_FAILURE);
}
if (Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024) == -1) {
fprintf(stdout, "Cannot initialize SDL Mixer: %s\\n", Mix_GetError());
return (EXIT_FAILURE);
}
if (Mix_Init(MIX_INIT_OGG) != MIX_INIT_OGG) {
fprintf(stdout, "Cannot initialize OGG codec: %s\\n", Mix_GetError());
Mix_CloseAudio();
return (EXIT_FAILURE);
}
Mix_Music* music = Mix_LoadMUS("$TESTFILE");
if (music == NULL) {
fprintf(stdout, "Cannot load music file: %s\\n", Mix_GetError());
Mix_CloseAudio();
return (EXIT_FAILURE);
}
fprintf(stdout, "Success\\n");
Mix_FreeMusic(music);
Mix_CloseAudio();
return (EXIT_SUCCESS);
}
\n
'''
nodepath = File("data/core/music/main_menu.ogg").rfile().abspath.replace("\\", "\\\\")
test_program1 = context.env.Clone(TESTFILE = nodepath).subst(test_program)
#context.env.AppendUnique(LIBS = "SDL_mixer")
context.Message("Checking for Ogg Vorbis support in SDL... ")
if context.env["host"]:
context.Result("n/a (cross-compile)")
return True
context.env["ENV"]["SDL_AUDIODRIVER"] = "dummy"
(result, output) = context.TryRun(test_program1, ".c")
if result:
context.Result("yes")
return True
else:
test_program2 = context.env.Clone(TESTFILE = "data/core/music/main_menu.ogg").subst(test_program)
(result, output) = context.TryRun(test_program2, ".c")
if result:
context.Result("yes")
return True
else:
context.Result("no")
return False
def CheckPNG(context):
test_program = '''
#include <SDL_image.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
SDL_RWops *src;
char *testimage = "$TESTFILE";
src = SDL_RWFromFile(testimage, "rb");
if (src == NULL) {
exit(2);
}
exit(!IMG_isPNG(src));
}
\n
'''
nodepath = File("images/buttons/button_normal/button_H22-pressed.png").rfile().abspath.replace("\\", "\\\\")
test_program1 = context.env.Clone(TESTFILE = nodepath).subst(test_program)
context.Message("Checking for PNG support in SDL... ")
if context.env["host"]:
context.Result("n/a (cross-compile)")
return True
(result, output) = context.TryRun(test_program1, ".c")
if result:
context.Result("yes")
return True
else:
test_program2 = context.env.Clone(TESTFILE = "images/buttons/button_normal/button_H22-pressed.png").subst(test_program)
(result, output) = context.TryRun(test_program2, ".c")
if result:
context.Result("yes")
return True
else:
context.Result("no")
return False
def CheckJPG(context):
test_program = '''
#include <SDL_image.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
SDL_RWops *src;
char *testimage = "$TESTFILE";
src = SDL_RWFromFile(testimage, "rb");
if (src == NULL) {
exit(2);
}
exit(!IMG_isJPG(src));
}
\n
'''
nodepath = File("data/core/images/maps/background.jpg").rfile().abspath.replace("\\", "\\\\")
test_program1 = context.env.Clone(TESTFILE = nodepath).subst(test_program)
context.Message("Checking for JPG support in SDL... ")
if context.env["host"]:
context.Result("n/a (cross-compile)")
return True
(result, output) = context.TryRun(test_program1, ".c")
if result:
context.Result("yes")
return True
else:
test_program2 = context.env.Clone(TESTFILE = "data/core/images/maps/background.jpg").subst(test_program)
(result, output) = context.TryRun(test_program2, ".c")
if result:
context.Result("yes")
return True
else:
context.Result("no")
return False
config_checks = { 'CheckSDL' : CheckSDL,
'CheckOgg' : CheckOgg,
'CheckPNG' : CheckPNG,
'CheckJPG' : CheckJPG }