Source code for pyomo.contrib.mcpp.build

# ____________________________________________________________________________________
#
# Pyomo: Python Optimization Modeling Objects
# Copyright (c) 2008-2026 National Technology and Engineering Solutions of Sandia, LLC
# Under the terms of Contract DE-NA0003525 with National Technology and Engineering
# Solutions of Sandia, LLC, the U.S. Government retains certain rights in this
# software.  This software is distributed under the 3-clause BSD License.
# ____________________________________________________________________________________

import os
import shutil
import tempfile

import pyomo.common.envvar as envvar

from pyomo.common.fileutils import this_file_dir, find_dir
from pyomo.common.download import FileDownloader


def _generate_configuration():
    # defer the import until use (this eventually imports pkg_resources,
    # which is slow to import)
    from setuptools.extension import Extension

    # Try and find MC++.  Defer to the MCPP_ROOT if it is set;
    # otherwise, look in common locations for a mcpp directory.
    pathlist = [os.path.join(envvar.PYOMO_CONFIG_DIR, 'src'), this_file_dir()]
    if 'MCPP_ROOT' in os.environ:
        mcpp = os.environ['MCPP_ROOT']
    else:
        mcpp = find_dir('mcpp', cwd=True, pathlist=pathlist)
    if mcpp:
        print("Found MC++ at %s" % (mcpp,))
    else:
        raise RuntimeError(
            "Cannot identify the location of the MCPP source distribution"
        )

    #
    # Configuration for this extension
    #
    project_dir = this_file_dir()
    sources = [os.path.join(project_dir, 'mcppInterface.cpp')]
    include_dirs = [
        os.path.join(mcpp, 'src', 'mc'),
        os.path.join(mcpp, 'src', '3rdparty', 'fadbad++'),
    ]

    mcpp_ext = Extension(
        "mcppInterface",
        sources=sources,
        language="c++",
        extra_compile_args=[],
        include_dirs=include_dirs,
        library_dirs=[],
        libraries=[],
    )

    package_config = {'name': 'mcpp', 'packages': [], 'ext_modules': [mcpp_ext]}

    return package_config


[docs] def build_mcpp(): from setuptools import Distribution from setuptools.command.build_ext import build_ext class _BuildWithoutPlatformInfo(build_ext, object): # Python3.x puts platform information into the generated SO file # name, which is usually fine for python extensions, but since this # is not a "real" extension, we will hijack things to remove the # platform information from the filename so that Pyomo can more # easily locate it. Note that build_ext is not a new-style class in # Python 2.7, so we will add an explicit inheritance from object so # that super() works. def get_ext_filename(self, ext_name): filename = ( super(_BuildWithoutPlatformInfo, self) .get_ext_filename(ext_name) .split('.') ) filename = '.'.join([filename[0], filename[-1]]) return filename print("\n**** Building MCPP library ****") package_config = _generate_configuration() package_config['cmdclass'] = {'build_ext': _BuildWithoutPlatformInfo} dist = Distribution(package_config) install_dir = os.path.join(envvar.PYOMO_CONFIG_DIR, 'lib') dist.get_command_obj('install_lib').install_dir = install_dir try: basedir = os.path.abspath(os.path.curdir) tmpdir = os.path.abspath(tempfile.mkdtemp()) print(" tmpdir = %s" % (tmpdir,)) os.chdir(tmpdir) dist.run_command('install_lib') print("Installed mcppInterface to %s" % (install_dir,)) finally: os.chdir(basedir) shutil.rmtree(tmpdir)
[docs] class MCPPBuilder: def __call__(self, parallel): return build_mcpp() def skip(self): return FileDownloader.get_sysinfo()[0] == 'windows'
if __name__ == "__main__": build_mcpp()