o _a/"@sddlmZddlmZddlmmZddlZddlZddl Z ddl Z ddl Z ddl Z ddlZddlmZddZGdddejZd d ZdS) )glob) convert_pathN)unique_everseencCst|t|jtjBdSN)oschmodstatst_modeS_IWRITE)targetr =/usr/lib/python3/dist-packages/setuptools/command/build_py.py make_writablesrc@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@tj||jj|_|jjpi|_d|jvr|jd=g|_dS)N data_files)origrfinalize_options distribution package_dataexclude_package_data__dict___build_py__updated_filesselfr r r rs    zbuild_py.finalize_optionscCsN|js|jsdS|jr||jr|||tjj|dddS)z?Build modules, packages, and copy data files to build directoryNr)include_bytecode) py_modulespackages build_modulesbuild_packagesbuild_package_data byte_compilerr get_outputsrr r r run$s z build_py.runcCs&|dkr ||_|jStj||S)zlazily compute data filesr)_get_data_filesrrr __getattr__)rattrr r r r$4s zbuild_py.__getattr__cCs.tj||||\}}|r|j|||fSr)rr build_modulerappend)rmodule module_filepackageoutfilecopiedr r r r&;s zbuild_py.build_modulecCs|tt|j|jp dS)z?Generate list of '(package,src_dir,build_dir,filenames)' tuplesr )analyze_manifestlistmap_get_pkg_data_filesrrr r r r#Aszbuild_py._get_data_filescCs$|jditt|j|jpdS)z Generate list of ``(package,src_dir,build_dir,filenames)`` tuples, but without triggering any attempt to analyze or build the manifest. manifest_filesr )r setdefaultr.r/r0rrr r r get_data_files_without_manifestFsz(build_py.get_data_files_without_manifestcsJ||tjj|jg|d}fdd||D}|||fS)N.csg|] }tj|qSr )rpathrelpath).0filesrc_dirr r Xs z0build_py._get_pkg_data_files..)get_package_dirrr5join build_libsplitfind_data_files)rr* build_dir filenamesr r9r r0Ps    zbuild_py._get_pkg_data_filescCsX||j||}tt|}tj|}ttj j |}t|j |g|}| |||S)z6Return filenames for package's data files in 'src_dir')_get_platform_patternsrr/r itertoolschain from_iterablefilterrr5isfiler1getexclude_data_files)rr*r:patternsglobs_expanded globs_matches glob_filesfilesr r r r@^s   zbuild_py.find_data_filesc Cst|jD]4\}}}}|D]+}tj||}|tj|tj||}|||\}} t|tj|}q qdS)z$Copy data files into build directoryN) rrr5r=mkpathdirname copy_filerabspath) rr*r:rArBfilenamer srcfileoutfr,r r r roszbuild_py.build_package_datac Csi|_}|jjs dSi}|jpdD] }||t||<q|d|d}|jj D]N}t j t|\}}d}|} |ra||kra||vra|}t j |\}} t j | |}|ra||kra||vsF||vrz|dro|| kroq,|||g|q,dS)Nr egg_infoz.py)r1rinclude_package_datarassert_relativer< run_commandget_finalized_commandfilelistrOrr5r?r=endswithr2r') rmfsrc_dirsr*ei_cmdr5dfprevoldfdfr r r r-zs.    zbuild_py.analyze_manifestcCsdSrr rr r r get_data_filesszbuild_py.get_data_filescCsz|j|WStyYnwtj|||}||j|<|r#|jjs%|S|jjD]}||ks6||dr8nq)|St |d }| }Wdn1sPwYd|vrbt j d|f|S)z8Check namespace packages' __init__ for declare_namespacer4rbNsdeclare_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_packagernamespace_packages startswithioopenread distutilserrorsDistutilsError)rr* package_dirinit_pypkgrbcontentsr r r rjs0      zbuild_py.check_packagecCsi|_tj|dSr)rhrrinitialize_optionsrr r r rwszbuild_py.initialize_optionscCs0tj||}|jjdurtj|jj|S|Sr)rrr<rsrc_rootrr5r=)rr*resr r r r<s zbuild_py.get_package_dircs\t||j||}fdd|D}tj|}t|fddD}tt|S)z6Filter filenames for package's data files in 'src_dir'c3s|] }t|VqdSr)fnmatchrGr7pattern)rOr r z.build_py.exclude_data_files..c3s|] }|vr|VqdSrr )r7fn)badr r r}r~)r.rCrrDrErFsetr)rr*r:rOrK match_groupsmatcheskeepersr )rrOr rJs  zbuild_py.exclude_data_filescs.t|dg||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"|] }tjt|VqdSr)rr5r=rr{r9r r r}s  z2build_py._get_platform_patterns..)rDrErI)specr*r: raw_patternsr r9r rCs   zbuild_py._get_platform_patternsN)__name__ __module__ __qualname____doc__rr"r$r&r#r3r0r@rr-rfrjrwr<rJ staticmethodrCr r r r rs&   rcCs6tj|s|Sddlm}td|}||)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. )rr5isabsdistutils.errorsrtextwrapdedentlstrip)r5rmsgr r r rYs    rY)rdistutils.utilrdistutils.command.build_pycommandrrrrzrrmrrprDr setuptools.extern.more_itertoolsrrrYr r r r s   O