# vi: syntax=python:et:ts=4

import commands, os
from subprocess import Popen, PIPE
from glob import glob

Import("*")

env.Append(CPPDEFINES = "$EXTRA_DEFINE")
test_env.Append(CPPDEFINES = "$EXTRA_DEFINE")

#color_range.cpp should be removed, but game_config depends on it.
#game_config has very few things that are needed elsewhere, it should be
#removed.  Requires moving path and version at least to other files.

libwesnoth_core_sources = Split("""
    color_range.cpp
    config.cpp
    gettext.cpp
    log.cpp
    map.cpp
    map_location.cpp
    md5.cpp
    network.cpp
    thread.cpp
    tstring.cpp
    util.cpp
    version.cpp
    serialization/binary_or_text.cpp
    serialization/binary_wml.cpp
    serialization/parser.cpp
    serialization/preprocessor.cpp
    serialization/string_utils.cpp
    serialization/tokenizer.cpp
    """)
if env["pool_alloc"]:
    libwesnoth_core_sources.extend(Split("""
        malloc.c
        poolalloc.c
        """))

libwesnoth_core_sources.extend(env.Object("network_worker.cpp", EXTRA_DEFINE = env['raw_sockets'] and "NETWORK_USE_RAW_SOCKETS" or None))

game_config_env = env.Clone()
filesystem_env = env.Clone()
if env["PLATFORM"] != "win32":
    game_config_env.Append(CPPDEFINES = "WESNOTH_PATH='\"$datadir\"'")
    if env['localedirname']:
        filesystem_env.Append(CPPDEFINES = "LOCALEDIR='\"$localedirname\"'")
        if not os.path.isabs(env['localedirname']):
            filesystem_env.Append(CPPDEFINES = "HAS_RELATIVE_LOCALEDIR")
    if env['prefsdir']:
        filesystem_env.Append(CPPDEFINES = "PREFERENCES_DIR='\"$prefsdir\"'")

libwesnoth_core_sources.extend([
    game_config_env.Object("game_config.cpp"),
    filesystem_env.Object("filesystem.cpp")
    ])

libwesnoth_core = env.Library("wesnoth_core", libwesnoth_core_sources)

libwesnoth_sources = Split("""
    astarnode.cpp
    astarsearch.cpp
    builder.cpp
    cavegen.cpp
    clipboard.cpp
    construct_dialog.cpp
    cursor.cpp
    display.cpp
    events.cpp
    filechooser.cpp
    generic_event.cpp
    hotkeys.cpp
    image.cpp
    image_function.cpp
    key.cpp
    language.cpp
    loadscreen.cpp
    map_create.cpp
    map_label.cpp
    mapgen.cpp
    mapgen_dialog.cpp
    marked-up_text.cpp
    minimap.cpp
    pathutils.cpp
    preferences.cpp
    preferences_display.cpp
    race.cpp
    random.cpp
    reports.cpp
    show_dialog.cpp
    sound.cpp
    soundsource.cpp
    terrain.cpp
    terrain_translation.cpp
    text.cpp
    time_of_day.cpp
    tooltips.cpp
    video.cpp
    theme.cpp
    widgets/button.cpp
    widgets/file_menu.cpp
    widgets/label.cpp
    widgets/menu.cpp
    widgets/menu_style.cpp
    widgets/progressbar.cpp
    widgets/scrollarea.cpp
    widgets/scrollbar.cpp
    widgets/slider.cpp
    widgets/textbox.cpp
    widgets/widget.cpp
    wml_exception.cpp
    """)
libwesnoth_sources.extend([
    env.Object("font.cpp", EXTRA_DEFINE = env['fribidi'] and "HAVE_FRIBIDI" or None),
    ])

libwesnoth = env.Library("wesnoth", libwesnoth_sources)

libwesnothd_sources = Split("""
    loadscreen_empty.cpp
    tools/dummy_video.cpp
    """)
libwesnothd = env.Library("wesnothd", libwesnothd_sources)

libcampaignd_sources = Split("""
    addon_checks.cpp
    """)
libcampaignd = env.Library("campaignd", libcampaignd_sources)

libwesnoth_sdl_sources = Split("""
    sdl_utils.cpp
    """)
libwesnoth_sdl = env.Library("wesnoth_sdl", libwesnoth_sdl_sources)

libcutter_sources = Split("""
    tools/exploder_utils.cpp
    tools/exploder_cutter.cpp
    """)
libcutter = env.Library("cutter", libcutter_sources)

# Used by both 'wesnoth' and 'test' targets
wesnoth_sources = Split("""
    about.cpp
    actions.cpp
    addon_checks.cpp
    addon_management.cpp
    ai_dfool.cpp
    ai_attack.cpp
    ai_move.cpp
    ai_village.cpp
    animated_game.cpp
    attack_prediction.cpp
    attack_prediction_display.cpp
    callable_objects.cpp
    config_adapter.cpp
    controller_base.cpp
    dialogs.cpp
    floating_textbox.cpp
    formula.cpp
    formula_ai.cpp
    formula_function.cpp
    formula_tokenizer.cpp
    formula_string_utils.cpp
    game_display.cpp
    game_events.cpp
    game_preferences.cpp
    gamestatus.cpp
    generate_report.cpp
    halo.cpp
    help.cpp
    intro.cpp
    leader_list.cpp
    menu_events.cpp
    mouse_events.cpp
    mouse_handler_base.cpp
    multiplayer.cpp
    multiplayer_ui.cpp
    multiplayer_wait.cpp
    multiplayer_create.cpp
    multiplayer_lobby.cpp
    pathfind.cpp
    playcampaign.cpp
    play_controller.cpp
    playmp_controller.cpp
    playsingle_controller.cpp
    playturn.cpp
    portrait.cpp
    replay.cpp
    replay_controller.cpp
    sha1.cpp
    settings.cpp
    statistics.cpp
    statistics_dialog.cpp
    team.cpp
    terrain_filter.cpp
    time_of_day.cpp
    titlescreen.cpp
    unit.cpp
    unit_abilities.cpp
    unit_animation.cpp
    unit_display.cpp
    unit_frame.cpp
    unit_id.cpp
    unit_map.cpp
    unit_types.cpp
    upload_log.cpp
    variable.cpp
    variant.cpp
    widgets/combo.cpp
    widgets/combo_drag.cpp
    widgets/drop_target.cpp
    widgets/scrollpane.cpp
    gui/dialogs/addon_connect.cpp
    gui/dialogs/addon_list.cpp
    gui/dialogs/campaign_selection.cpp
    gui/dialogs/dialog.cpp
    gui/dialogs/language_selection.cpp
    gui/dialogs/message.cpp
    gui/dialogs/mp_connect.cpp
    gui/dialogs/mp_create_game.cpp
    gui/dialogs/mp_method_selection.cpp
    gui/dialogs/mp_cmd_wrapper.cpp
    gui/dialogs/title_screen.cpp
    gui/dialogs/wml_message.cpp
    gui/widgets/button.cpp
    gui/widgets/canvas.cpp
    gui/widgets/control.cpp
    gui/widgets/container.cpp
    gui/widgets/event_handler.cpp
    gui/widgets/generator.cpp
    gui/widgets/grid.cpp
    gui/widgets/helper.cpp
    gui/widgets/horizontal_scrollbar.cpp
    gui/widgets/image.cpp
    gui/widgets/label.cpp
    gui/widgets/listbox.cpp
    gui/widgets/menubar.cpp
    gui/widgets/minimap.cpp
    gui/widgets/panel.cpp
    gui/widgets/password_box.cpp
    gui/widgets/settings.cpp
    gui/widgets/scroll_label.cpp
    gui/widgets/scrollbar_container.cpp
    gui/widgets/scrollbar.cpp
    gui/widgets/slider.cpp 
    gui/widgets/spacer.cpp
    gui/widgets/text.cpp
    gui/widgets/text_box.cpp
    gui/widgets/toggle_button.cpp 
    gui/widgets/toggle_panel.cpp 
    gui/widgets/tooltip.cpp
    gui/widgets/vertical_scrollbar.cpp
    gui/widgets/widget.cpp
    gui/widgets/window.cpp
    gui/widgets/window_builder.cpp
    """)

wesnoth_sources.extend(env.Object("game_preferences_display.cpp", EXTRA_DEFINE = env["PLATFORM"] != "win32" and "WESNOTH_PREFIX='\"$prefix\"'" or None))
wesnoth_sources.extend(env.Object(Split("""
    ai.cpp
    config_cache.cpp
    multiplayer_connect.cpp
    """)))

wesnoth_editor2_sources = Split("""
    gui/dialogs/editor_generate_map.cpp
    gui/dialogs/editor_new_map.cpp
    gui/dialogs/editor_resize_map.cpp
    gui/dialogs/editor_settings.cpp
    editor2/action.cpp
    editor2/brush.cpp
    editor2/editor_main.cpp
    editor2/editor_controller.cpp
    editor2/editor_display.cpp
    editor2/editor_layout.cpp
    editor2/editor_map.cpp
    editor2/editor_palettes.cpp
    editor2/map_context.cpp
    editor2/map_fragment.cpp
    editor2/mouse_action.cpp
    """)
    
if env["editor"]:
    wesnoth_sources += wesnoth_editor2_sources

libwesnoth_extras = env.Library("wesnoth_extras", wesnoth_sources)
#
# Target declarations
#

def WesnothProgram(env, target, source, can_build, **kw):
    if can_build:
        if env["build"] == "base":
            bin = env.Program(target, source, **kw)
        else:
            bin = env.Program("#/" + target + build_suffix, source, **kw)
    else:
        bin = None
    env.Alias(target, bin)
    exec target + " = bin"
    Export(target)

from SCons.Script.SConscript import SConsEnvironment
SConsEnvironment.WesnothProgram = WesnothProgram

game_cpp = env.Object("game.cpp", EXTRA_DEFINE = not env["pool_alloc"] and "DISABLE_POOL_ALLOC" or None);

env.WesnothProgram("wesnoth", [game_cpp] + [libwesnoth_extras, libwesnoth_core, libwesnoth_sdl, libwesnoth, libcampaignd, env["wesnoth_res"]], have_client_prereqs)

campaignd_sources = Split("""
    server/input_stream.cpp
    """)

if env["PLATFORM"] == "win32": env["fifodir"] = ""
campaignd_sources.extend(env.Object("campaign_server/campaign_server.cpp", EXTRA_DEFINE = env['fifodir'] and "FIFODIR='\"$fifodir\"'" or None))

env.WesnothProgram("campaignd", campaignd_sources + [libwesnoth_core, libwesnothd, libcampaignd], have_server_prereqs)

# I don't know Scons so I just add jwsmtp here...

wesnothd_sources = Split("""
    server/ban.cpp
    server/forum_user_handler.cpp
    server/game.cpp
    server/input_stream.cpp
    server/metrics.cpp
    server/player.cpp
    server/proxy.cpp
    server/sample_user_handler.cpp
    server/simple_wml.cpp
    server/user_handler.cpp
    server/mail.cpp
    time.cpp
    server/jwsmtp/mailer.cpp
    server/jwsmtp/compat.cpp
    server/jwsmtp/base64.cpp
    """)
wesnothd_sources.extend(env.Object("server/server.cpp", EXTRA_DEFINE = env['fifodir'] and "FIFODIR='\"$fifodir\"'" or None))

env.WesnothProgram("wesnothd", wesnothd_sources + [libwesnoth_core, libwesnothd], have_server_prereqs)

cutter_sources = Split("""
    tools/cutter.cpp
    """)
env.WesnothProgram("cutter", cutter_sources + [libcutter, libwesnoth_core, libwesnoth_sdl, libwesnothd, libwesnoth], have_client_prereqs,
    LIBS = env["LIBS"] + ["png"])

exploder_sources = Split("""
    tools/exploder.cpp
    tools/exploder_composer.cpp
    """)
env.WesnothProgram("exploder", exploder_sources + [libcutter, libwesnoth_core, libwesnoth_sdl, libwesnothd, libwesnoth], have_client_prereqs,
    LIBS = env["LIBS"] + ["png"])

test_utils_sources = Split("""
    tests/utils/game_config_manager.cpp
    tests/utils/fake_event_source.cpp
    tests/utils/fake_display.cpp
    """)

libtest_utils = env.Library("test_utils", test_utils_sources)

test_sources = Split("""
    tests/main.cpp
    tests/test_formula_ai.cpp
    tests/test_network_worker.cpp
    tests/test_policy.cpp
    tests/test_team.cpp
    tests/test_util.cpp
    tests/test_serialization.cpp
    tests/test_version.cpp
    tests/gui/test_drop_target.cpp
    tests/gui/test_save_dialog.cpp
    tests/utils/play_scenario.cpp
    """)
test_sources.extend(test_env.Object("tests/test_config_cache.cpp"))

test = test_env.WesnothProgram("test", test_sources +  [libwesnoth_extras, libwesnoth_core, libwesnoth_sdl, libwesnoth,libtest_utils], have_test_prereqs)

if env["svnrev"] != "" and env["svnrev"] != "exported":
    revision_define = "#define REVISION \"%s\"\n" % env["svnrev"]
    env.Command("#/src/revision.hpp", Value(env["svnrev"]), Action(
                    lambda target, source, env: open(str(target[0]), "w").write(revision_define),
                    "Generating revision.hpp..."
                    ))
    game_config_env.Append(CPPDEFINES = 'HAVE_REVISION')

sources = []
if "TAGS" in COMMAND_LINE_TARGETS:
    EnsureSConsVersion(0, 98)
    sources = [ Glob(os.path.join(dir, pattern)) for dir in ["", "*", "*/*"] for pattern in ["*.cpp", "*.hpp"] ]

Export("sources")

# Local variables:
# mode: python
# end:
