import os.path Alias("libstem") Alias("unittests") SOURCES = { "3dmath/Frustum.c": ["platform:all", "target:libstem", "target:unittest"], "3dmath/Matrix.c": ["platform:all", "target:libstem", "target:unittest"], "3dmath/Quaternion.c": ["platform:all", "target:libstem", "target:unittest"], "3dmath/Vector.c": ["platform:all", "target:libstem", "target:unittest"], "bones/BoneAnimationList.c": ["platform:all", "target:libstem"], "bones/BoneAnimationSequence.c": ["platform:all", "target:libstem"], "bones/BoneAnimationState.c": ["platform:all", "target:libstem"], "bones/BoneAnimationStateController.c": ["platform:all", "target:libstem"], "bones/Skeleton.c": ["platform:all", "target:libstem"], "graphics/Camera.c": ["platform:all", "target:libstem"], "graphics/FontTexture.c": ["platform:all", "target:libstem"], "graphics/Image.c": ["platform:all", "target:libstem", "target:unittest"], "graphics/TextDisplay.c": ["platform:all", "target:libstem"], "graphics/Texture.c": ["platform:all", "target:libstem"], "graphics/TextureManager.c": ["platform:all", "target:libstem"], "shell/GLUTShell.c": ["platform:macosx", "platform:win32", "platform:linux", "shell:glut"], "shell/StubShell.c": ["platform:all", "shell:stub", "target:unittest"], "unittest/unittest_main.c": ["platform:all", "target:unittest"], "unittest/StandardTestList.c": ["platform:all", "target:unittest"], "unittest/tests/3dmath/FrustumTests.c": ["platform:all", "target:unittest"], "unittest/tests/3dmath/QuaternionTests.c": ["platform:all", "target:unittest"], "unittest/tests/graphics/ImageTests.c": ["platform:all", "target:unittest"], "unittest/tests/utilities/JSONParserTests.c": ["platform:all", "target:unittest"], "unittest/tests/utilities/UTFUtilitiesTests.c": ["platform:all", "target:unittest"], "utilities/Atom.c": ["platform:all", "target:libstem"], "utilities/AutoFreePool.c": ["platform:all", "target:libstem", "target:unittest"], "utilities/EngineSerializationUtilities.c": ["platform:all", "target:libstem"], "utilities/EventDispatcher.c": ["platform:all", "target:libstem"], "utilities/FixedIntervalRunLoop.c": ["platform:all", "target:libstem"], "utilities/GLUtilities.c": ["platform:all", "target:libstem"], "utilities/IOUtilities.c": ["platform:all", "target:libstem", "target:unittest"], "utilities/JSONParser.c": ["platform:all", "target:libstem", "target:unittest"], "utilities/UTFUtilities.c": ["platform:all", "target:libstem", "target:unittest"] } SHELLS = [ "glut", "stub" ] def determine_platform(env): platform = None if "platform" in ARGUMENTS: platform = ARGUMENTS["platform"] else: if env["PLATFORM"] == "darwin": platform = "macosx" elif env["PLATFORM"] == "win32": platform = "win32" elif env["PLATFORM"] == "posix": platform = "linux" return platform def macosx_env(env, arch, gcc_version, sdk_version, version_min): return env.Clone( CC = "/usr/bin/gcc-%s" % gcc_version, CCFLAGS = "-isysroot /Developer/SDKs/MacOSX%s.sdk " % sdk_version + "-g -arch %s " % arch + "-Wall -Wextra -Wno-unused-parameter -Wno-unused-function -Werror " + "-I source -I include/macosx/libjpeg -I include/macosx/libpng", LINKFLAGS = "-isysroot /Developer/SDKs/MacOSX%s.sdk " % sdk_version + "-mmacosx-version-min=%s " % version_min + "-arch %s " % arch + "libs/macosx/universal/libpng.a libs/macosx/universal/libjpeg.a -lz", INTERMEDIATE_PREFIX = "%s/%s" % (env["INTERMEDIATE_PREFIX"], arch), OUTPUT_PREFIX = "%s/%s" % (env["OUTPUT_PREFIX"], arch) ) def iphonesimulator_env(env): return env.Clone( CC = "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc", CCFLAGS = "-isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk " + "-g -arch i386 " + "-Wall -Wextra -Wno-unused-parameter -Wno-unused-function -Werror " + "-I source -I include/iphonesimulator/libjpeg -I include/iphonesimulator/libpng", LINKFLAGS = "-isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk " + "-mmacosx-version-min=10.5 " + "-g -arch i386 " + "libs/iphonesimulator/i386/libpng.a libs/iphonesimulator/i386/libjpeg.a -lz", INTERMEDIATE_PREFIX = "%s/i386" % env["INTERMEDIATE_PREFIX"], OUTPUT_PREFIX = "%s" % env["OUTPUT_PREFIX"] ) def iphoneos_env(env, arch): return env.Clone( CC = "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc", CCFLAGS = "-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk " + "-g -arch %s " % arch + "-Wall -Wextra -Wno-unused-parameter -Wno-unused-function -Werror " + "-I source -I include/iphoneos/libjpeg -I include/iphoneos/libpng", LINKFLAGS = "-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk " + "-arch %s " % arch + "libs/iphoneos/%s/libpng.a libs/iphoneos/%s/libjpeg.a -lz" % (arch, arch), INTERMEDIATE_PREFIX = "%s/%s" % (env["INTERMEDIATE_PREFIX"], arch), OUTPUT_PREFIX = "%s/%s" % (env["OUTPUT_PREFIX"], arch) ) def linux_env(env): return env.Clone( CC = "/usr/bin/gcc", CCFLAGS = "-g -std=gnu99 " + "-Wall -Wextra -Wno-unused-parameter -Wno-unused-function -Werror " + "-I source -I include/linux/libjpeg -I include/linux/libpng", LINKFLAGS = "libs/linux/libpng.a libs/linux/libjpeg.a -lz -lm", LINKCOM = "$CC -o $TARGET $SOURCES $LINKFLAGS" ) def arch_env_list(platform_env): envs = [] if platform_env["TARGET_PLATFORM"] == "macosx": envs.append(macosx_env(platform_env, "ppc", "4.2", "10.5", "10.5")) envs.append(macosx_env(platform_env, "i386", "4.2", "10.5", "10.5")) envs.append(macosx_env(platform_env, "x86_64", "4.2", "10.5", "10.5")) elif platform_env["TARGET_PLATFORM"] == "iphonesimulator": envs.append(iphonesimulator_env(platform_env)) elif platform_env["TARGET_PLATFORM"] == "iphoneos": envs.append(iphoneos_env(platform_env, "armv6")) envs.append(iphoneos_env(platform_env, "armv7")) elif platform_env["TARGET_PLATFORM"] == "linux": envs.append(linux_env(platform_env)) return envs def sources_with_tags(env, sources, tags): result = [] for source in sources: tag_missing = False for tag in tags: if not tag in sources[source]: tag_missing = True break if not tag_missing: result.append(env.File("%s/%s" % (env["SOURCE_PREFIX"], source))) return result def obj_name(file): return os.path.splitext(os.path.basename(str(file)))[0] def build_objs(env, sources): objs = [] for file in sources: objs.append(env.Object("%s/%s.o" % (env["INTERMEDIATE_PREFIX"], obj_name(file)), file)) return objs def build_libstem(platform_env, arch_envs): arch_outputs = [] for env in arch_envs: Mkdir(env["INTERMEDIATE_PREFIX"]) Mkdir(env["OUTPUT_PREFIX"]) sources = sources_with_tags(env, SOURCES, ["target:libstem", "platform:all"]) sources += sources_with_tags(env, SOURCES, ["target:libstem", "platform:%s" % platform_env["TARGET_PLATFORM"]]) objs = build_objs(env, sources) arch_outputs.append(env.StaticLibrary("%s/libstem.a" % env["OUTPUT_PREFIX"], objs)) if len(arch_envs) > 1: return platform_env.Command("%s/libstem.a" % platform_env["OUTPUT_PREFIX"], arch_outputs, "lipo -create -output $TARGET $SOURCES") return arch_outputs[0] def build_unittests(platform_env, arch_envs): arch_outputs = [] for env in arch_envs: Mkdir(env["INTERMEDIATE_PREFIX"]) Mkdir(env["OUTPUT_PREFIX"]) sources = sources_with_tags(env, SOURCES, ["target:unittest", "platform:all"]) sources += sources_with_tags(env, SOURCES, ["target:unittest", "platform:%s" % platform_env["TARGET_PLATFORM"]]) objs = build_objs(env, sources) arch_outputs.append(env.Program("%s/libstem_unittests" % env["OUTPUT_PREFIX"], objs)) if len(arch_envs) > 1: return platform_env.Command("%s/libstem_unittests" % platform_env["OUTPUT_PREFIX"], arch_outputs, "lipo -create -output $TARGET $SOURCES") return arch_outputs[0] def build_shells(platform_env, arch_envs): shell_outputs = [] for shell in SHELLS: arch_outputs = [] for env in arch_envs: Mkdir(env["INTERMEDIATE_PREFIX"]) Mkdir(env["OUTPUT_PREFIX"]) sources = sources_with_tags(env, SOURCES, ["shell:%s" % shell, "platform:all"]) sources += sources_with_tags(env, SOURCES, ["shell:%s" % shell, "platform:%s" % platform_env["TARGET_PLATFORM"]]) if len(sources) == 0: break objs = build_objs(env, sources) arch_outputs.append(env.StaticLibrary("%s/libstemshell_%s.a" % (env["OUTPUT_PREFIX"], shell), objs)) if len(arch_outputs) > 0: if len(arch_envs) > 1: shell_outputs.append(platform_env.Command("%s/libstemshell_%s.a" % (platform_env["OUTPUT_PREFIX"], shell), arch_outputs, "lipo -create -output $TARGET $SOURCES")) else: shell_outputs.append(arch_outputs[0]) return shell_outputs base_env = Environment( SOURCE_PREFIX = "source", INTERMEDIATE_PREFIX = "build/intermediate", OUTPUT_PREFIX = "build" ) platform = determine_platform(base_env) if platform == None: print "Unsupported platform \"%s\"" % platform Exit(1) platform_env = base_env.Clone( TARGET_PLATFORM = platform, INTERMEDIATE_PREFIX = "%s/%s" % (base_env["INTERMEDIATE_PREFIX"], platform), OUTPUT_PREFIX = "%s/%s" % (base_env["OUTPUT_PREFIX"], platform) ) arch_envs = arch_env_list(platform_env) libstem = build_libstem(platform_env, arch_envs) shells = build_shells(platform_env, arch_envs) unittests = build_unittests(platform_env, arch_envs) if platform_env["TARGET_PLATFORM"] == "macosx" or platform_env["TARGET_PLATFORM"] == "linux": platform_env.AddPostAction(unittests, platform_env.Action("./build/%s/libstem_unittests resources/unittest" % platform_env["TARGET_PLATFORM"])) elif platform_env["TARGET_PLATFORM"] == "iphonesimulator": platform_env.AddPostAction(unittests, platform_env.Action("DYLD_ROOT_PATH=/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.0.sdk ./build/iphonesimulator/libstem_unittests resources/unittest"))