28   | 
    28   | 
    29 Options:  | 
    29 Options:  | 
    30 """)  | 
    30 """)  | 
    31   | 
    31   | 
    32 import os, sys  | 
    32 import os, sys  | 
    33 env = Environment(ENV = {'PATH' : os.environ['PATH']}) | 
    33 env = Environment() #(ENV = {'PATH' : os.environ['PATH']}) | 
    34 Decider('MD5-timestamp') | 
    34 Decider('MD5-timestamp') | 
    35   | 
    35   | 
    36 opt = Options(['.optioncache'])  | 
    36 opt = Options(['.optioncache'])  | 
    37 opt.AddOptions(  | 
    37 opt.AddOptions(  | 
    38 	BoolOption('intelc', 'use Intel C++ Compiler, if available', True), | 
    38 	BoolOption('intelc', 'use Intel C++ Compiler, if available', True), | 
         | 
    39 	BoolOption('simd', 'allow SSE intrinsics', True), | 
    39 	('precision', 'floating point number precision (single/double)', "single"), | 
    40 	('precision', 'floating point number precision (single/double)', "single"), | 
    40 	('flags', 'add additional compiler flags', ""), | 
    41 	('flags', 'add additional compiler flags', ""), | 
         | 
    42 	BoolOption('force_flags', "use only flags specified by 'flags' option (do not autodetect arch/sse flags)", False), | 
         | 
    43 	BoolOption('profile', "enable gcc's profiling support (-pg)", False), | 
    41 )  | 
    44 )  | 
    42 if env['PLATFORM'] == 'win32':  | 
    45 if env['PLATFORM'] == 'win32':  | 
    43 	opt.AddOptions(  | 
    46 	opt.AddOptions(  | 
    44 		('pythonpath', 'path to Python installation', | 
    47 		('pythonpath', 'path to Python installation', | 
    45 			'C:\\Python%c%c' % (sys.version[0], sys.version[2])),  | 
    48 			'C:\\Python%c%c' % (sys.version[0], sys.version[2])),  | 
   118 if cc == 'gcc':  | 
   121 if cc == 'gcc':  | 
   119 	add_flags += cpuflags_gcc + ' -ffast-math '  | 
   122 	add_flags += cpuflags_gcc + ' -ffast-math '  | 
   120 if cc == 'intelc':  | 
   123 if cc == 'intelc':  | 
   121 	add_flags += cpuflags_intelc + ' '  | 
   124 	add_flags += cpuflags_intelc + ' '  | 
   122   | 
   125   | 
         | 
   126 if conf.env['force_flags']:  | 
         | 
   127 	add_flags = conf.env['flags'] + ' '  | 
         | 
   128 else:  | 
         | 
   129 	add_flags += conf.env['flags'] + ' '  | 
         | 
   130   | 
   123 if conf.env['precision'] == 'double':  | 
   131 if conf.env['precision'] == 'double':  | 
   124 	add_flags += '-DPYRIT_DOUBLE '  | 
   132 	add_flags += '-DPYRIT_DOUBLE '  | 
   125 elif cc == 'gcc':  | 
   133 elif cc == 'gcc':  | 
   126 	add_flags += '-fsingle-precision-constant '  | 
   134 	add_flags += '-fsingle-precision-constant '  | 
   127   | 
   135   | 
   128 add_flags += conf.env['flags']  | 
   136 if not conf.env['simd']:  | 
         | 
   137 	add_flags += '-DNO_SSE '  | 
   129   | 
   138   | 
   130 if cc == 'intelc':  | 
   139 if cc == 'intelc':  | 
   131 	conf.env.Append(CCFLAGS="-O3 -w1 " + add_flags)  | 
   140 	conf.env.Append(CCFLAGS="-O3 -w1 " + add_flags)  | 
   132 elif cc == 'gcc':  | 
   141 elif cc == 'gcc':  | 
   133 	conf.env.Append(CCFLAGS="-O3 -Wall -pipe " + add_flags)  | 
   142 	conf.env.Append(CCFLAGS="-O3 -Wall -pipe " + add_flags)  | 
   141   | 
   150   | 
   142 if conf.CheckLibWithHeader('png', 'png.h', 'C'): | 
   151 if conf.CheckLibWithHeader('png', 'png.h', 'C'): | 
   143 	conf.env.Append(CCFLAGS='-DHAVE_PNG')  | 
   152 	conf.env.Append(CCFLAGS='-DHAVE_PNG')  | 
   144 	conf.env.Append(LIBS=['png'])  | 
   153 	conf.env.Append(LIBS=['png'])  | 
   145   | 
   154   | 
         | 
   155 if not conf.CheckCHeader('pthread.h'): | 
         | 
   156 	print 'Error: Cannot build without pthread.'  | 
         | 
   157 	Exit(1)  | 
         | 
   158   | 
   146 if conf.env['PLATFORM'] == 'win32':  | 
   159 if conf.env['PLATFORM'] == 'win32':  | 
   147 	conf.env.Append(LIBS=["pthreadGC2"])  | 
   160 	conf.env.Append(LIBS=["pthreadGC2"])  | 
   148 else:  | 
   161 else:  | 
   149 	conf.env.Append(CCFLAGS="-pthread ")  | 
   162 	conf.env.Append(CCFLAGS="-pthread ")  | 
         | 
   163   | 
         | 
   164 if conf.env['profile'] and cc == 'gcc':  | 
         | 
   165 	conf.env.Append(CCFLAGS="-pg", LINKFLAGS="-pg")  | 
   150   | 
   166   | 
   151 env = conf.Finish()  | 
   167 env = conf.Finish()  | 
   152   | 
   168   | 
   153   | 
   169   | 
   154 ### build targets  | 
   170 ### build targets  | 
   155   | 
   171   | 
   156 (lib, pymodule) = SConscript('src/SConscript', build_dir='build/lib', duplicate=0, exports='env') | 
   172 lib = SConscript('src/SConscript', build_dir='build/lib', duplicate=0, exports={'env':env,'buildmodule':False}) | 
         | 
   173 pymodule = SConscript('src/SConscript', build_dir='build/pymodule', duplicate=0, exports={'env':env,'buildmodule':True}) | 
   157   | 
   174   | 
   158 SConscript('ccdemos/SConscript', build_dir='build/ccdemos', duplicate=0, exports='env lib') | 
   175 SConscript('ccdemos/SConscript', build_dir='build/ccdemos', duplicate=0, exports='env lib') | 
   159 SConscript('demos/SConscript', exports='pymodule') | 
   176 SConscript('demos/SConscript', exports='pymodule') | 
   160 env.Alias('demos', ['cc-demos', 'python-demos']) | 
   177 env.Alias('demos', ['cc-demos', 'python-demos']) | 
   161   | 
   178   | 
   162 SConscript('tests/SConscript', build_dir='build/tests', duplicate=0, exports='env lib') | 
   179 SConscript('tests/SConscript', build_dir='build/tests', duplicate=0, exports='env lib') | 
   163   | 
   180   | 
   164 SConscript('models/SConscript') | 
   181 SConscript('models/SConscript') | 
         | 
   182   | 
         | 
   183 env.Alias('libs', ['static-lib', 'python-module']) | 
   165   | 
   184   | 
   166 env.Alias('docs', Command('docs/html', [], 'doxygen')) | 
   185 env.Alias('docs', Command('docs/html', [], 'doxygen')) | 
   167 env.Clean('docs', ['docs/html']) | 
   186 env.Clean('docs', ['docs/html']) | 
   168   | 
   187   | 
   169 env.Alias('no-docs', ['libs', 'demos', 'models']) | 
   188 env.Alias('no-docs', ['libs', 'demos', 'models']) |