wesnoth/scons/install.py
Sergey Popov 6afce6a362 scons wasn't installing locales and translations...
...if those dirs didn't exist at SConscript parse time. Fixed.
2009-04-17 16:08:05 +00:00

112 lines
4.2 KiB
Python

# vi: syntax=python:et:ts=4
from SCons.Script import *
import shutil, os
from subprocess import call, Popen, PIPE
def InstallFilteredHook(target, source, env):
CopyFilter = env["copy_filter"]
target = Flatten(target)
source = Flatten(source)
if(len(target) != len(source)):
raise ValueError, "Number of targets doesn't match number of sources"
def do_copy(target, source):
if CopyFilter(source):
if os.path.isfile(source):
if (env["gui"] == "tiny") and (source.endswith("jpg") or source.endswith("png")):
image_info = Popen(["identify", "-verbose", source], stdout = PIPE).communicate()[0]
if "Alpha: " in image_info:
command = "convert -filter point -resize %s %s %s"
else:
command = "convert -resize %s %s %s"
for (large, small) in (("1024x768","320x240"),
("640x480","240x180"),
("205x205","80x80")):
if ("Geometry: " + large) in image_info:
command = command % (small, source, target)
break
else:
command = command % ("50%", source, target)
if env["verbose"]:
print command
call(Split(command))
else:
# Just copy non-images, and images if tinygui is off
if env["verbose"]:
print "cp %s %s" % (source, target)
shutil.copy2(source, target)
else:
if not os.path.exists(target):
if env["verbose"]:
print "Make directory", target
os.makedirs(target)
for file in os.listdir(source):
do_copy(os.path.join(target, file), os.path.join(source, file))
for (target_dir, source_dir) in zip(target, source):
target_path = str(target_dir)
source_path = str(source_dir)
if not os.path.exists(target_path):
os.makedirs(target_path)
for d in (target_path, source_path):
if not os.path.isdir(d):
raise ValueError, "%s is not a directory" % d
do_copy(target_path, source_path)
from SCons.Action import ActionFactory
from shutil import copy2
def hard_link(dest, src, symlink = False):
try:
if symlink:
os.symlink(src, dest)
else:
os.link(src, dest)
except OSError, e:
if e.errno == 18:
hard_link(dest, src, True)
else:
os.remove(dest)
os.link(src, dest)
except AttributeError:
copy2(src, dest)
HardLink = ActionFactory(hard_link,
lambda dest, src: 'Hardlinking %s to %s' % (src, dest))
def InstallBinary(env, source):
if not source:
return source
binary = source[0].name
installdir = env.subst(os.path.join(env["destdir"], env["bindir"].lstrip("/")))
env.Alias("install-" + binary,
env.InstallAs(os.path.join(installdir, binary + env["program_suffix"]), source)
)
def InstallData(env, datadir, component, source, subdir = ""):
installdir = Dir(env.subst(os.path.join(env["destdir"], env[datadir].lstrip("/"), subdir)))
sources = map(Entry, Flatten([source]))
dirs = []
for source in sources:
if isinstance(source, SCons.Node.FS.Dir) or source.isdir():
dirs.append(source)
else:
if source.exists():
env.Alias("install-" + component, env.Install(installdir, source))
if dirs:
if len(dirs) == 1:
install = env.InstallFiltered(installdir.path, dirs[0].path)
else:
install = map(lambda x : env.InstallFiltered(os.path.join(installdir.path, x.name), x.path), dirs)
AlwaysBuild(install)
env.Alias("install-" + component, install)
def generate(env):
env.AddMethod(InstallBinary)
env.AddMethod(InstallData)
env.Append(BUILDERS={'InstallFiltered':Builder(action=InstallFilteredHook, target_factory=Dir, source_factory=Dir)})
def exists():
return True