2019-01-16 19:40:08 +00:00
#!/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 :
2019-02-10 18:38:21 +00:00
raw_input = input
2019-01-16 19:40:08 +00:00
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 :
2019-06-10 18:02:42 +00:00
gdal_majorversion = int ( gdal_version . split ( ' . ' ) [ 0 ] )
2019-01-16 19:40:08 +00:00
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
2019-06-10 18:02:42 +00:00
if ( gdal_majorversion > 2 ) or ( gdal_subversion > = 3 ) :
2019-01-16 19:40:08 +00:00
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
2019-12-14 23:30:51 +00:00
env . Install ( inst , ' __init__.py ' )
env . Install ( inst , ' release_history.py ' )
2019-01-16 19:40:08 +00:00
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 )