cpp_photon/SConstruct
2005-04-21 18:39:26 +00:00

114 lines
4.5 KiB
Python

#This file is part of Photon (http://photon.sourceforge.net)
#Copyright (C) 2004-2005 James Turk
#
# Author:
# James Turk (jpt2433@rit.edu)
#
# Version:
# $Id: SConstruct,v 1.6 2005/04/21 18:39:26 cozman Exp $
import os,os.path
import glob
import string
def combine(prefix, dirs):
"""Add a common prefix to all directories"""
return [os.path.join(prefix,d) for d in dirs]
def getFiles(path, pat):
"""Get all files which match a glob in a directory"""
return glob.glob( os.path.join(path,pat) )
def getFilesMulti(paths, pat):
"""Get all files which match a glob in a set of directories"""
filelist = []
for d in paths:
filelist += getFiles(d, pat)
return filelist
def getFilesRecursive(path, pat):
files = glob.glob( os.path.join(path,pat) )
for item in os.walk(path):
basePath = item[0]
for subdir in item[1]:
files += glob.glob( os.path.join(basePath,subdir,pat) )
return [modf.replace(path+os.sep, '').replace(os.sep,'/') for modf in files]
class Builder:
def __init__(self):
self.libName = 'photon'
self.subDirs = ['', 'audio', 'math', 'util', 'util/filesys', 'video']
self.srcDirs = combine('src',self.subDirs)
self.incDirs = combine('include',self.subDirs)
self.srcFiles = getFilesMulti(self.srcDirs, '*.cpp')
self.srcFiles = [f.replace('src','build') for f in self.srcFiles]
self.incFiles = getFilesMulti(self.srcDirs, '*.hpp')
def checkLibrary(self, name, lib, header):
"""Check if a library/header pair exists, report and bail if not"""
if not self.conf.CheckLibWithHeader(lib, header, 'C++'):
print name,'not found, exiting.'
Exit(1)
def checkDepends(self):
"""Check all the dependencies for the current project"""
self.env = Environment(ENV = os.environ,
LIBPATH=['/usr/lib', '/usr/local/lib'],
INCPATH=['/usr/include', '/usr/local/include'])
self.conf = Configure(self.env)
self.checkLibrary('OpenAL','openal','AL/al.h')
self.checkLibrary('OpenGL','GL','GL/gl.h')
self.checkLibrary('GLFW','glfw','GL/glfw.h')
self.env = self.conf.Finish()
def namedBuild(self, name, target, buildType, default=False, **extra):
"""Add a build target which can be addressed by name on the command line
name - Name to give to the target (using Alias)
target - Actual build target
buildType - string describing what is being built (eg. Library, PDF)
[default - whether or not target is built by default (False)]
**extra - any options which should be given to the builder
(eg. source='foo.c', CPPPATH='/foo/bar/baz')
"""
# create a string with the desired buildType
regStr = "self.env."+buildType+"(target = target, **extra)"
# alias the build to the given name
reg = self.env.Alias(name, eval(regStr))
if default:
self.env.Default(reg)
return reg
def buildSuperHeader(self):
header = file('include/'+self.libName+'.hpp','w')
incGuard = string.upper(self.libName)+'_HPP'
header.write('#ifndef '+incGuard+'\n')
header.write('#define '+incGuard+'\n\n')
for inc in getFilesRecursive('./include','*.hpp'):
header.write('#include "'+inc+'"\n')
header.write('\n#endif // '+incGuard+'\n')
def build(self):
BuildDir('build', 'src', duplicate=0)
self.checkDepends()
self.namedBuild('photon', os.path.join('lib',self.libName), 'Library',
default=True,
source = self.srcFiles, CPPPATH = 'include',
CPPFLAGS = '-Wall -pedantic -pg')
self.namedBuild('test00', 'test00', 'Program', default=False,
source = 'test00.cpp', CPPPATH = self.incDirs,
LIBPATH='./lib',
LIBS=['photon','openal32','glfw','opengl32','glu32','physfs'],
CPPFLAGS = '-Wall -pedantic -pg', LINKFLAGS='-pg')
self.buildSuperHeader()
#ndoc = self.env.Command('docs/index.html', './include',
# """NaturalDocs -nag -i $SOURCES -o HTML ./docs -p ./ndoc""",
# target_factory=Dir)
#self.env.Alias("docs",ndoc)
self.env.AlwaysBuild('docs/index.html')
b = Builder()
b.build()