from distutils.sysconfig import get_config_var, get_python_inc
from glob import glob
from os import listdir
from os.path import isdir, isfile, join
from sys import platform, version_info
from time import localtime, strftime
# First, a couple of helper functions
def probe_directory(directory):
"""
Examine the contents of directory, and return a list that
satisfies the following properties:
1. If the directory does not contain a file called '.suppress',
all .c files in that directory.
2. If the directory contains a file called '.suppress', all .c
files in that directory that are not named by .suppress
3. If the directory contains a file called '.suppress', and the
file contains the line 'all', return the empty list.
"""
try:
suppress = open(join(directory, '.suppress'), 'r')
suppress_files = [x.replace('\n', '') for x in suppress.readlines()]
suppress.close()
except IOError:
# Assume file not found
suppress_files = []
if 'all' in suppress_files:
return []
# Can't do this earlier because it mangles the 'all' line.
suppress_files = [join(directory, x) for x in suppress_files]
c_files = recursive_glob(directory, '*.c')
return [x for x in c_files if x not in suppress_files]
def recursive_glob(directory, pattern):
"""
Return a list of all files in directory that match the given pattern.
"""
files = []
directories = [directory] + [x for x in listdir(directory) if isdir(x)]
while directories != []:
directories += [x for x in [join(directories[0], y) for y in listdir(directories[0])] if isdir(x)]
files += glob(join(directories[0], pattern))
directories = directories[1:]
return files
# Initialise the build environment
nakedmud = Environment()
nakedmud.Append(CPPPATH=[get_python_inc()])
# The following seems to break under Mac OSX, so we'll just filter it out. It still seems to work without it...
if platform == 'darwin':
nakedmud.Append(LINKFLAGS=get_config_var('LINKFORSHARED').split())
nakedmud.Append(LIBS=['python%d.%d' % version_info[0:2]])
# The name of the binary file to build
binary = 'NakedMud'
# Required modules
modules = ['dyn_vars', 'set_val', 'olc2', 'editor', 'items', 'scripts']
# Optional modules
modules += ['time', 'socials', 'alias', 'help2']
# Compiler flags
nakedmud.Append(CCFLAGS=['-Wall', '-g', '-ggdb', '-O2'])
# Required libraries
nakedmud.Append(LIBS=['z', 'pthread'])
# non-darwin OSes need to include crypt
if platform != 'darwin':
nakedmud.Append(LIBS=['crypt'])
# The big list of source files.
nakedmud['NAKEDMUD_SOURCES'] = glob('*.c')
# Export the nakedmud environment in case SConscripts need to modify it
Export('nakedmud')
# Work through the module dirs and append to the sources list
for module in modules:
nakedmud['NAKEDMUD_SOURCES'] += probe_directory(module)
filename = join(module, 'SConscript')
if(isfile(filename)):
SConscript(filename)
# Default target is build the program
nakedmud.Default(nakedmud.Program(binary, nakedmud['NAKEDMUD_SOURCES']))
# Backup stuff
# Directories to include when making backups. Note that this is _NOT_ a Python list, it is passed
# directly to tar.
backup_dirs = 'src lib doc'
# Name of the backup file
backup_file = join('backup', '%s-%s.tar.gz' % (binary.lower(), strftime('%Y-%m-%d-%Hh%Mm', localtime())))
# Rule for making backups
nakedmud.Command(backup_file, [], ['cd .. ; tar -zcf %s %s' % (backup_file, backup_dirs)])
# Alias so `scons backup` will make a backup
nakedmud.Alias('backup', backup_file)