254 lines
10 KiB
Python
254 lines
10 KiB
Python
#!/usr/bin/env python
|
|
|
|
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
# Copyright 2010 California Institute of Technology. ALL RIGHTS RESERVED.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
# United States Government Sponsorship acknowledged. This software is subject to
|
|
# U.S. export control laws and regulations and has been classified as 'EAR99 NLR'
|
|
# (No [Export] License Required except when exporting to an embargoed country,
|
|
# end user, or in support of a prohibited end use). By downloading this software,
|
|
# the user agrees to comply with all applicable U.S. export laws and regulations.
|
|
# The user has the responsibility to obtain export licenses, or other export
|
|
# authority as may be required before exporting this software to any 'EAR99'
|
|
# embargoed foreign country or citizen of those countries.
|
|
#
|
|
# Author: Giangi Sacco
|
|
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
|
|
import os
|
|
import sys
|
|
|
|
if sys.version_info[0] == 2:
|
|
print('Building with scons from python2')
|
|
else:
|
|
raw_input = input
|
|
print('Building with scons from python3')
|
|
|
|
if 'SCONS_CONFIG_DIR' in os.environ:
|
|
sconsConfigDir = os.environ['SCONS_CONFIG_DIR']
|
|
else:
|
|
print("Error. Need to set the variable SCONS_CONFIG_DIR in the shell environment")
|
|
raise Exception
|
|
|
|
from configuration import sconsConfigFile
|
|
#allow scons to take the input argument --setupfile=someOtherFile to allow change of the default SConfigISCE
|
|
AddOption('--setupfile',dest='setupfile',type='string',default='SConfigISCE')
|
|
AddOption('--isrerun',dest='isrerun',type='string',default='no')
|
|
AddOption('--skipcheck',dest='skipcheck', action='store_true', default=False)
|
|
|
|
env = Environment(ENV = os.environ)
|
|
sconsSetupFile = GetOption('setupfile')
|
|
isrerun = GetOption('isrerun')
|
|
skipcheck = GetOption('skipcheck')
|
|
|
|
sconsConfigFile.setupScons(env,sconsSetupFile)
|
|
#add some information that are necessary to build the framework such as specific includes, libpath and so on
|
|
buildDir = env['PRJ_SCONS_BUILD']
|
|
libPath = os.path.join(buildDir,'libs')
|
|
#this is the directory where all the built library are put so they can easily be found during linking
|
|
env['PRJ_LIB_DIR'] = libPath
|
|
|
|
# add the libPath to the LIBPATH environment that is where all the libs are serched
|
|
env.AppendUnique(LIBPATH = [libPath])
|
|
# add the modPath to the FORTRANMODDIR environment that is where all the fortran mods are searched
|
|
|
|
#not working yet
|
|
modPath = os.path.join(buildDir,'mods')
|
|
env['FORTRANMODDIR'] = modPath
|
|
env.AppendUnique(FORTRANPATH = [modPath])
|
|
env.AppendUnique(F90PATH = [modPath])
|
|
env.AppendUnique(F77PATH = [modPath])
|
|
#add the includes needed by the framework
|
|
imageApiInc = os.path.join(buildDir,'components/iscesys/ImageApi/include')
|
|
dataCasterInc = os.path.join(buildDir,'components/iscesys/ImageApi/DataCaster/include')
|
|
lineAccessorInc = os.path.join(buildDir,'components/isceobj/LineAccessor/include')
|
|
stdOEInc = os.path.join(buildDir,'components/iscesys/StdOE/include')
|
|
utilInc = os.path.join(buildDir,'components/isceobj/Util/include')
|
|
utilLibInc = os.path.join(buildDir,'components/isceobj/Util/Library/include')
|
|
|
|
env.AppendUnique(CPPPATH = [imageApiInc,dataCasterInc,lineAccessorInc,stdOEInc,utilInc,utilLibInc])
|
|
env['HELPER_DIR'] = os.path.join(env['PRJ_SCONS_INSTALL'],'helper')
|
|
env['HELPER_BUILD_DIR'] = os.path.join(env['PRJ_SCONS_BUILD'],'helper')
|
|
|
|
#put the pointer function createHelp in the environment so it can be access anywhere
|
|
from configuration.buildHelper import createHelp
|
|
env['HELP_BUILDER'] = createHelp
|
|
#Create an env variable to hold all the modules added to the sys.path by default.
|
|
#They are the same as the one in in __init__.py in the same directory of this file
|
|
moduleList = []
|
|
installDir = env['PRJ_SCONS_INSTALL']
|
|
moduleList.append(os.path.join(installDir,'applications'))
|
|
moduleList.append(os.path.join(installDir,'components'))
|
|
env['ISCEPATH'] = moduleList
|
|
env.PrependUnique(LIBS=['gdal'])
|
|
Export('env')
|
|
|
|
|
|
inst = env['PRJ_SCONS_INSTALL']
|
|
|
|
####new part
|
|
#####PSA. Check for header files and libraries up front
|
|
confinst = Configure(env)
|
|
hdrparams = [('python3 header', 'Python.h', 'Install python3-dev or add path to Python.h to CPPPATH'),
|
|
('fftw3', 'fftw3.h', 'Install fftw3 or libfftw3-dev or add path to fftw3.h to CPPPATH and FORTRANPATH'),
|
|
('hdf5', 'hdf5.h', 'Install HDF5 of libhdf5-dev or add path to hdf5.h to CPPPATH'),
|
|
('X11', 'X11/Xlib.h', 'Install X11 or libx11-dev or add path to X11 directory to X11INCPATH'),
|
|
('Xm', 'Xm/Xm.h', 'Install libXm or libXm-dev or add path to Xm directory to MOTIFINCPATH'),
|
|
('openmp', 'omp.h', 'Compiler not built with OpenMP. Use a different compiler or add path to omp.h to CPPPATH'),]
|
|
|
|
allflag = False
|
|
for (name,hname,msg) in hdrparams:
|
|
if not (confinst.CheckCHeader(hname) or confinst.CheckCXXHeader(hname)):
|
|
print('Could not find: {0} header for {1}'.format(hname, name))
|
|
print('Error: {0}'.format(msg))
|
|
allflag = True
|
|
|
|
libparams= [('libhdf5', 'hdf5', 'Install hdf5 or libhdf5-dev'),
|
|
('libfftw3f', 'fftw3f', 'Install fftw3 or libfftw3-dev'),
|
|
('libXm', 'Xm', 'Install Xm or libXm-dev'),
|
|
('libXt', 'Xt', 'Install Xt or libXt-dev')]
|
|
|
|
for (name,hname,msg) in libparams:
|
|
if not confinst.CheckLib(hname):
|
|
print('Could not find: {0} lib for {1}'.format(hname, name))
|
|
print('Error: {0}'.format(msg))
|
|
allflag = True
|
|
|
|
if env.FindFile('fftw3.f', env['FORTRANPATH']) is None:
|
|
print('Checking for F include fftw3 ... no')
|
|
print('Could not find: fftw3.f header for fftw3')
|
|
print('Error: Install fftw3 or libfftw3-dev or add path to FORTRANPATH')
|
|
allflag = True
|
|
else:
|
|
print('Checking for F include fftw3 ... yes'.format(name))
|
|
|
|
|
|
###This part added to handle GDAL and C++11
|
|
gdal_version = os.popen('gdal-config --version').read()
|
|
print('GDAL version: {0}'.format(gdal_version))
|
|
try:
|
|
gdal_majorversion = int(gdal_version.split('.')[0])
|
|
gdal_subversion = int(gdal_version.split('.')[1])
|
|
except:
|
|
raise Exception('gdal-config not found. GDAL does not appear to be installed ... cannot proceed. If you have installed gdal, ensure that you have path to gdal-config in your environment')
|
|
|
|
env['GDALISCXX11'] = None
|
|
if (gdal_majorversion > 2) or (gdal_subversion >= 3):
|
|
env['GDALISCXX11'] = 'True'
|
|
|
|
|
|
##Add C++11 for GDAL checks
|
|
#Save default environment if C++11
|
|
if env['GDALISCXX11']:
|
|
preCXX11 = confinst.env['CXXFLAGS']
|
|
confinst.env.Replace(CXXFLAGS=preCXX11 + ['-std=c++11'])
|
|
|
|
if not confinst.CheckCXXHeader('gdal_priv.h'):
|
|
print('Could not find: gdal_priv.h for gdal')
|
|
print('Install gdal or add path to gdal includes to CPPPATH')
|
|
allflag = True
|
|
|
|
if not confinst.CheckLib('gdal'):
|
|
print('Could not find: libgdal for gdal')
|
|
print('Install gdal or include path to libs to LIBPATH')
|
|
allflag = True
|
|
|
|
###If C++11, revert to original environment
|
|
if env['GDALISCXX11']:
|
|
confinst.env.Replace(CXXFLAGS=preCXX11)
|
|
|
|
|
|
###Decide whether to complain or continue
|
|
if (allflag and not skipcheck):
|
|
print('Not all components of ISCE will be installed and can result in errors.')
|
|
raw_input('Press Enter to continue.... Ctrl-C to exit')
|
|
elif (allflag and skipcheck):
|
|
print('Not all components of ISCE will be installed and can result in errors.')
|
|
print('User has requested to skip checks. Expect failures ... continuing')
|
|
else:
|
|
print('Scons appears to find everything needed for installation')
|
|
|
|
try:
|
|
# Older versions of scons do not have CheckProg, so 'try' to use it
|
|
if confinst.CheckProg('cython3'):
|
|
env['CYTHON3'] = True
|
|
else:
|
|
print('cython3 is not installed. Packages that depend on cython3 will not be installed.')
|
|
env['CYTHON3'] = False
|
|
except:
|
|
# If CheckProg is not available set env['CYTHON3'] = True and hope for the best
|
|
# If the cython3 link does not exist, then a later error should prompt the user to
|
|
# create the cython3 link to their cython installed as cython.
|
|
env['CYTHON3'] = True
|
|
pass
|
|
|
|
env = confinst.Finish()
|
|
###End of new part
|
|
|
|
### GPU branch-specific modifications
|
|
if 'ENABLE_CUDA' in env and env['ENABLE_CUDA'].upper() == 'TRUE':
|
|
print('User requested compilation with CUDA, if available')
|
|
try:
|
|
env.Tool('cuda', toolpath=['scons_tools'])
|
|
env['GPU_ACC_ENABLED'] = True
|
|
print("CUDA-relevant libraries and toolkit found. GPU acceleration may be enabled.")
|
|
except:
|
|
env['GPU_ACC_ENABLED'] = False
|
|
print("CUDA-relevant libraries or toolkit not found. GPU acceleration will be disabled.")
|
|
else:
|
|
print('User did not request CUDA support. Add ENABLE_CUDA = True to SConfigISCE to enable CUDA support')
|
|
env['GPU_ACC_ENABLED'] = False
|
|
|
|
### End of GPU branch-specific modifications
|
|
|
|
|
|
env.Install(inst, '__init__.py')
|
|
env.Install(inst, 'release_history.py')
|
|
|
|
if not os.path.exists(inst):
|
|
os.makedirs(inst)
|
|
|
|
v = 0
|
|
if isrerun == 'no':
|
|
cmd = 'scons -Q install --isrerun=yes'
|
|
if skipcheck:
|
|
cmd += ' --skipcheck'
|
|
v = os.system(cmd)
|
|
if v == 0:
|
|
env.Alias('install',inst)
|
|
applications = os.path.join('applications','SConscript')
|
|
SConscript(applications)
|
|
components = os.path.join('components','SConscript')
|
|
SConscript(components)
|
|
defaults = os.path.join('defaults','SConscript')
|
|
SConscript(defaults)
|
|
library = os.path.join('library','SConscript')
|
|
SConscript(library)
|
|
contrib = os.path.join('contrib','SConscript')
|
|
SConscript(contrib)
|
|
|
|
if 'test' in sys.argv:
|
|
#Run the unit tests
|
|
env['Test'] = True
|
|
else:
|
|
#Don't run tests.
|
|
#This option only installs test support package for future test runs.
|
|
env['Test'] = False
|
|
|
|
tests = os.path.join('test', 'SConscript')
|
|
SConscript(tests)
|