import sys import os import multiprocessing import SCons.Util ## Configuration opts = Variables('Local.sc') opts.AddVariables( ("CC", "C Compiler"), ("CXX", "C++ Compiler"), ("AS", "Assembler"), ("LINK", "Linker"), ("BUILDTYPE", "Build type (RELEASE, DEBUG, or PERF)", "RELEASE"), ("VERBOSE", "Show full build information (0 or 1)", "0"), ("NUMCPUS", "Number of CPUs to use for build (0 means auto).", "0"), ("WITH_GPROF", "Include gprof profiling (0 or 1).", "0"), ("PREFIX", "Installation target directory.", "#pxelinux"), ("ARCH", "Target Architecture", "amd64") ) env = Environment(options = opts, tools = ['default'], ENV = os.environ) Help(opts.GenerateHelpText(env)) # Copy environment variables if os.environ.has_key('CC'): env["CC"] = os.getenv('CC') if os.environ.has_key('CXX'): env["CXX"] = os.getenv('CXX') if os.environ.has_key('AS'): env["AS"] = os.getenv('AS') if os.environ.has_key('LD'): env["LINK"] = os.getenv('LD') if os.environ.has_key('CFLAGS'): env.Append(CCFLAGS = SCons.Util.CLVar(os.environ['CFLAGS'])) if os.environ.has_key('CPPFLAGS'): env.Append(CPPFLAGS = SCons.Util.CLVar(os.environ['CPPFLAGS'])) if os.environ.has_key('CXXFLAGS'): env.Append(CXXFLAGS = SCons.Util.CLVar(os.environ['CXXFLAGS'])) if os.environ.has_key('LDFLAGS'): env.Append(LINKFLAGS = SCons.Util.CLVar(os.environ['LDFLAGS'])) #env.Append(CPPFLAGS = [ "-Wall", "-Wformat=2", "-Wextra", "-Wwrite-strings", # "-Wno-unused-parameter", "-Wmissing-format-attribute", # "-Werror" ]) #env.Append(CFLAGS = [ "-Wmissing-prototypes", "-Wmissing-declarations", # "-Wshadow", "-Wbad-function-cast", "-Werror" ]) #env.Append(CXXFLAGS = [ "-Wno-non-template-friend", "-Woverloaded-virtual", # "-Wcast-qual", "-Wcast-align", "-Wconversion", # "-Weffc++", "-std=c++0x", "-Werror" ]) if env["WITH_GPROF"] == "1": env.Append(CPPFLAGS = [ "-pg" ]) env.Append(LINKFLAGS = [ "-pg" ]) if env["BUILDTYPE"] == "DEBUG": env.Append(CPPFLAGS = [ "-g", "-DDEBUG", "-Wall", "-Wno-deprecated-declarations" ]) env.Append(LINKFLAGS = [ "-g", "-rdynamic" ]) elif env["BUILDTYPE"] == "PERF": env.Append(CPPFLAGS = [ "-g", "-DNDEBUG", "-Wall", "-O2"]) env.Append(LDFLAGS = [ "-g", "-rdynamic" ]) elif env["BUILDTYPE"] == "RELEASE": env.Append(CPPFLAGS = ["-DNDEBUG", "-Wall", "-O2"]) else: print "Error BUILDTYPE must be RELEASE or DEBUG" sys.exit(-1) if env["ARCH"] != "amd64": print "Unsupported architecture: " + env["ARCH"] sys.exit(-1) try: hf = open(".git/HEAD", 'r') head = hf.read() if head.startswith("ref: "): if head.endswith("\n"): head = head[0:-1] with open(".git/" + head[5:]) as bf: branch = bf.read() if branch.endswith("\n"): branch = branch[0:-1] env.Append(CPPFLAGS = [ "-DGIT_VERSION=\\\"" + branch + "\\\""]) except IOError: pass if env["VERBOSE"] == "0": env["CCCOMSTR"] = "Compiling $SOURCE" env["CXXCOMSTR"] = "Compiling $SOURCE" env["SHCCCOMSTR"] = "Compiling $SOURCE" env["SHCXXCOMSTR"] = "Compiling $SOURCE" env["ARCOMSTR"] = "Creating library $TARGET" env["RANLIBCOMSTR"] = "Indexing library $TARGET" env["LINKCOMSTR"] = "Linking $TARGET" def GetNumCPUs(env): if env["NUMCPUS"] != "0": return int(env["NUMCPUS"]) return 2*multiprocessing.cpu_count() env.SetOption('num_jobs', GetNumCPUs(env)) # XXX: Hack to support clang static analyzer def CheckFailed(): if os.getenv('CCC_ANALYZER_OUTPUT_FORMAT') != None: return Exit(1) # Configuration conf = env.Configure() if not conf.CheckCC(): print 'Your C compiler and/or environment is incorrectly configured.' CheckFailed() if not conf.CheckCXX(): print 'Your C++ compiler and/or environment is incorrectly configured.' CheckFailed() conf.Finish() Export('env') # Debugging Tools # Build Targets SConscript('sys/SConscript', variant_dir='build/sys') # Install Targets env.Install('$PREFIX/','build/sys/castor') env.Alias('install','$PREFIX')