def configure_step(self, cmd_prefix=''): """ Configure with Meson. """ # make sure both Meson and Ninja are included as build dependencies build_dep_names = [d['name'] for d in self.cfg.builddependencies()] for tool in ['Ninja', 'Meson']: if tool not in build_dep_names: raise EasyBuildError("%s not included as build dependency", tool) cmd = tool.lower() if not which(cmd): raise EasyBuildError("'%s' command not found", cmd) if self.cfg.get('separate_build_dir', True): builddir = create_unused_dir(self.builddir, 'easybuild_obj') change_dir(builddir) # Make sure libdir doesn't get set to lib/x86_64-linux-gnu or something # on Debian/Ubuntu multiarch systems and others. no_Dlibdir = '-Dlibdir' not in self.cfg['configopts'] no_libdir = '--libdir' not in self.cfg['configopts'] if no_Dlibdir and no_libdir: self.cfg.update('configopts', '-Dlibdir=lib') cmd = "%(preconfigopts)s meson --prefix %(installdir)s %(configopts)s %(sourcedir)s" % { 'configopts': self.cfg['configopts'], 'installdir': self.installdir, 'preconfigopts': self.cfg['preconfigopts'], 'sourcedir': self.start_dir, } (out, _) = run_cmd(cmd, log_all=True, simple=False) return out
def configure_step(self, srcdir=None, builddir=None): """Configure build using cmake""" setup_cmake_env(self.toolchain) if builddir is None and self.cfg.get('separate_build_dir', True): builddir = create_unused_dir(self.builddir, 'easybuild_obj') if builddir: mkdir(builddir, parents=True) change_dir(builddir) default_srcdir = self.cfg['start_dir'] else: default_srcdir = '.' if srcdir is None: if self.cfg.get('srcdir', None) is not None: # Note that the join returns srcdir if it is absolute srcdir = os.path.join(default_srcdir, self.cfg['srcdir']) else: srcdir = default_srcdir install_target = self.installdir install_target_subdir = self.cfg.get('install_target_subdir') if install_target_subdir: install_target = os.path.join(install_target, install_target_subdir) options = ['-DCMAKE_INSTALL_PREFIX=%s' % install_target] if self.installdir.startswith('/opt') or self.installdir.startswith('/usr'): # https://cmake.org/cmake/help/latest/module/GNUInstallDirs.html localstatedir = os.path.join(self.installdir, 'var') runstatedir = os.path.join(localstatedir, 'run') sysconfdir = os.path.join(self.installdir, 'etc') options.append("-DCMAKE_INSTALL_LOCALSTATEDIR=%s" % localstatedir) options.append("-DCMAKE_INSTALL_RUNSTATEDIR=%s" % runstatedir) options.append("-DCMAKE_INSTALL_SYSCONFDIR=%s" % sysconfdir) if '-DCMAKE_BUILD_TYPE=' in self.cfg['configopts']: if self.cfg.get('build_type') is not None: self.log.warning('CMAKE_BUILD_TYPE is set in configopts. Ignoring build_type') else: options.append('-DCMAKE_BUILD_TYPE=%s' % self.build_type) # Add -fPIC flag if necessary if self.toolchain.options['pic']: options.append('-DCMAKE_POSITION_INDEPENDENT_CODE=ON') if self.cfg['generator']: options.append('-G "%s"' % self.cfg['generator']) # pass --sysroot value down to CMake, # and enable using absolute paths to compiler commands to avoid # that CMake picks up compiler from sysroot rather than toolchain compiler... sysroot = build_option('sysroot') if sysroot: options.append('-DCMAKE_SYSROOT=%s' % sysroot) self.log.info("Using absolute path to compiler commands because of alterate sysroot %s", sysroot) self.cfg['abs_path_compilers'] = True # Set flag for shared libs if requested # Not adding one allows the project to choose a default build_shared_libs = self.cfg.get('build_shared_libs') if build_shared_libs is not None: # Contrary to other options build_shared_libs takes precedence over configopts which may be unexpected. # This is to allow self.lib_ext to be determined correctly. # Usually you want to remove -DBUILD_SHARED_LIBS from configopts and set build_shared_libs to True or False # If you need it in configopts don't set build_shared_libs (or explicitely set it to `None` (Default)) if '-DBUILD_SHARED_LIBS=' in self.cfg['configopts']: print_warning('Ignoring BUILD_SHARED_LIBS is set in configopts because build_shared_libs is set') self.cfg.update('configopts', '-DBUILD_SHARED_LIBS=%s' % ('ON' if build_shared_libs else 'OFF')) env_to_options = { 'CC': 'CMAKE_C_COMPILER', 'CFLAGS': 'CMAKE_C_FLAGS', 'CXX': 'CMAKE_CXX_COMPILER', 'CXXFLAGS': 'CMAKE_CXX_FLAGS', 'F90': 'CMAKE_Fortran_COMPILER', 'FFLAGS': 'CMAKE_Fortran_FLAGS', } for env_name, option in env_to_options.items(): value = os.getenv(env_name) if value is not None: if option.endswith('_COMPILER') and self.cfg.get('abs_path_compilers', False): value = which(value) self.log.info("Using absolute path to compiler command: %s", value) options.append("-D%s='%s'" % (option, value)) if build_option('rpath'): # instruct CMake not to fiddle with RPATH when --rpath is used, since it will undo stuff on install... # https://github.com/LLNL/spack/blob/0f6a5cd38538e8969d11bd2167f11060b1f53b43/lib/spack/spack/build_environment.py#L416 options.append('-DCMAKE_SKIP_RPATH=ON') # show what CMake is doing by default options.append('-DCMAKE_VERBOSE_MAKEFILE=ON') # disable CMake user package repository options.append('-DCMAKE_FIND_USE_PACKAGE_REGISTRY=FALSE') if not self.cfg.get('allow_system_boost', False): boost_root = get_software_root('Boost') if boost_root: # Check for older builds of Boost cmake_files = glob.glob(os.path.join(boost_root, 'lib', 'cmake', 'boost_system*', 'libboost_system-variant*-shared.cmake')) cmake_files = [os.path.basename(x) for x in cmake_files] if len(cmake_files) > 1 and 'libboost_system-variant-shared.cmake' in cmake_files: # disable search for Boost CMake package configuration files when conflicting variant configs # are present (builds using the old EasyBlock) options.append('-DBoost_NO_BOOST_CMAKE=ON') # Don't pick up on system Boost if Boost is included as dependency # - specify Boost location via -DBOOST_ROOT # - instruct CMake to not search for Boost headers/libraries in other places options.extend([ '-DBOOST_ROOT=%s' % boost_root, '-DBoost_NO_SYSTEM_PATHS=ON', ]) options_string = ' '.join(options) if self.cfg.get('configure_cmd') == DEFAULT_CONFIGURE_CMD: command = ' '.join([ self.cfg['preconfigopts'], DEFAULT_CONFIGURE_CMD, options_string, self.cfg['configopts'], srcdir]) else: command = ' '.join([ self.cfg['preconfigopts'], self.cfg.get('configure_cmd'), self.cfg['configopts']]) (out, _) = run_cmd(command, log_all=True, simple=False) return out