3 e/"@sddlmZddlmZddljjZddlZddlZddl Z ddl Z ddl Z ddl Z ddlZddlmZddZGdddejZd d ZdS) )glob) convert_pathN)unique_everseencCstj|tj|jtjBdS)N)oschmodstatst_modeS_IWRITE)targetr A/tmp/pip-build-vlmub77e/setuptools/setuptools/command/build_py.py make_writablesr c@seZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZddZed d!Zd"S)#build_pyaXEnhanced 'build_py' command that includes data files with packages The data files are specified via a 'package_data' argument to 'setup()'. See 'setuptools.dist.Distribution' for more details. Also, this version of the 'build_py' command allows you to specify both 'py_modules' and 'packages' in the same setup operation. cCs@tjj||jj|_|jjp i|_d|jkr6|jd=g|_dS)N data_files)origrfinalize_options distribution package_dataexclude_package_data__dict___build_py__updated_files)selfr r r rs    zbuild_py.finalize_optionscCsR|j r|j rdS|jr"|j|jr8|j|j|jtjj|dddS)z?Build modules, packages, and copy data files to build directoryNr)Zinclude_bytecode) py_modulespackagesZ build_modulesZbuild_packagesbuild_package_data byte_compilerr get_outputs)rr r r run$sz build_py.runcCs&|dkr|j|_|jStjj||S)zlazily compute data filesr)_get_data_filesrrr __getattr__)rattrr r r r4s zbuild_py.__getattr__cCs.tjj||||\}}|r&|jj|||fS)N)rr build_modulerappend)rmoduleZ module_filepackageoutfilecopiedr r r r!;s zbuild_py.build_modulecCs|jtt|j|jpfS)z?Generate list of '(package,src_dir,build_dir,filenames)' tuples)analyze_manifestlistmap_get_pkg_data_filesr)rr r r rAszbuild_py._get_data_filescCs$|jjditt|j|jpfS)z Generate list of ``(package,src_dir,build_dir,filenames)`` tuples, but without triggering any attempt to analyze or build the manifest. manifest_files)r setdefaultr(r)r*r)rr r r get_data_files_without_manifestFsz(build_py.get_data_files_without_manifestcsJ|j|tjj|jg|jd}fdd|j|D}|||fS)N.csg|]}tjj|qSr )rpathrelpath).0file)src_dirr r Ysz0build_py._get_pkg_data_files..)get_package_dirrr/join build_libsplitfind_data_files)rr$ build_dir filenamesr )r3r r*Ps   zbuild_py._get_pkg_data_filescCsX|j|j||}tt|}tjj|}ttj j |}tj|j j |g|}|j |||S)z6Return filenames for package's data files in 'src_dir')_get_platform_patternsrr)r itertoolschain from_iterablefilterrr/isfiler+getexclude_data_files)rr$r3patternsZglobs_expandedZ globs_matchesZ glob_filesfilesr r r r9^s   zbuild_py.find_data_filesc Cs|xv|jD]l\}}}}x^|D]V}tjj||}|jtjj|tjj||}|j||\}} t|tjj|}qWqWdS)z$Copy data files into build directoryN) rrr/r6mkpathdirname copy_filer abspath) rr$r3r:r;filenamer srcfileoutfr&r r r ros zbuild_py.build_package_datac Csi|_}|jjsdSi}x$|jp$fD]}||t|j|<q&W|jd|jd}x|jj D]}t j j t|\}}d}|} x:|r||kr||kr|}t j j |\}} t j j | |}qW||kr^|jdr|| krq^|j||gj|q^WdS)Negg_infoz.py)r+rZinclude_package_datarassert_relativer5 run_commandget_finalized_commandfilelistrErr/r8r6endswithr,r") rZmfZsrc_dirsr$Zei_cmdr/dfprevZoldfZdfr r r r'zs(   zbuild_py.analyze_manifestcCsdS)Nr )rr r r get_data_filesszbuild_py.get_data_filescCsy |j|Stk rYnXtjj|||}||j|<| sJ|jj rN|Sx,|jjD]}||ksr|j|drXPqXW|Stj |d}|j }WdQRXd|krt j j d|f|S)z8Check namespace packages' __init__ for declare_namespacer.rbNsdeclare_namespacezNamespace package problem: %s is a namespace package, but its __init__.py does not call declare_namespace()! Please fix it. (See the setuptools manual under "Namespace Packages" for details.) ")packages_checkedKeyErrorrr check_packagerZnamespace_packages startswithioopenread distutilserrorsDistutilsError)rr$ package_dirZinit_pypkgrTcontentsr r r rZs&   zbuild_py.check_packagecCsi|_tjj|dS)N)rXrrinitialize_options)rr r r reszbuild_py.initialize_optionscCs0tjj||}|jjdk r,tjj|jj|S|S)N)rrr5rZsrc_rootrr/r6)rr$resr r r r5s zbuild_py.get_package_dircs\t|j|j||}fdd|D}tjj|}t|fddD}tt|S)z6Filter filenames for package's data files in 'src_dir'c3s|]}tj|VqdS)N)fnmatchr@)r1pattern)rEr r sz.build_py.exclude_data_files..c3s|]}|kr|VqdS)Nr )r1fn)badr r ris)r(r<rr=r>r?setr)rr$r3rErDZ match_groupsmatchesZkeepersr )rkrEr rCs zbuild_py.exclude_data_filescs.tj|jdg|j|g}fdd|DS)z yield platform-specific path patterns (suitable for glob or fn_match) from a glob-based spec (such as self.package_data or self.exclude_package_data) matching package in src_dir. c3s |]}tjjt|VqdS)N)rr/r6r)r1rh)r3r r risz2build_py._get_platform_patterns..)r=r>rB)specr$r3Z raw_patternsr )r3r r<s   zbuild_py._get_platform_patternsN)__name__ __module__ __qualname____doc__rrrr!rr-r*r9rr'rVrZrer5rC staticmethodr<r r r r rs"  rcCs:tjj|s|Sddlm}tjdj|}||dS)Nr)DistutilsSetupErrorz Error: setup script specifies an absolute path: %s setup() arguments must *always* be /-separated paths relative to the setup.py directory, *never* absolute paths. )rr/isabsdistutils.errorsrutextwrapdedentlstrip)r/rumsgr r r rNs  rN)rdistutils.utilrZdistutils.command.build_pycommandrrrrgrxr\rwr_r=rZ setuptools.extern.more_itertoolsrr rNr r r r s    O