Hi,

This may be of interest to people developing in Python and C/C++.  I worked out a simple hack to use the petsc4py configuration to build Python extension modules with the correct petsc compilers and options.  We had been doing this using some makefile tricks, but our approach wasn't as reliable as Lisandro's configuration of petsc4py.  I had to hack two of the build_ext functions. You still have to give setup.py the --petsc-dir/--petsc-arch arguments.    It might be a nice feature to install something similar in petsc4py so one could just do 'from petsc4py import PetscExtension'.

Chris 

setup.py
-------------------
from distutils.core import setup
sys.path.append('/path_to_petsc4py')
from conf.petscconf import Extension as PetscExtension
from conf.petscconf import build_ext as petsc_build_ext
from conf.petscconf import config, build, build_src
from conf.petscconf import test, sdist

class my_build_ext(petsc_build_ext):
    def build_configuration(self, arch_list):
        from distutils.util import split_quoted, execute
        #
        template, variables = self.get_config_data(arch_list)
        config_data = template % variables
        #
        build_lib   = self.build_lib
        dist_name   = self.distribution.get_name()
        config_file = os.path.join(build_lib, dist_name,'petsc.cfg')#cek hack
        #
        def write_file(filename, data):
            fh = open(filename, 'w')
            try: fh.write(config_data)
            finally: fh.close()
        execute(write_file, (config_file, config_data),
                msg='writing %s' % config_file, 
                verbose=self.verbose, dry_run=self.dry_run)
    def _copy_ext(self, ext):
        from copy import deepcopy
        extclass = ext.__class__
        fullname = self.get_ext_fullname(ext.name)
        modpath = str.split(fullname, '.')
        pkgpath = os.path.join('', *modpath[0:-1])
        name = modpath[-1]
        sources = list(ext.sources)
        newext = extclass(name, sources)
        newext.__dict__.update(deepcopy(ext.__dict__))
        newext.name = name
        pkgpath=''#cek hack
        return pkgpath, newext

setup(name='proteus',
      ext_package='proteus',
      package_data = {'proteus' : ['petsc.cfg'],},
      cmdclass     = {'config'     : config,
                      'build'      : build,
                      'build_src'  : build_src,
                      'build_ext'  : my_build_ext,
                      'test'       : test,
                      'sdist'      : sdist,
                      },
      ext_modules=[PetscExtension('flcbdfWrappers',
                             ['proteus/flcbdfWrappersModule.cpp','proteus/mesh.cpp','proteus/meshio.cpp'],
                             define_macros=[('PROTEUS_TRIANGLE_H',PROTEUS_TRIANGLE_H),
                                            ('PROTEUS_SUPERLU_H',PROTEUS_SUPERLU_H),
                                            ('CMRVEC_BOUNDS_CHECK',1),
                                            ('MV_VECTOR_BOUNDS_CHECK',1),
                                            ('PETSCVEC_BOUNDS_CHECK',1),
                                            ('F77_POST_UNDERSCORE',1),
                                            ('USE_BLAS',1)],
                             include_dirs=['include',numpy.get_include(),PROTEUS_SUPERLU_INCLUDE_DIR,PROTEUS_TRIANGLE_INCLUDE_DIR]+PROTEUS_DAETK_INCLUDE_DIR+PROTEUS_PETSC_INCLUDE_DIRS+
                                           [PROTEUS_MPI_INCLUDE_DIR],
                             library_dirs=[PROTEUS_DAETK_LIB_DIR]+PROTEUS_PETSC_LIB_DIRS+[PROTEUS_MPI_LIB_DIR],
                             libraries=['m',PROTEUS_DAETK_LIB]+PROTEUS_PETSC_LIBS+PROTEUS_MPI_LIBS,
                             extra_link_args=PROTEUS_EXTRA_LINK_ARGS,
                             extra_compile_args=PROTEUS_EXTRA_COMPILE_ARGS)])