You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					160 lines
				
				6.5 KiB
			
		
		
			
		
	
	
					160 lines
				
				6.5 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								import os
							 | 
						||
| 
								 | 
							
								import sys
							 | 
						||
| 
								 | 
							
								from os.path import join
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from numpy.distutils.system_info import platform_bits
							 | 
						||
| 
								 | 
							
								from numpy.distutils.msvccompiler import lib_opts_if_msvc
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def configuration(parent_package='', top_path=None):
							 | 
						||
| 
								 | 
							
								    from numpy.distutils.misc_util import Configuration, get_mathlibs
							 | 
						||
| 
								 | 
							
								    config = Configuration('random', parent_package, top_path)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def generate_libraries(ext, build_dir):
							 | 
						||
| 
								 | 
							
								        config_cmd = config.get_config_cmd()
							 | 
						||
| 
								 | 
							
								        libs = get_mathlibs()
							 | 
						||
| 
								 | 
							
								        if sys.platform == 'win32':
							 | 
						||
| 
								 | 
							
								            libs.extend(['Advapi32', 'Kernel32'])
							 | 
						||
| 
								 | 
							
								        ext.libraries.extend(libs)
							 | 
						||
| 
								 | 
							
								        return None
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # enable unix large file support on 32 bit systems
							 | 
						||
| 
								 | 
							
								    # (64 bit off_t, lseek -> lseek64 etc.)
							 | 
						||
| 
								 | 
							
								    if sys.platform[:3] == 'aix':
							 | 
						||
| 
								 | 
							
								        defs = [('_LARGE_FILES', None)]
							 | 
						||
| 
								 | 
							
								    else:
							 | 
						||
| 
								 | 
							
								        defs = [('_FILE_OFFSET_BITS', '64'),
							 | 
						||
| 
								 | 
							
								                ('_LARGEFILE_SOURCE', '1'),
							 | 
						||
| 
								 | 
							
								                ('_LARGEFILE64_SOURCE', '1')]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    defs.append(('NPY_NO_DEPRECATED_API', 0))
							 | 
						||
| 
								 | 
							
								    config.add_subpackage('tests')
							 | 
						||
| 
								 | 
							
								    config.add_data_dir('tests/data')
							 | 
						||
| 
								 | 
							
								    config.add_data_dir('_examples')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    EXTRA_LINK_ARGS = []
							 | 
						||
| 
								 | 
							
								    EXTRA_LIBRARIES = ['npyrandom']
							 | 
						||
| 
								 | 
							
								    if os.name != 'nt':
							 | 
						||
| 
								 | 
							
								        # Math lib
							 | 
						||
| 
								 | 
							
								        EXTRA_LIBRARIES.append('m')
							 | 
						||
| 
								 | 
							
								    # Some bit generators exclude GCC inlining
							 | 
						||
| 
								 | 
							
								    EXTRA_COMPILE_ARGS = ['-U__GNUC_GNU_INLINE__']
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if sys.platform == 'cygwin':
							 | 
						||
| 
								 | 
							
								        # Export symbols without __declspec(dllexport) for using by cython.
							 | 
						||
| 
								 | 
							
								        # Using __declspec(dllexport) does not export other necessary symbols
							 | 
						||
| 
								 | 
							
								        # in Cygwin package's Cython environment, making it impossible to
							 | 
						||
| 
								 | 
							
								        # import modules.
							 | 
						||
| 
								 | 
							
								        EXTRA_LINK_ARGS += ['-Wl,--export-all-symbols']
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Use legacy integer variable sizes
							 | 
						||
| 
								 | 
							
								    LEGACY_DEFS = [('NP_RANDOM_LEGACY', '1')]
							 | 
						||
| 
								 | 
							
								    PCG64_DEFS = []
							 | 
						||
| 
								 | 
							
								    # One can force emulated 128-bit arithmetic if one wants.
							 | 
						||
| 
								 | 
							
								    #PCG64_DEFS += [('PCG_FORCE_EMULATED_128BIT_MATH', '1')]
							 | 
						||
| 
								 | 
							
								    depends = ['__init__.pxd', 'c_distributions.pxd', 'bit_generator.pxd']
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # npyrandom - a library like npymath
							 | 
						||
| 
								 | 
							
								    npyrandom_sources = [
							 | 
						||
| 
								 | 
							
								        'src/distributions/logfactorial.c',
							 | 
						||
| 
								 | 
							
								        'src/distributions/distributions.c',
							 | 
						||
| 
								 | 
							
								        'src/distributions/random_mvhg_count.c',
							 | 
						||
| 
								 | 
							
								        'src/distributions/random_mvhg_marginals.c',
							 | 
						||
| 
								 | 
							
								        'src/distributions/random_hypergeometric.c',
							 | 
						||
| 
								 | 
							
								    ]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def lib_opts(build_cmd):
							 | 
						||
| 
								 | 
							
								        """ Add flags that depend on the compiler.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        We can't see which compiler we are using in our scope, because we have
							 | 
						||
| 
								 | 
							
								        not initialized the distutils build command, so use this deferred
							 | 
						||
| 
								 | 
							
								        calculation to run when we are building the library.
							 | 
						||
| 
								 | 
							
								        """
							 | 
						||
| 
								 | 
							
								        opts = lib_opts_if_msvc(build_cmd)
							 | 
						||
| 
								 | 
							
								        if build_cmd.compiler.compiler_type != 'msvc':
							 | 
						||
| 
								 | 
							
								            # Some bit generators require c99
							 | 
						||
| 
								 | 
							
								            opts.append('-std=c99')
							 | 
						||
| 
								 | 
							
								        return opts
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    config.add_installed_library('npyrandom',
							 | 
						||
| 
								 | 
							
								        sources=npyrandom_sources,
							 | 
						||
| 
								 | 
							
								        install_dir='lib',
							 | 
						||
| 
								 | 
							
								        build_info={
							 | 
						||
| 
								 | 
							
								            'include_dirs' : [],  # empty list required for creating npyrandom.h
							 | 
						||
| 
								 | 
							
								            'extra_compiler_args': [lib_opts],
							 | 
						||
| 
								 | 
							
								        })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for gen in ['mt19937']:
							 | 
						||
| 
								 | 
							
								        # gen.pyx, src/gen/gen.c, src/gen/gen-jump.c
							 | 
						||
| 
								 | 
							
								        config.add_extension(f'_{gen}',
							 | 
						||
| 
								 | 
							
								                             sources=[f'_{gen}.c',
							 | 
						||
| 
								 | 
							
								                                      f'src/{gen}/{gen}.c',
							 | 
						||
| 
								 | 
							
								                                      f'src/{gen}/{gen}-jump.c'],
							 | 
						||
| 
								 | 
							
								                             include_dirs=['.', 'src', join('src', gen)],
							 | 
						||
| 
								 | 
							
								                             libraries=EXTRA_LIBRARIES,
							 | 
						||
| 
								 | 
							
								                             extra_compile_args=EXTRA_COMPILE_ARGS,
							 | 
						||
| 
								 | 
							
								                             extra_link_args=EXTRA_LINK_ARGS,
							 | 
						||
| 
								 | 
							
								                             depends=depends + [f'_{gen}.pyx'],
							 | 
						||
| 
								 | 
							
								                             define_macros=defs,
							 | 
						||
| 
								 | 
							
								                             )
							 | 
						||
| 
								 | 
							
								    for gen in ['philox', 'pcg64', 'sfc64']:
							 | 
						||
| 
								 | 
							
								        # gen.pyx, src/gen/gen.c
							 | 
						||
| 
								 | 
							
								        _defs = defs + PCG64_DEFS if gen == 'pcg64' else defs
							 | 
						||
| 
								 | 
							
								        config.add_extension(f'_{gen}',
							 | 
						||
| 
								 | 
							
								                             sources=[f'_{gen}.c',
							 | 
						||
| 
								 | 
							
								                                      f'src/{gen}/{gen}.c'],
							 | 
						||
| 
								 | 
							
								                             include_dirs=['.', 'src', join('src', gen)],
							 | 
						||
| 
								 | 
							
								                             libraries=EXTRA_LIBRARIES,
							 | 
						||
| 
								 | 
							
								                             extra_compile_args=EXTRA_COMPILE_ARGS,
							 | 
						||
| 
								 | 
							
								                             extra_link_args=EXTRA_LINK_ARGS,
							 | 
						||
| 
								 | 
							
								                             depends=depends + [f'_{gen}.pyx',
							 | 
						||
| 
								 | 
							
								                                   'bit_generator.pyx', 'bit_generator.pxd'],
							 | 
						||
| 
								 | 
							
								                             define_macros=_defs,
							 | 
						||
| 
								 | 
							
								                             )
							 | 
						||
| 
								 | 
							
								    for gen in ['_common', 'bit_generator']:
							 | 
						||
| 
								 | 
							
								        # gen.pyx
							 | 
						||
| 
								 | 
							
								        config.add_extension(gen,
							 | 
						||
| 
								 | 
							
								                             sources=[f'{gen}.c'],
							 | 
						||
| 
								 | 
							
								                             libraries=EXTRA_LIBRARIES,
							 | 
						||
| 
								 | 
							
								                             extra_compile_args=EXTRA_COMPILE_ARGS,
							 | 
						||
| 
								 | 
							
								                             extra_link_args=EXTRA_LINK_ARGS,
							 | 
						||
| 
								 | 
							
								                             include_dirs=['.', 'src'],
							 | 
						||
| 
								 | 
							
								                             depends=depends + [f'{gen}.pyx', f'{gen}.pxd',],
							 | 
						||
| 
								 | 
							
								                             define_macros=defs,
							 | 
						||
| 
								 | 
							
								                             )
							 | 
						||
| 
								 | 
							
								        config.add_data_files(f'{gen}.pxd')
							 | 
						||
| 
								 | 
							
								    for gen in ['_generator', '_bounded_integers']:
							 | 
						||
| 
								 | 
							
								        # gen.pyx, src/distributions/distributions.c
							 | 
						||
| 
								 | 
							
								        config.add_extension(gen,
							 | 
						||
| 
								 | 
							
								                             sources=[f'{gen}.c'],
							 | 
						||
| 
								 | 
							
								                             libraries=EXTRA_LIBRARIES + ['npymath'],
							 | 
						||
| 
								 | 
							
								                             extra_compile_args=EXTRA_COMPILE_ARGS,
							 | 
						||
| 
								 | 
							
								                             include_dirs=['.', 'src'],
							 | 
						||
| 
								 | 
							
								                             extra_link_args=EXTRA_LINK_ARGS,
							 | 
						||
| 
								 | 
							
								                             depends=depends + [f'{gen}.pyx'],
							 | 
						||
| 
								 | 
							
								                             define_macros=defs,
							 | 
						||
| 
								 | 
							
								                             )
							 | 
						||
| 
								 | 
							
								    config.add_data_files('_bounded_integers.pxd')
							 | 
						||
| 
								 | 
							
								    mtrand_libs = ['m', 'npymath'] if os.name != 'nt' else ['npymath']
							 | 
						||
| 
								 | 
							
								    config.add_extension('mtrand',
							 | 
						||
| 
								 | 
							
								                         sources=['mtrand.c',
							 | 
						||
| 
								 | 
							
								                                  'src/legacy/legacy-distributions.c',
							 | 
						||
| 
								 | 
							
								                                  'src/distributions/distributions.c',
							 | 
						||
| 
								 | 
							
								                                 ],
							 | 
						||
| 
								 | 
							
								                         include_dirs=['.', 'src', 'src/legacy'],
							 | 
						||
| 
								 | 
							
								                         libraries=mtrand_libs,
							 | 
						||
| 
								 | 
							
								                         extra_compile_args=EXTRA_COMPILE_ARGS,
							 | 
						||
| 
								 | 
							
								                         extra_link_args=EXTRA_LINK_ARGS,
							 | 
						||
| 
								 | 
							
								                         depends=depends + ['mtrand.pyx'],
							 | 
						||
| 
								 | 
							
								                         define_macros=defs + LEGACY_DEFS,
							 | 
						||
| 
								 | 
							
								                         )
							 | 
						||
| 
								 | 
							
								    config.add_data_files(*depends)
							 | 
						||
| 
								 | 
							
								    config.add_data_files('*.pyi')
							 | 
						||
| 
								 | 
							
								    return config
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == '__main__':
							 | 
						||
| 
								 | 
							
								    from numpy.distutils.core import setup
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    setup(configuration=configuration)
							 |