wesnoth/src/SConscript
Andrius Silinskas 947a842bad Translatable months and weekdays. Missing am/pm designations.
A simple std::strftime wrapper was introduced, which takes care of date
translations when needed. I.e. if correct locale is not available, or
locale in use does not support am/pm designations.
2013-10-02 14:49:37 +01:00

673 lines
21 KiB
Python

# vi: syntax=python:et:ts=4
import commands, os
from subprocess import Popen, PIPE
from glob import glob
Import("*")
for env in [test_env, client_env, env]:
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
hash.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/parser.cpp
serialization/preprocessor.cpp
serialization/schema_validator.cpp
serialization/string_utils.cpp
serialization/tokenizer.cpp
serialization/validator.cpp
tools/schema/tag.cpp
""")
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['version_suffix'] and not env['prefsdir']:
filesystem_env['prefsdir'] = ".wesnoth$version_suffix"
if filesystem_env['prefsdir']:
filesystem_env.Append(CPPDEFINES = "PREFERENCES_DIR='\"$prefsdir\"'")
if env['default_prefs_file']:
client_env.Append(CPPDEFINES = "DEFAULT_PREFS_PATH='\"$default_prefs_file\"'")
game_config_env['default_prefs_file'] = env['default_prefs_file']
game_config_env.Append(CPPDEFINES = "DEFAULT_PREFS_PATH='\"$default_prefs_file\"'")
if not os.path.isabs(env['default_prefs_file']):
filesystem_env.Append(CPPDEFINES = "HAS_RELATIVE_DEFPREF")
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("""
arrow.cpp
pathfind/astarsearch.cpp
builder.cpp
clipboard.cpp
construct_dialog.cpp
cursor.cpp
display.cpp
events.cpp
generic_event.cpp
hotkeys.cpp
image.cpp
image_modifications.cpp
joystick.cpp
game_end_exceptions.cpp
generators/cavegen.cpp
generators/map_create.cpp
generators/mapgen.cpp
generators/mapgen_dialog.cpp
generators/yamg/ya_mapgen.cpp
generators/yamg/yamg_hex.cpp
generators/yamg/yamg_hexheap.cpp
generators/yamg/yamg_params.cpp
key.cpp
language.cpp
loadscreen.cpp
map_label.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
sound_music_track.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([
client_env.Object("font.cpp", EXTRA_DEFINE = client_env['fribidi'] and "HAVE_FRIBIDI" or None),
])
libwesnoth = client_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/validation.cpp
""")
libcampaignd = env.Library("campaignd", libcampaignd_sources, OBJPREFIX = "campaignd_")
libwesnoth_sdl_sources = Split("""
sdl_utils.cpp
tracer.cpp
""")
libwesnoth_sdl = client_env.Library("wesnoth_sdl", libwesnoth_sdl_sources)
libcutter_sources = Split("""
tools/exploder_utils.cpp
tools/exploder_cutter.cpp
""")
libcutter = client_env.Library("cutter", libcutter_sources)
# Used by both 'wesnoth' and 'test' targets
wesnoth_sources = Split("""
about.cpp
actions/attack.cpp
actions/create.cpp
actions/heal.cpp
actions/move.cpp
actions/undo.cpp
actions/vision.cpp
addon/client.cpp
addon/info.cpp
addon/manager.cpp
addon/manager_ui.cpp
addon/state.cpp
addon/validation.cpp
ai/actions.cpp
ai/akihara/recruitment.cpp
ai/composite/ai.cpp
ai/composite/aspect.cpp
ai/composite/component.cpp
ai/composite/contexts.cpp
ai/composite/engine.cpp
ai/composite/engine_default.cpp
ai/composite/engine_fai.cpp
ai/composite/engine_lua.cpp
ai/composite/goal.cpp
ai/composite/rca.cpp
ai/composite/stage.cpp
ai/configuration.cpp
ai/contexts.cpp
ai/default/ai.cpp
ai/default/attack.cpp
ai/default/contexts.cpp
ai/formula/ai.cpp
ai/formula/callable_objects.cpp
ai/formula/candidates.cpp
ai/formula/function_table.cpp
ai/formula/stage_side_formulas.cpp
ai/formula/stage_unit_formulas.cpp
ai/game_info.cpp
ai/gamestate_observer.cpp
ai/interface.cpp
ai/lua/core.cpp
ai/lua/lua_object.cpp
ai/lua/unit_advancements_aspect.cpp
ai/manager.cpp
ai/recruitment/recruitment.cpp
ai/registry.cpp
ai/testing.cpp
ai/testing/aspect_attacks.cpp
ai/testing/ca.cpp
ai/testing/ca_global_fallback.cpp
ai/testing/ca_testing_move_to_targets.cpp
ai/testing/ca_testing_recruitment.cpp
ai/testing/stage_fallback.cpp
ai/testing/stage_rca.cpp
animated_game.cpp
attack_prediction.cpp
attack_prediction_display.cpp
callable_objects.cpp
commandline_options.cpp
config_cache.cpp
controller_base.cpp
desktop_util.cpp
dialogs.cpp
editor/action/action.cpp
editor/action/action_unit.cpp
editor/action/action_label.cpp
editor/action/action_village.cpp
editor/action/action_item.cpp
editor/action/action_select.cpp
editor/action/mouse/mouse_action.cpp
editor/action/mouse/mouse_action_map_label.cpp
editor/action/mouse/mouse_action_unit.cpp
editor/action/mouse/mouse_action_village.cpp
editor/action/mouse/mouse_action_item.cpp
editor/action/mouse/mouse_action_select.cpp
editor/map/editor_map.cpp
editor/map/map_context.cpp
editor/map/map_fragment.cpp
editor/map/context_manager.cpp
editor/palette/editor_palettes.cpp
editor/palette/terrain_palettes.cpp
editor/palette/tristate_button.cpp
editor/palette/unit_palette.cpp
editor/palette/item_palette.cpp
editor/palette/palette_manager.cpp
editor/editor_controller.cpp
editor/editor_display.cpp
editor/editor_main.cpp
editor/editor_preferences.cpp
editor/toolkit/brush.cpp
editor/toolkit/editor_toolkit.cpp
filechooser.cpp
flg_manager.cpp
floating_textbox.cpp
formula.cpp
formula_debugger.cpp
formula_debugger_fwd.cpp
formula_function.cpp
formula_string_utils.cpp
formula_tokenizer.cpp
game_config_manager.cpp
game_controller.cpp
game_display.cpp
game_errors.cpp
game_events/action_wml.cpp
game_events/conditional_wml.cpp
game_events/entity_location.cpp
game_events/handlers.cpp
game_events/pump.cpp
game_instance.cpp
game_preferences.cpp
gamestatus.cpp
gui/auxiliary/canvas.cpp
gui/auxiliary/event/dispatcher.cpp
gui/auxiliary/event/distributor.cpp
gui/auxiliary/event/handler.cpp
gui/auxiliary/iterator/iterator.cpp
gui/auxiliary/iterator/walker_grid.cpp
gui/auxiliary/iterator/walker_widget.cpp
gui/auxiliary/log.cpp
gui/auxiliary/placer.cpp
gui/auxiliary/placer/horizontal_list.cpp
gui/auxiliary/placer/vertical_list.cpp
gui/auxiliary/old_markup.cpp
gui/auxiliary/timer.cpp
gui/auxiliary/tips.cpp
gui/auxiliary/widget_definition.cpp
gui/auxiliary/widget_definition/button.cpp
gui/auxiliary/widget_definition/drawing.cpp
gui/auxiliary/widget_definition/horizontal_scrollbar.cpp
gui/auxiliary/widget_definition/image.cpp
gui/auxiliary/widget_definition/label.cpp
gui/auxiliary/widget_definition/listbox.cpp
gui/auxiliary/widget_definition/matrix.cpp
gui/auxiliary/widget_definition/minimap.cpp
gui/auxiliary/widget_definition/multi_page.cpp
gui/auxiliary/widget_definition/panel.cpp
gui/auxiliary/widget_definition/progress_bar.cpp
gui/auxiliary/widget_definition/repeating_button.cpp
gui/auxiliary/widget_definition/scroll_label.cpp
gui/auxiliary/widget_definition/scrollbar_panel.cpp
gui/auxiliary/widget_definition/slider.cpp
gui/auxiliary/widget_definition/spacer.cpp
gui/auxiliary/widget_definition/stacked_widget.cpp
gui/auxiliary/widget_definition/text_box.cpp
gui/auxiliary/widget_definition/toggle_button.cpp
gui/auxiliary/widget_definition/toggle_panel.cpp
gui/auxiliary/widget_definition/tree_view.cpp
gui/auxiliary/widget_definition/vertical_scrollbar.cpp
gui/auxiliary/widget_definition/window.cpp
gui/auxiliary/window_builder.cpp
gui/auxiliary/window_builder/button.cpp
gui/auxiliary/window_builder/control.cpp
gui/auxiliary/window_builder/drawing.cpp
gui/auxiliary/window_builder/helper.cpp
gui/auxiliary/window_builder/horizontal_listbox.cpp
gui/auxiliary/window_builder/horizontal_scrollbar.cpp
gui/auxiliary/window_builder/instance.cpp
gui/auxiliary/window_builder/image.cpp
gui/auxiliary/window_builder/label.cpp
gui/auxiliary/window_builder/listbox.cpp
gui/auxiliary/window_builder/matrix.cpp
gui/auxiliary/window_builder/minimap.cpp
gui/auxiliary/window_builder/multi_page.cpp
gui/auxiliary/window_builder/pane.cpp
gui/auxiliary/window_builder/panel.cpp
gui/auxiliary/window_builder/password_box.cpp
gui/auxiliary/window_builder/progress_bar.cpp
gui/auxiliary/window_builder/repeating_button.cpp
gui/auxiliary/window_builder/scroll_label.cpp
gui/auxiliary/window_builder/scrollbar_panel.cpp
gui/auxiliary/window_builder/slider.cpp
gui/auxiliary/window_builder/spacer.cpp
gui/auxiliary/window_builder/stacked_widget.cpp
gui/auxiliary/window_builder/text_box.cpp
gui/auxiliary/window_builder/toggle_button.cpp
gui/auxiliary/window_builder/toggle_panel.cpp
gui/auxiliary/window_builder/tree_view.cpp
gui/auxiliary/window_builder/vertical_scrollbar.cpp
gui/auxiliary/window_builder/viewport.cpp
gui/dialogs/addon/description.cpp
gui/dialogs/addon/filter_options.cpp
gui/dialogs/addon/uninstall_list.cpp
gui/dialogs/addon_connect.cpp
gui/dialogs/addon_list.cpp
gui/dialogs/campaign_difficulty.cpp
gui/dialogs/campaign_selection.cpp
gui/dialogs/chat_log.cpp
gui/dialogs/data_manage.cpp
gui/dialogs/debug_clock.cpp
gui/dialogs/dialog.cpp
gui/dialogs/edit_label.cpp
gui/dialogs/editor/editor_edit_label.cpp
gui/dialogs/editor/custom_tod.cpp
gui/dialogs/editor_generate_map.cpp
gui/dialogs/editor_new_map.cpp
gui/dialogs/editor_resize_map.cpp
gui/dialogs/editor_set_starting_position.cpp
gui/dialogs/folder_create.cpp
gui/dialogs/formula_debugger.cpp
gui/dialogs/game_delete.cpp
gui/dialogs/game_load.cpp
gui/dialogs/game_paths.cpp
gui/dialogs/game_save.cpp
gui/dialogs/gamestate_inspector.cpp
gui/dialogs/language_selection.cpp
gui/dialogs/lobby/lobby_data.cpp
gui/dialogs/lobby/lobby_info.cpp
gui/dialogs/lobby_main.cpp
gui/dialogs/lobby_player_info.cpp
gui/dialogs/message.cpp
gui/dialogs/mp_cmd_wrapper.cpp
gui/dialogs/mp_change_control.cpp
gui/dialogs/mp_connect.cpp
gui/dialogs/mp_create_game.cpp
gui/dialogs/mp_create_game_choose_mods.cpp
gui/dialogs/mp_create_game_set_password.cpp
gui/dialogs/mp_depcheck_confirm_change.cpp
gui/dialogs/mp_depcheck_select_new.cpp
gui/dialogs/mp_host_game_prompt.cpp
gui/dialogs/mp_login.cpp
gui/dialogs/mp_method_selection.cpp
gui/dialogs/network_transmission.cpp
gui/dialogs/popup.cpp
gui/dialogs/edit_text.cpp
gui/dialogs/simple_item_selector.cpp
gui/dialogs/tip.cpp
gui/dialogs/title_screen.cpp
gui/dialogs/transient_message.cpp
gui/dialogs/unit_attack.cpp
gui/dialogs/unit_create.cpp
gui/dialogs/wml_message.cpp
gui/lib/types/point.cpp
gui/widgets/button.cpp
gui/widgets/container.cpp
gui/widgets/control.cpp
gui/widgets/drawing.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/list.cpp
gui/widgets/listbox.cpp
gui/widgets/matrix.cpp
gui/widgets/minimap.cpp
gui/widgets/multi_page.cpp
gui/widgets/pane.cpp
gui/widgets/panel.cpp
gui/widgets/password_box.cpp
gui/widgets/progress_bar.cpp
gui/widgets/repeating_button.cpp
gui/widgets/scroll_label.cpp
gui/widgets/scrollbar.cpp
gui/widgets/scrollbar_container.cpp
gui/widgets/scrollbar_panel.cpp
gui/widgets/settings.cpp
gui/widgets/slider.cpp
gui/widgets/spacer.cpp
gui/widgets/stacked_widget.cpp
gui/widgets/text.cpp
gui/widgets/text_box.cpp
gui/widgets/toggle_button.cpp
gui/widgets/toggle_panel.cpp
gui/widgets/tree_view.cpp
gui/widgets/tree_view_node.cpp
gui/widgets/vertical_scrollbar.cpp
gui/widgets/viewport.cpp
gui/widgets/widget.cpp
gui/widgets/window.cpp
halo.cpp
help.cpp
intro.cpp
leader_scroll_dialog.cpp
lobby_preferences.cpp
menu_events.cpp
mouse_events.cpp
mouse_handler_base.cpp
movetype.cpp
mp_depcheck.cpp
mp_game_settings.cpp
mp_game_utils.cpp
mp_options.cpp
multiplayer.cpp
multiplayer_configure.cpp
multiplayer_connect.cpp
multiplayer_connect_engine.cpp
multiplayer_create.cpp
multiplayer_create_engine.cpp
multiplayer_lobby.cpp
multiplayer_ui.cpp
multiplayer_wait.cpp
network_asio.cpp
pathfind/pathfind.cpp
pathfind/teleport.cpp
persist_context.cpp
persist_manager.cpp
persist_var.cpp
play_controller.cpp
playcampaign.cpp
playmp_controller.cpp
playsingle_controller.cpp
playturn.cpp
portrait.cpp
replay.cpp
replay_controller.cpp
resources.cpp
save_blocker.cpp
savegame.cpp
scripting/debug_lua.cpp
scripting/lua.cpp
settings.cpp
sha1.cpp
side_filter.cpp
statistics.cpp
statistics_dialog.cpp
storyscreen/controller.cpp
storyscreen/interface.cpp
storyscreen/part.cpp
storyscreen/render.cpp
strftime.cpp
team.cpp
terrain_filter.cpp
tod_manager.cpp
unit.cpp
unit_abilities.cpp
unit_animation.cpp
unit_display.cpp
unit_frame.cpp
unit_helper.cpp
unit_id.cpp
unit_map.cpp
unit_types.cpp
variable.cpp
variant.cpp
whiteboard/action.cpp
whiteboard/attack.cpp
whiteboard/highlighter.cpp
whiteboard/manager.cpp
whiteboard/mapbuilder.cpp
whiteboard/move.cpp
whiteboard/recall.cpp
whiteboard/recruit.cpp
whiteboard/side_actions.cpp
whiteboard/suppose_dead.cpp
whiteboard/utility.cpp
widgets/combo.cpp
widgets/combo_drag.cpp
widgets/drop_target.cpp
widgets/scrollpane.cpp
""")
if env["PLATFORM"] == "win32":
wesnoth_sources.append("windows_tray_notification.cpp")
wesnoth_sources.extend(client_env.Object("game_preferences_display.cpp", EXTRA_DEFINE = env["PLATFORM"] != "win32" and "WESNOTH_PREFIX='\"$prefix\"'" or None))
wesnoth_sources.extend(client_env.Object("hotkey_preferences_display.cpp", EXTRA_DEFINE = env["PLATFORM"] != "win32" and "WESNOTH_PREFIX='\"$prefix\"'" or None))
libwesnoth_extras = client_env.Library("wesnoth_extras", wesnoth_sources)
libwesnoth_extras.extend(SConscript("lua/SConscript"))
#
# Target declarations
#
def error_action(target, source, env):
from SCons.Errors import UserError
raise UserError, "Target disabled because its prerequisites are not met"
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)
env.Alias(target, bin)
else:
bin = env.Alias(target, [], error_action)
AlwaysBuild(bin)
locals()[target] = bin
Export(target)
for env in [test_env, client_env, env]:
env.AddMethod(WesnothProgram)
wesnoth_objects = ["game.cpp", libwesnoth_extras, libwesnoth_core, libwesnoth_sdl,
libwesnoth, env["wesnoth_res"]]
if env["host"] in ["x86_64-nacl", "i686-nacl"]:
wesnoth_objects += [SConscript("nacl/SConscript")]
client_env.WesnothProgram("wesnoth", wesnoth_objects, 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)
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/player_network.cpp
server/proxy.cpp
server/room.cpp
server/room_manager.cpp
server/sample_user_handler.cpp
server/simple_wml.cpp
server/user_handler.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
""")
client_env.WesnothProgram("cutter", cutter_sources + [libcutter, libwesnoth_core, libwesnoth_sdl, libwesnothd, libwesnoth], have_client_prereqs, LIBS = ["$LIBS", "png"])
exploder_sources = Split("""
tools/exploder.cpp
tools/exploder_composer.cpp
""")
client_env.WesnothProgram("exploder", exploder_sources + [libcutter, libwesnoth_core, libwesnoth_sdl, libwesnothd, libwesnoth], have_client_prereqs, LIBS = ["$LIBS", "png"])
schema_generator_sources = Split("""
tools/schema/schema_generator.cpp
tools/schema/sourceparser.cpp
tools/schema/error_container.cpp
""")
client_env.WesnothProgram("schema_generator", schema_generator_sources + [libwesnoth_core, libwesnothd], have_client_prereqs)
test_utils_sources = Split("""
tests/utils/game_config_manager.cpp
tests/utils/fake_event_source.cpp
tests/utils/fake_display.cpp
""")
wesmage_sources = Split("""
wesmage/wesmage.cpp
wesmage/exit.cpp
wesmage/filter.cpp
wesmage/options.cpp
tools/dummy_video.cpp
tools/exploder_utils.cpp
sdl_utils.cpp
tracer.cpp
loadscreen_empty.cpp
""")
client_env.WesnothProgram("wesmage", wesmage_sources + [libwesnoth_core], have_client_prereqs, OBJPREFIX = "wesmage_", LIBS = ["$LIBS", "png"])
libtest_utils = test_env.Library("test_utils", test_utils_sources)
test_sources = Split("""
tests/floating_point_emulation.cpp
tests/main.cpp
tests/test_addons.cpp
tests/test_commandline_options.cpp
tests/test_formula_ai.cpp
tests/test_formula_function.cpp
tests/test_image_modifications.cpp
tests/test_lexical_cast.cpp
tests/test_network_worker.cpp
tests/test_mp_connect.cpp
tests/test_team.cpp
tests/test_unit_map.cpp
tests/test_util.cpp
tests/test_sdl_utils.cpp
tests/test_serialization.cpp
tests/test_version.cpp
tests/test_whiteboard_side_actions.cpp
tests/gui/fire_event.cpp
tests/gui/iterator.cpp
tests/gui/test_drop_target.cpp
tests/gui/test_gui2.cpp
tests/gui/test_save_dialog.cpp
tests/gui/visitor.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, libwesnoth_extras, libtest_utils], have_test_prereqs)
create_images_sources = Split("""
tests/create_images.cpp
tools/dummy_video.cpp
tools/exploder_utils.cpp
sdl_utils.cpp
tracer.cpp
loadscreen_empty.cpp
""")
env.WesnothProgram("create_images", create_images_sources + [libwesnoth_core], have_server_prereqs, OBJPREFIX = "create_images_", LIBS = ["$LIBS", "png"])
if env.get("have_autorevision"):
game_config_env.Append(CPPDEFINES = 'LOAD_REVISION')
sources = []
if "TAGS" in COMMAND_LINE_TARGETS:
sources = [ Glob(os.path.join(dir, pattern)) for dir in ["", "*", "*/*"] for pattern in ["*.cpp", "*.hpp"] ]
Export("sources")
# Local variables:
# mode: python
# end: