Skip to content
Snippets Groups Projects
doris.py 5.66 KiB
Newer Older
  • Learn to ignore specific revisions
  • ##
    # Copyright 2009-2017 Ghent University
    #
    # This file is part of EasyBuild,
    # originally created by the HPC team of Ghent University (http://ugent.be/hpc/en),
    # with support of Ghent University (http://ugent.be/hpc),
    # the Flemish Supercomputer Centre (VSC) (https://www.vscentrum.be),
    # Flemish Research Foundation (FWO) (http://www.fwo.be/en)
    # and the Department of Economy, Science and Innovation (EWI) (http://www.ewi-vlaanderen.be/en).
    #
    # http://github.com/hpcugent/easybuild
    #
    # EasyBuild is free software: you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation v2.
    #
    # EasyBuild is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with EasyBuild.  If not, see <http://www.gnu.org/licenses/>.
    ##
    """
    EasyBuild support for building and installing Doris, implemented as an easyblock
    
    author: Kenneth Hoste (HPC-UGent)
    """
    import os
    
    from easybuild.easyblocks.generic.configuremake import ConfigureMake
    from easybuild.tools.build_log import EasyBuildError
    from easybuild.tools.filetools import change_dir, mkdir
    from easybuild.tools.modules import get_software_root
    from easybuild.tools.run import run_cmd_qa
    
    
    class EB_Doris(ConfigureMake):
        """Support for building/installing Doris."""
    
        def configure_step(self):
            """Custom configuration procedure for Doris."""
            fftw = get_software_root('FFTW')
            if fftw is None:
                raise EasyBuildError("Required dependency FFTW is missing")
            
            # create installation directory (and /bin subdirectory) early, make sure it doesn't get removed later
            self.make_installdir()
            mkdir(os.path.join(self.installdir, 'bin'))
            self.cfg['keeppreviousinstall'] = True
    
            # configure/build/install should be done from 'doris_core' subdirectory
            change_dir(os.path.join(self.cfg['start_dir'], 'doris_core'))
    
            qa = {
                "===> Press enter to continue.": '',
                "===> What is your C++ compiler? [g++]": os.getenv('CXX'),
                "===> Do you have the FFTW library (y/n)? [n]": 'y',
                "===> What is the path to the FFTW library (libfftw3f.a or libfftw3f.so)? []": os.path.join(fftw, 'lib'),
                "===> What is the path to the FFTW include file (fftw3.h)? []": os.path.join(fftw, 'include'),
                "===> Do you have the VECLIB library (y/n)? [n]": 'n',
                #"===> Do you have the LAPACK library (y/n)? [n]": 'y',
                #"===> What is the path to the LAPACK library liblapack.a? []": os.path.join(lapack, 'lib'),
                "==> Do you have the LAPACK library (y/n)? [n]": 'n',
                "===> Are you working on a Little Endian (X86 PC, Intel) machine (y/n)? [y]": 'y',
                "===> Installation of Doris in directory: /usr/local/bin (y/n)? [y]": 'n',
                "===> Enter installation directory (use absolute path):": os.path.join(self.installdir, 'bin'),
                "===> Press enter to continue (CTRL-C to exit).": '',
            }
            std_qa = {
                "===> Do you want to compile a more verbose DEBUG version \(y/n\)\? \[n\](.|\n)*expected results\)": 'n',
            }
    
            run_cmd_qa('./configure', qa, std_qa=std_qa, log_all=True, simple=True)
    
        def build_step(self):
            """Custom build procedure for Doris."""
            common_buildopts = self.cfg['buildopts']
    
            # build Doris
            change_dir(os.path.join(self.cfg['start_dir'], 'doris_core'))
    
            super(EB_Doris, self).build_step()
    
            # build SARtools
            change_dir(os.path.join(self.cfg['start_dir'], 'sar_tools'))
    
            self.cfg['buildopts'] = common_buildopts
            self.cfg.update('buildopts', 'CC="%s"' % os.getenv('CXX'))
            cflags = os.getenv('CXXFLAGS') + " -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE"
            self.cfg.update('buildopts', 'CFLAGS="%s"' % cflags)
    
            super(EB_Doris, self).build_step()
    
            # build ENVISAT_TOOLS
            change_dir(os.path.join(self.cfg['start_dir'], 'envisat_tools'))
    
            self.cfg['buildopts'] = common_buildopts
            self.cfg.update('buildopts', 'CC="%s"' % os.getenv('CC'))
            self.cfg.update('buildopts', 'CFLAGS="%s"' % os.getenv('CFLAGS'))
    
            super(EB_Doris, self).build_step()
    
        def install_step(self):
            """Custom build procedure for Doris."""
            # install Doris
            change_dir(os.path.join(self.cfg['start_dir'], 'doris_core'))
            super(EB_Doris, self).install_step()
    
            # install SARtools
            self.cfg.update('installopts', 'INSTALL_DIR=%s' % os.path.join(self.installdir, 'bin'))
            change_dir(os.path.join(self.cfg['start_dir'], 'sar_tools'))
            super(EB_Doris, self).install_step()
    
            # install ENVISAT_TOOLS
            change_dir(os.path.join(self.cfg['start_dir'], 'envisat_tools'))
            self.cfg.update('installopts', 'CC="%s"' % os.getenv('CC'))
            self.cfg.update('installopts', 'CFLAGS="%s"' % os.getenv('CFLAGS'))
            super(EB_Doris, self).install_step()
    
        def sanity_check_step(self):
            """Custom sanity check for Doris."""
            doris_bins = ['cpx2ps', 'doris', 'plotcpm', 'run']
            sartools_bins = ['bkconvert', 'cpxfiddle', 'flapjack', 'floatmult', 'wrap']
            envisat_tools_bins = ['envisat_dump_header', 'envisat_dump_data']
            custom_paths = {
                'files': [os.path.join('bin', x) for x in doris_bins + sartools_bins + envisat_tools_bins],
                'dirs': [],
            }
            super(EB_Doris, self).sanity_check_step(custom_paths=custom_paths)