def findLibWithHeader(env, libs, header, paths, lang='c++', try_link=True): from SCons.Script.SConscript import Configure inc_path = '' lib_path = '' # 'paths' may be a prefix, so look for lib and include subdirectories if type(paths) == str: # find the header file first for i in 'include', 'include64', 'include32', 'inc': inc = os.path.join(paths, i) if os.path.isfile(os.path.join(inc, header)): inc_path = inc break if inc_path == '': raise RuntimeError('%s not found under %s' % (header, paths)) # now try to find a lib directory for l in 'lib', 'lib64', 'lib32': lp = os.path.join(paths, l) if os.path.isdir(lp): lib_path = lp break if lib_path == '': raise RuntimeError('No lib directory found under %s' % paths) else: if os.path.isfile(os.path.join(paths[0], header)): inc_path = paths[0] else: raise RuntimeError('%s not found under %s' % (header, paths[0])) if os.path.isdir(paths[1]): lib_path = paths[1] else: raise RuntimeError('%s is not a valid path.' % paths[1]) if try_link: # now try the library conf = Configure(env.Clone()) conf.env.AppendUnique(CPPPATH=[inc_path]) conf.env.AppendUnique(LIBPATH=[lib_path]) if type(libs) == str: libs = [libs] if len(libs) == 0: libs = [''] # we can't check for each library by itself since they may depend on # each other, so we add all libraries to the link line and check only # for one conf.env.AppendUnique(LIBS=libs) if not conf.CheckLibWithHeader(libs[0], header, lang): conf.Finish() raise RuntimeError('Unable to link against %s (paths: %s, %s)' % (libs, inc_path, lib_path)) conf.Finish() return inc_path, lib_path
def checkCompiler(env): conf = Configure(env.Clone(), custom_tests = {'CheckComplexAcos': CheckComplexAcos}) if 'CheckCXX' in dir(conf): # exists since scons 1.1.0 if not conf.CheckCXX(): print("Cannot run C++ compiler '%s' (check config.log)" % (env['CXX'])) env.Exit(1) else: if not conf.CheckFunc('printf', language='c++'): print("Cannot run C++ compiler '%s' (check config.log)" % (env['CXX'])) env.Exit(1) conf.env['buildvars']['cxx']=conf.env['CXX'] if conf.CheckFunc('gethostname', language='c++'): conf.env.Append(CPPDEFINES = ['HAVE_GETHOSTNAME']) if conf.CheckCXXHeader('byteswap.h'): checkhdr="""#include <byteswap.h> #define SCbswap32() {int x=0;bswap_32(x);}""" if conf.CheckFunc('SCbswap32', header=checkhdr, language='c++'): conf.env.Append(CPPDEFINES = ['HAVE_BYTESWAP_H']) if conf.CheckCXXHeader('sys/endian.h'): conf.env.Append(CPPDEFINES = ['HAVE_SYS_ENDIAN_H']) if conf.CheckCXXHeader('libkern/OSByteOrder.h'): conf.env.Append(CPPDEFINES = ['HAVE_OSBYTEORDER_H']) if not conf.CheckComplexAcos(): conf.env.Append(CPPDEFINES = ['ESYS_USE_BOOST_ACOS']) return conf.Finish()
def checkNumpy(env): if not detectModule(env, 'numpy'): print( "Cannot import numpy. If it is installed try setting your PYTHONPATH and probably %s" % env['LD_LIBRARY_PATH_KEY']) env.Exit(1) ## check for numpy header (optional) conf = Configure(env.Clone()) numpy_h = False if conf.CheckCXXHeader(['Python.h', 'numpy/ndarrayobject.h']): numpy_h = True else: conda_prefix = os.environ.get('CONDA_PREFIX') if conda_prefix: # make a copy of CPPPATH so it can be restored if header check fails cpp_path_old = conf.env.get('CPPPATH', []).copy() conf.env.Append(CPPPATH=[ conda_prefix + '/Lib/site-packages/numpy/core/include' ]) if conf.CheckCXXHeader(['Python.h', 'numpy/ndarrayobject.h']): numpy_h = True else: conf.env['CPPPATH'] = cpp_path_old conf.env['numpy_h'] = numpy_h if numpy_h: conf.env.Append(CPPDEFINES=['ESYS_HAVE_NUMPY_H']) return conf.Finish()
def checkPython(env): # First we check to see if the config file has specified # where to find the file. Ideally, this should be automatic # but we need to deal with the case where python is not in its INSTALL # directory. # Use the python scons is running if env['pythoncmd'] == sys.executable: if env['IS_WINDOWS']: python_inc_path=sysconfig.get_python_inc() python_lib_path=os.path.join(sysconfig.get_config_var('prefix'), 'libs') python_libs=['python%s%s'%(sys.version_info[0], sys.version_info[1])] verstring=".".join([str(i) for i in sys.version_info[:3]]) else: (python_lib_path, python_libs,verstring, python_inc_path)=call_python_config() # if we want to use a python other than the one scons is running # Note: we assume scons is running python 2 in the following. else: (python_lib_path, python_libs,verstring, python_inc_path)=call_python_config(env['pythoncmd']) env['python_version'] = verstring ispython3 = (verstring[0] == '3') if ispython3: env.Append(CPPDEFINES=['ESPYTHON3']) env['buildvars']['python_version'] = verstring env['buildvars']['python'] = env['pythoncmd'] # Check for an override from the config file. # Ideally, this should be automatic but we need to deal with the case # where python is not in its INSTALL directory if env['pythonlibpath'] != '': python_lib_path = env['pythonlibpath'] if env['pythonincpath'] != '': python_inc_path = env['pythonincpath'] if env['pythonlibname'] != '': python_libs = env['pythonlibname'] conf = Configure(env.Clone()) if env['sysheaderopt'] == '': conf.env.AppendUnique(CPPPATH = [python_inc_path]) else: conf.env.Append(CCFLAGS = [env['sysheaderopt'], python_inc_path]) conf.env.AppendUnique(LIBPATH = [python_lib_path]) conf.env.AppendUnique(LIBS = python_libs) # The wrapper script needs to find the libs conf.env.PrependENVPath(env['LD_LIBRARY_PATH_KEY'], python_lib_path) if not conf.CheckCXXHeader('Python.h'): print("Cannot find python include files (tried 'Python.h' in directory %s)" % (python_inc_path)) env.Exit(1) if not conf.CheckFunc('Py_Exit', language='c++'): print("Cannot find python library method Py_Exit (tried %s in directory %s)" % (python_libs, python_lib_path)) env.Exit(1) return conf.Finish()
def checkDependencies(env): conf = Configure(env) checkPkgConfig(env, 'gtkmm-2.4') checkPkgConfig(env, 'libxml++-2.6') checkPkgConfig(env, 'gtkglext-1.0') checkPkgConfig(env, 'libgtksourceviewmm-1.0') if not conf.CheckCXXHeader('osg/Node'): raise Exception( 'ERROR: You have to install OSG development package before compiling osgedit' ) return conf.Finish()
def checkNumpy(env): if not detectModule(env, 'numpy'): print("Cannot import numpy. If it is installed try setting your PYTHONPATH and probably %s"%env['LD_LIBRARY_PATH_KEY']) env.Exit(1) ## check for numpy header (optional) conf = Configure(env.Clone()) if conf.CheckCXXHeader(['Python.h','numpy/ndarrayobject.h']): conf.env.Append(CPPDEFINES = ['ESYS_HAVE_NUMPY_H']) conf.env['numpy_h']=True else: conf.env['numpy_h']=False return conf.Finish()
def compileTest(self, env): env.Append(LIBS=['cairo']) conf = Configure(env, conf_dir=self.conf_dir + "/findcairo", log_file=self.conf_dir + "/findcairo/conf.log") result = conf.TryLink( """ #include <cairo.h> int main() { const char* version = cairo_version_string(); return 0; } """, '.c') conf.Finish() return result
def compileTest(self, env): env.Append(LIBS=['freetype']) conf = Configure(env, conf_dir=self.conf_dir + "/findfreetype", log_file=self.conf_dir + "/findfreetype/conf.log") result = conf.TryLink( """ #include <ft2build.h> #include FT_FREETYPE_H int main() { FT_Library library; FT_Init_FreeType( &library ); return 0; } """, '.c') conf.Finish() return result
def compileTest(self, env): env.Append(LIB=['graphite2']) conf = Configure(env, conf_dir=self.conf_dir + "/findgraphite2", log_file=self.conf_dir + "/findgraphite2/conf.log") result = conf.TryLink( """ #include <graphite2/Font.h> int main() { int nMajor, nMinor, nBugFix; gr_engine_version(&nMajor, &nMinor, &nBugFix); return 0; } """, '.c') conf.Finish() return result
def compileTest(self, env): env.Append(LIBS=['glib-2.0']) conf = Configure(env, conf_dir=self.conf_dir + "/findglib2", log_file=self.conf_dir + "/findglib2/conf.log") result = conf.TryLink( """ #include <glib.h> int main() { const gchar* check = glib_check_version ( GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); return (int)check; } """, '.c') conf.Finish() return result
def compileTest(self, env): env.Append(LIB=['icuuc', 'icudata']) conf = Configure(env, conf_dir=self.conf_dir + "/findicu", log_file=self.conf_dir + "/findicu/conf.log") result = conf.TryLink( """ #include <unicode/ucnv.h> int main() { UErrorCode status = U_ZERO_ERROR; UConverter *defConv; defConv = u_getDefaultConverter(&status); if (U_FAILURE(status)) { return 1; } return 0; } """, '.c') conf.Finish() return result
def checkPython(env): # First we check to see if the config file has specified # where to find the file. Ideally, this should be automatic # but we need to deal with the case where python is not in its INSTALL # directory. # Use the python scons is running if env['pythoncmd'] == sys.executable: if env['IS_WINDOWS']: python_inc_path = sysconfig.get_python_inc() python_lib_path = os.path.join(sysconfig.get_config_var('prefix'), 'libs') python_libs = [ 'python%s%s' % (sys.version_info[0], sys.version_info[1]) ] verstring = ".".join([str(i) for i in sys.version_info[:3]]) else: (python_lib_path, python_libs, verstring, python_inc_path) = call_python_config(env['pythoncmd']) # if we want to use a python other than the one scons is running # Note: we assume scons is running python 2 in the following. else: if env['IS_WINDOWS']: cmd = "import os, sys\n" cmd += "from distutils import sysconfig\n" cmd += "print(sysconfig.get_python_inc())\n" cmd += "print(os.path.join(sysconfig.get_config_var('prefix'), 'libs'))\n" cmd += "print('python%s%s'%(sys.version_info[0], sys.version_info[1]))\n" cmd += "print('.'.join([str(i) for i in sys.version_info[:3]]))" pout = subprocess.Popen([env['pythoncmd'], '-c', cmd], stdout=subprocess.PIPE).stdout.read() if isinstance(pout, bytes): pout = pout.decode(sys.stdout.encoding) lines = pout.split('\n') python_inc_path = lines[0].strip() python_lib_path = lines[1].strip() python_libs = [lines[2].strip()] verstring = lines[3].strip() else: (python_lib_path, python_libs, verstring, python_inc_path) = call_python_config(env['pythoncmd']) if sys.version_info[0] == 3: if isinstance(verstring, str) is False: verstring = str(verstring, 'utf-8') else: if isinstance(verstring, basestring) is False: verstring = str(verstring, 'utf-8') env['python_version'] = verstring try: ispython3 = (verstring[0] == '3') except: ispython3 = sys.version_info[0] == 3 if ispython3: env.Append(CPPDEFINES=['ESPYTHON3']) env['buildvars']['python_version'] = verstring env['buildvars']['python'] = env['pythoncmd'] # Check for an override from the config file. # Ideally, this should be automatic but we need to deal with the case # where python is not in its INSTALL directory if env['pythonlibpath'] != '': python_lib_path = env['pythonlibpath'] if env['pythonincpath'] != '': python_inc_path = env['pythonincpath'] if env['pythonlibname'] != '': python_libs = env['pythonlibname'] conf = Configure(env.Clone()) if env['sysheaderopt'] == '': conf.env.AppendUnique(CPPPATH=[python_inc_path]) else: conf.env.Append(CCFLAGS=[env['sysheaderopt'], python_inc_path]) conf.env.AppendUnique(LIBPATH=[python_lib_path]) conf.env.AppendUnique(LIBS=python_libs) # The wrapper script needs to find the libs conf.env.PrependENVPath(env['LD_LIBRARY_PATH_KEY'], python_lib_path) if not conf.CheckCXXHeader('Python.h'): print( "Cannot find python include files (tried 'Python.h' in directory %s)" % (python_inc_path)) env.Exit(1) if not conf.CheckFunc('Py_Exit', language='c++'): print( "Cannot find python library method Py_Exit (tried %s in directory %s)" % (python_libs, python_lib_path)) env.Exit(1) return conf.Finish()