def build_extension(self, ext, general_cmake_args, general_build_args): extdir = os.path.abspath(os.path.dirname(self.get_ext_fullpath(ext.name))) cmake_args = ['-DCMAKE_LIBRARY_OUTPUT_DIRECTORY=' + os.path.join(extdir, ext.subdir)] + general_cmake_args build_args = general_build_args env = os.environ.copy() env['CXXFLAGS'] = '{} -DVERSION_INFO=\\"{}\\"'.format(env.get('CXXFLAGS', ''), self.distribution.get_version()) setup_helper.ensure_dir_exists(self.build_temp) print("Pycarl - CMake args={}".format(cmake_args)) # Call cmake subprocess.check_call(['cmake', ext.sourcedir] + cmake_args, cwd=self.build_temp, env=env) subprocess.check_call(['cmake', '--build', '.', '--target', ext.name] + build_args, cwd=self.build_temp)
def run(self): try: _ = subprocess.check_output(['cmake', '--version']) except OSError: raise RuntimeError("CMake must be installed to build the following extensions: " + ", ".join(e.name for e in self.extensions)) # Build cmake version info build_temp_version = self.build_temp + "-version" setup_helper.ensure_dir_exists(build_temp_version) # Write config setup_helper.ensure_dir_exists("build") self.config.write_config("build/build_config.cfg") cmake_args = [] carl_dir = os.path.expanduser(self.config.get_as_string("carl_dir")) carl_parser_dir = os.path.expanduser(self.config.get_as_string("carl_parser_dir")) if carl_dir: cmake_args += ['-Dcarl_DIR=' + carl_dir] if carl_parser_dir: cmake_args += ['-Dcarl_parser_DIR=' + carl_parser_dir] output = subprocess.check_output(['cmake', os.path.abspath("cmake")] + cmake_args, cwd=build_temp_version) cmake_conf = setup_helper.load_cmake_config(os.path.join(build_temp_version, 'generated/config.py')) # Set carl directory if carl_dir == "": carl_dir = cmake_conf.CARL_DIR if carl_dir != cmake_conf.CARL_DIR: print("Pycarl - Warning: Using different carl directory {} instead of given {}!".format(cmake_conf.CARL_DIR, carl_dir)) carl_dir = cmake_conf.CARL_DIR # Set carl-parser directory if carl_parser_dir == "": carl_parser_dir = cmake_conf.CARL_PARSER_DIR if carl_parser_dir != cmake_conf.CARL_PARSER_DIR: print("Pycarl - Warning: Using different carl-parser directory {} instead of given {}!".format( cmake_conf.CARL_PARSER_DIR, carl_parser_dir)) carl_parser_dir = cmake_conf.CARL_PARSER_DIR # Check version carl_version, carl_commit = setup_helper.parse_carl_version(cmake_conf.CARL_VERSION) if carl_version.startswith(carl_master14_version): print("Pycarl - Using carl with master14 branch.") elif StrictVersion(carl_version) < StrictVersion(carl_min_version): sys.exit("Pycarl - Error: carl version {} from '{}' is not supported anymore!".format(carl_version, carl_dir)) elif StrictVersion(carl_version) > StrictVersion(carl_max_version): sys.exit("Pycarl - Error: carl version {} from '{}' is not supported!".format(carl_version, carl_dir)) # Check additional support use_cln = cmake_conf.CARL_WITH_CLN and not self.config.get_as_bool("disable_cln") use_parser = cmake_conf.CARL_WITH_PARSER and not self.config.get_as_bool("disable_parser") # Print build info print("Pycarl - Using carl {} from {}".format(carl_version, carl_dir)) if use_parser: print("Pycarl - carl parser extension from {} included.".format(carl_parser_dir)) else: print("Pycarl - Warning: No parser support!") if use_cln: print("Pycarl - Support for CLN found and included.") else: print("Pycarl - Warning: No support for CLN!") # Set general cmake build options build_type = 'Debug' if self.config.get_as_bool("debug") else 'Release' cmake_args = ['-DPYTHON_EXECUTABLE=' + sys.executable] cmake_args += ['-DCMAKE_BUILD_TYPE=' + build_type] if carl_dir is not None: cmake_args += ['-Dcarl_DIR=' + carl_dir] if use_parser and carl_parser_dir: cmake_args += ['-Dcarl_parser_DIR=' + carl_parser_dir] build_args = ['--config', build_type] build_args += ['--', '-j{}'.format(self.config.get_as_int("jobs"))] # Build extensions for ext in self.extensions: setup_helper.ensure_dir_exists(os.path.join(self._extdir(ext.name), ext.subdir)) if "core" in ext.name: with open(os.path.join(self._extdir(ext.name), ext.subdir, "_config.py"), "w") as f: f.write("# Generated from setup.py at {}\n".format(datetime.datetime.now())) f.write('CARL_VERSION = "{}"\n'.format(carl_version)) f.write("CARL_WITH_PARSER = {}\n".format(use_parser)) f.write("CARL_WITH_CLN = {}\n".format(use_cln)) if "cln" in ext.name: with open(os.path.join(self._extdir(ext.name), ext.subdir, "_config.py"), "w") as f: f.write("# Generated from setup.py at {}\n".format(datetime.datetime.now())) f.write("CARL_WITH_CLN = {}\n".format(use_cln)) if not use_cln: print("Pycarl - CLN bindings skipped") continue if "parse" in ext.name: with open(os.path.join(self._extdir(ext.name), ext.subdir, "_config.py"), "w") as f: f.write("# Generated from setup.py at {}\n".format(datetime.datetime.now())) f.write("CARL_WITH_PARSER = {}\n".format(use_parser)) if not use_parser: print("Pycarl - Parser bindings skipped") continue self.build_extension(ext, cmake_args, build_args)
def run(self): try: _ = subprocess.check_output(['cmake', '--version']) except OSError: raise RuntimeError("CMake must be installed to build the following extensions: " + ", ".join(e.name for e in self.extensions)) # Build cmake version info print("Stormpy - Building into {}".format(self.build_temp)) build_temp_version = self.build_temp + "-version" setup_helper.ensure_dir_exists(build_temp_version) # Write config setup_helper.ensure_dir_exists(self.build_temp) self.config.write_config(os.path.join(self.build_temp, "build_config.cfg")) cmake_args = [] storm_dir = os.path.expanduser(self.config.get_as_string("storm_dir")) if storm_dir: cmake_args += ['-Dstorm_DIR=' + storm_dir] _ = subprocess.check_output(['cmake', os.path.abspath("cmake")] + cmake_args, cwd=build_temp_version) cmake_conf = setup_helper.load_cmake_config(os.path.join(build_temp_version, 'generated/config.py')) # Set storm directory if storm_dir == "": storm_dir = cmake_conf.STORM_DIR if storm_dir != cmake_conf.STORM_DIR: print("Stormpy - Warning: Using different storm directory {} instead of given {}!".format( cmake_conf.STORM_DIR, storm_dir)) storm_dir = cmake_conf.STORM_DIR # Check version storm_version, storm_commit = setup_helper.parse_storm_version(cmake_conf.STORM_VERSION) if StrictVersion(storm_version) < StrictVersion(storm_min_version): sys.exit( 'Stormpy - Error: Storm version {} from \'{}\' is not supported anymore!'.format(storm_version, storm_dir)) # Check additional support use_dft = cmake_conf.HAVE_STORM_DFT and not self.config.get_as_bool("disable_dft") use_pars = cmake_conf.HAVE_STORM_PARS and not self.config.get_as_bool("disable_pars") # Print build info print("Stormpy - Using storm {} from {}".format(storm_version, storm_dir)) if use_dft: print("Stormpy - Support for DFTs found and included.") else: print("Stormpy - Warning: No support for DFTs!") if use_pars: print("Stormpy - Support for parametric models found and included.") else: print("Stormpy - Warning: No support for parametric models!") # Set general cmake build options build_type = 'Debug' if self.config.get_as_bool("debug") else 'Release' cmake_args = ['-DPYTHON_EXECUTABLE=' + sys.executable] cmake_args += ['-DCMAKE_BUILD_TYPE=' + build_type] if storm_dir is not None: cmake_args += ['-Dstorm_DIR=' + storm_dir] if use_dft: cmake_args += ['-DHAVE_STORM_DFT=ON'] if use_pars: cmake_args += ['-DHAVE_STORM_PARS=ON'] build_args = ['--config', build_type] build_args += ['--', '-j{}'.format(self.config.get_as_int("jobs"))] # Build extensions for ext in self.extensions: setup_helper.ensure_dir_exists(os.path.join(self._extdir(ext.name), ext.subdir)) if ext.name == "core": with open(os.path.join(self._extdir(ext.name), ext.subdir, "_config.py"), "w") as f: f.write("# Generated from setup.py at {}\n".format(datetime.datetime.now())) f.write("import pycarl\n") if cmake_conf.STORM_CLN_EA or cmake_conf.STORM_CLN_RF: f.write("import pycarl.cln\n") if not cmake_conf.STORM_CLN_EA or not cmake_conf.STORM_CLN_RF: f.write("import pycarl.gmp\n") if cmake_conf.STORM_CLN_EA: f.write("Rational = pycarl.cln.Rational\n") else: f.write("Rational = pycarl.gmp.Rational\n") if cmake_conf.STORM_CLN_RF: rfpackage = "cln" else: rfpackage = "gmp" f.write("RationalRF = pycarl.{}.Rational\n".format(rfpackage)) f.write("Polynomial = pycarl.{}.Polynomial\n".format(rfpackage)) f.write("FactorizedPolynomial = pycarl.{}.FactorizedPolynomial\n".format(rfpackage)) f.write("RationalFunction = pycarl.{}.RationalFunction\n".format(rfpackage)) f.write("FactorizedRationalFunction = pycarl.{}.FactorizedRationalFunction\n".format(rfpackage)) f.write("\n") f.write("storm_with_dft = {}\n".format(use_dft)) f.write("storm_with_pars = {}\n".format(use_pars)) elif ext.name == "info": with open(os.path.join(self._extdir(ext.name), ext.subdir, "_config.py"), "w") as f: f.write("# Generated from setup.py at {}\n".format(datetime.datetime.now())) f.write("storm_version = \"{}\"\n".format(storm_version)) f.write("storm_cln_ea = {}\n".format(cmake_conf.STORM_CLN_EA)) f.write("storm_cln_rf = {}".format(cmake_conf.STORM_CLN_RF)) elif ext.name == "dft": with open(os.path.join(self._extdir(ext.name), ext.subdir, "_config.py"), "w") as f: f.write("# Generated from setup.py at {}\n".format(datetime.datetime.now())) f.write("storm_with_dft = {}".format(use_dft)) if not use_dft: print("Stormpy - DFT bindings skipped") continue elif ext.name == "pars": with open(os.path.join(self._extdir(ext.name), ext.subdir, "_config.py"), "w") as f: f.write("# Generated from setup.py at {}\n".format(datetime.datetime.now())) f.write("storm_with_pars = {}".format(use_pars)) if not use_pars: print("Stormpy - Bindings for parametric models skipped") continue self.build_extension(ext, cmake_args, build_args)