B
    XM\Aw                 @   s  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ yd dlZ	W n   d dl	Z	Y nX d dl
Z
d dlZd dlZd dlmZmZ d dlmZmZmZmZmZ d dlZd dlmZ d d	lmZ d d
lmZ ddlmZ yd dl m!Z! W n" e"k
r   d dl#m!Z! Y nX dZ$dZ%dZ&dZ'dZ(e)dddddddddej*di ddddd d!d"ddd#ej+d$d%d&d'dd(d)d*d+d,d-d.dd/ej+d$d%d&d'dd0d1d2d3d4d5d6d7ddej+d$i d8d9d:d;d<dej+d$i d=d>Z,d?d@ Z-dej+fdAdBZ.dCdD Z/dEdF Z0dGdH Z1dIdJ Z2dKdL Z3e)dMdNdOdPdQdRZ4dmdSdTZ5dndUdVZ6dWdX Z7dYdZ Z8d[d\ Z9d]d^ Z:d_d` Z;dodadbZ<dcdd Z=dedf Z>dgddhe$d2g de%fdidjZ?dkdl Z@dS )p    N)	iteritems)download_to_cache)guess_license_family)copy)chmodmakedirs)basenamedirnameexistsjoinsplitext)string_types)wrap)cElementTree   )yaml_quote_string)urlopenZx86_64centos6a  package:
  name: {packagename}
  version: {version}

source:
  - url: {rpmurl}
    {checksum_name}: {checksum}
    folder: binary
  - url: {srcrpmurl}
    folder: source

build:
  missing_dso_whitelist:
    - '*'

{depends_build}

outputs:
  - name: {packagename}
    build:
      noarch: generic
{depends_run}
    about:
      home: {home}
      license: {license}
      license_family: {license_family}
      summary: {summary}
      description: {description}
ah  #!/bin/sh

# Based on:
# https://www.redhat.com/archives/rpm-list/2003-June/msg00367.html
# Modified to also support xz compression.

pkg=$1
if [ "$pkg" = "" -o ! -e "$pkg" ]; then
    echo "no package supplied" 1>&2
   exit 1
fi

leadsize=96
o=`expr $leadsize + 8`
set `od -j $o -N 8 -t u1 $pkg`
il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5`
dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`

sigsize=`expr 8 + 16 \* $il + $dl`
o=`expr $o + $sigsize + \( 8 - \( $sigsize \% 8 \) \) \% 8 + 8`
set `od -j $o -N 8 -t u1 $pkg`
il=`expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5`
dl=`expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9`

hdrsize=`expr 8 + 16 \* $il + $dl`
o=`expr $o + $hdrsize`

hdr=`dd if=$pkg ibs=$o skip=1 count=1 2>/dev/null | od -N 2 -t x1 -An`
# macOS dd and Linux od give different results
hdr="${hdr#"${hdr%%[![:space:]]*}"}"
# remove trailing whitespace characters
hdr="${hdr%"${hdr##*[![:space:]]}"}"
if [[ "$hdr" == "1f 8b" ]] || [[ "$hdr" == "1f  8b" ]]; then
  dd if=$pkg ibs=$o skip=1 2>/dev/null | gunzip
else
  dd if=$pkg ibs=$o skip=1 2>/dev/null | xz -d
fi
aF  #!/bin/bash

RPM=$(find ${PWD}/binary -name "*.rpm")
mkdir -p ${PREFIX}/x86_64-conda_cos6-linux-gnu/sysroot/usr
pushd ${PREFIX}/x86_64-conda_cos6-linux-gnu/sysroot/usr > /dev/null 2>&1
if [[ -n "${RPM}" ]]; then
  "${RECIPE_DIR}"/rpm2cpio "${RPM}" | cpio -idmv
  popd > /dev/null 2>&1
else
  cp -Rf "${SRC_DIR}"/binary/* .
fi
centos5Zcos5z;http://vault.centos.org/5.11/os/{base_architecture}/CentOS/z'http://vault.centos.org/5.11/os/Source/zGhttp://vault.centos.org/5.11/os/{base_architecture}/repodata/repomd.xmlz#{architecture}-conda_cos5-linux-gnuzlinux-{bits}z{architecture}zel5.{architecture}sha1)r	   
short_namebase_url	sbase_url
repomd_urlhost_machinehost_subdirfname_architecturerpm_filename_platformchecksummerchecksummer_namemacrosZcos6zChttp://mirror.centos.org/centos/6.10/os/{base_architecture}/CentOS/z1http://vault.centos.org/6.10/os/Source/SPackages/zOhttp://mirror.centos.org/centos/6.10/os/{base_architecture}/repodata/repomd.xmlz#{architecture}-conda_cos6-linux-gnuzel6.{architecture}sha256z2.6.6z2.24.1)ZpyverZgdk_pixbuf_base_versioncentos7Zcos7zAhttp://mirror.centos.org/altarch/7/os/{base_architecture}/CentOS/z5http://vault.centos.org/7.6.1810/os/Source/SPackages/zMhttp://mirror.centos.org/altarch/7/os/{base_architecture}/repodata/repomd.xmlz'{gnu_architecture}-conda_cos7-linux-gnuzlinux-ppc64lezel7.{architecture}suse_leap_rpi3Zslrpi3Tzkhttp://download.opensuse.org/ports/aarch64/distribution/leap/42.3-Current/repo/oss/suse/repodata/repomd.xmlznhttp://download.opensuse.org/ports/{architecture}/distribution/leap/42.3-Current/repo/oss/suse/{architecture}/zShttp://download.opensuse.org/ports/{architecture}/source/factory/repo/oss/suse/src/z aarch64-conda_rpi3-linux-gnueabizlinux-aarch64)r	   r   allow_missing_sourcesr   r   r   r   r   r   r   r   r   r    raspbian_rpi2Zrrpi2zarmv7a-conda_rpi2-linux-gnueabiz	armv7a-32)r	   Zcdt_short_namer   r   r   r   r   r    )r   r   r"   r#   r%   c             C   s   dS )zuThis is a simple function returning True/False for if a requested package string exists
    in the add-on repository.T )Zpackage_namer&   r&   8lib/python3.7/site-packages/conda_build/skeletons/rpm.pypackage_exists   s    r(   c       	      C   sZ   |rt ||d}nt d|i}t| d|\}}| }|t|d  | }||fS )N)urlfnr)    rb)dictr   updateopenread	hexdigest)		src_cacher)   r*   r   sourcecached_path_csumZcsumstrr&   r&   r'   
cache_file   s    r7   c       
      C   s   t | \}}|dd }|d}t|dkrD|d |d  }}nJt|dkrd|dt|d  d|dd   }}ntd| |ddd }|d }d|dt|d  }	|	|||fS )N-.   r   r   z8ERROR: Cannot figure out the release and platform for {})r   splitlenr   printformat)
Zrpmfilenamebaser5   Zrelease_platformpartsreleaseplatformZname_versionversionrpm_namer&   r&   r'   rpm_filename_split   s    
0rF   c             C   s2   t || \}}tt| \}}}}||||||fS )N)r7   rF   r   )rpm_urlr2   r4   	sha256strrE   rD   rB   rC   r&   r&   r'   rpm_split_url_and_cache   s    rI   c             C   s   d | |||S )Nz{}-{}-{}.{}.rpm)r?   )rE   rD   rB   rC   r&   r&   r'   rpm_filename_generate   s    rJ   c       
      C   sF   t ||||}t| |}t|dtd|i\}}	|sBtd||S )zJ
    Forms the URL and also attempts to cache it to verify it exists.
    r+   r)   z$Failed to cache generated RPM url {})rJ   r   r   r-   AssertionErrorr?   )
Zurl_dirnamerE   rD   rB   rC   r2   resultr)   pathr5   r&   r&   r'   rpm_url_generate   s
    
rN   c          
   C   s   |d }d}y| | }|}W n~   xpt | D ]d\}}xZ|D ]R}||kr<d|| kr<x8|| d D ](}	|	d |krbtd| |}|}P qbW q<W q.W Y nX |dkrtd| dS d }
x|D ]}||kr|}
P qW |
sdS ||
 }|||
fS )Nnamer+   provideszFound it in {}zBWARNING: Did not find package called (or another one providing) {})NNN)r   r>   r?   )repo_primaryarchitecturesdependdep_nameZfound_package_nameZfound_packagerO   packagearchZprovideZchosen_archentryr&   r&   r'   find_repo_entry_and_arch   s8    

rX   <z<=z==z>=>)ZLTZLEZEQZGEZGTc             C   sp   |r| j t| diS t| j}| jr.| j|d< x<| dD ].}|j |krRg ||j < ||j  t|d q:W |S )NF_textz./*)tagdictifyr   attribtextfindallappend)rrootdxr&   r&   r'   r]   $  s    



r]   c       	   	   C   s   | d }t |r tt|dS tj| dddh}| }tjdd|dd	}td
d|}t	|
d}t|}|r||||}t|t|d |S Q R X d S )Nz.pr,   rb   zutf-8)encodingz\sxmlns="[^"]+"r+   r   )countz\sxmlns:([a-zA-Z]*)="[^"]+"z xmlns:\1="\1"wb)r
   pickleloadr/   ior0   resubET
fromstringencoder]   dump)	xml_filer2   dict_massagercdtZpickledZxf	xmlstringrc   rL   r&   r&   r'   dictify_pickled1  s    rv   c             C   sv  t |  }tjdd|dd}t|}xB|d|D ],}|dd j}t	||}	yt
||	|d \}	}
W n   |d	d j}|d
d jd }tt| d | }t
||||d \}}||kstd|| t|dd}| }|d  }
|
| |
 }
|
|kr@t|	d}|| W d Q R X ntd| W d Q R X Y nX t|	|||S W ti S )Ns   \sxmlns="[^"]+"    r   )rg   z*[@type='{}']zopen-checksumr   r   checksumlocationhref/z*Checksum for {} does not match value in {}r,   rh   z6ERROR: Checksum of uncompressed file {} does not match)r   r0   rl   rm   rn   ro   r`   r?   r_   r   r7   r^   r	   rK   gzipr/   r.   r1   writer>   rv   r-   )r   Z	data_typers   rt   r2   ru   ZrepomdZchildZ	open_csumrr   Zxml_csumr6   ry   Z
xmlgz_filer4   Zcached_csumZgzZxml_contentZxmlr&   r&   r'   get_repo_dictC  s6    





r~   c             C   s   x| D ]}|d |d< d|kr0t |d  |d< nd |d< d|krd|d kr|d dd|d< |d ds~d|d  |d< |d ds|d d |d< |d jf |d |d< qW | S )	NrO   flagsver%r+   {}r    )str_flags_to_conda_version_specreplace
startswithendswithr?   )requiresrt   Zrequirer&   r&   r'   massage_primary_requiresc  s    
r   c             C   s  t i }x| d d D ]}|d d d }|d d d }|dkrHq|d d d }|d	 d d
 d d }|d d d }	|d d }
|d d d }y|d d d }W n   d}Y nX d|d d kr|d d d }nd}|d	 d d d d }y&|d	 d d d d }t||}W n   g }Y nX y&|d	 d d d d }t||}W n   g }Y nX t ||	|||
t|||||d
}||kr||| krtd|| ||| |< qt ||i||< qW |S )a  
    Massages the result of dictify() into a less cumbersome form.
    In particular:
    1. There are many lists that can only be of length one that
       don't need to be lists at all.
    2. The '_text' entries need to go away.
    3. The real information starts at ['metadata']['package']
    4. We want the top-level key to be the package name and under
       that, an entry for each arch for which the package exists.
    ZmetadatarU   rO   r   r[   rV   srcrx   r?   z{rpm}sourcerpmry   rz   rD   summarydescriptionZNAr)   r+   z{rpm}licensez{rpm}providesz
{rpm}entryz{rpm}requires)
rx   ry   homer3   rD   r   r   licenserP   r   z4WARNING: Duplicate packages exist for {} for arch {})r-   r   r   r>   r?   )rQ   r2   rt   Znew_dictrU   rO   rV   rx   r3   ry   rD   r   r   r)   r   rP   r   Znew_packager&   r&   r'   massage_primaryu  sZ    




r   c             C   s\   | d }| d }| dsX| dsX| dsX| dsX|dkrXd|krXd	|krX|rXd
S dS )NrO   r   zrpmlib(zconfig(z
pkgconfig(r{   zrtld(GNU_HASH)z.so(TF)r   )dependsrO   Z	str_flagsr&   r&   r'   valid_depends  s    



r   c             C   s   ddddddd}|   }||kr:|| t||  }}n| t|  }}|dkrVd}n(|d	krdd}n|d
krrd}n|dkr~d}||fS )NzLGPL (>= 2)z
GPL (>= 2)zPublic-DomainZMITzThe Open Group License)zlgplv2+zgplv2+zpublic domain (uncopyrighted)zpublic domainzmit/x11zthe open group licenseZAPACHEZApachezPUBLIC-DOMAINZPROPRIETARYZProprietaryZOTHERZOther)lowerr   )Zrpm_licensemappingZl_rpm_licenser   Zfamilyr&   r&   r'   remap_license  s&    r   c             C   s    |  d}|dkrt||}|S )Nz'"
 r   )stripr   )r_   Zwrap_atstrippedr&   r&   r'   	tidy_text  s    

r   c       '         s  t ||td|i\}}	}
|s"d S |r0|d }
n d }
|	}tt d d |d  } d |d  }t||\}}}}}}yt||\}}}}}}W n   d	 kr|}n Y nX d
d |d D }| d krbx d | D ]z}t ||td|i\}}}|rNxT|d D ]6}|d |krt|}d|kr<|d= || qW qtd|| qW x|D ]}t |||\}}}|r|d }||d< |d |krd|krd|d kr|d d |d< d|d kr|d d |d< | rht| ||d | ||||d< qhW  d d |
 }t	|rx fdd|D }d
dd |D }d| d }dd
|d d }nd}d}| dd}|d | }t|d  \} }!t|d d | d!  d" |||||d# | |! d$ |d% d&t|d'  d( d)d*
t|d+ d, d-d.d/d0d1d2}"t
||}#yt|# W n   Y nX tt
|#d3d4}$|$tjf |" W d Q R X t
|#d5}%t|%d4}$t|%d6 |$t W d Q R X t
|#d7}&t|&d4"}$t|&d6 |$tjf |" W d Q R X |S )8NrO   r   r   r   r{   ry   r   r3   r$   c             S   s   g | ]}t |r|qS r&   )r   ).0Zrequiredr&   r&   r'   
<listcomp>  s    z'write_conda_recipes.<locals>.<listcomp>r   dependency_addrP   Zrelz2WARNING: Additional dependency of {}, {} not foundrV   rD   r   Zepochr   r8   c          
      s>   g | ]6}d  |d  dd d |d |d |d qS )z{}-{}-{} {}{}rO   +re   r   rV   r   r   )r?   r   r   )r   rS   )rt   r&   r'   r   )  s   
c             S   s   g | ]}d  |qS )z    - {})r?   )r   Zdepends_specr&   r&   r'   r   -  s   zrequirements:
  build:
z!    requirements:
      run:
    z
    r+   r   re   r   r   r   r   r   rx   z"(CDT) r   "z
|
        z	
        r   N   z{PREFIX}z{RPM}z{PWD}z{RECIPE_DIR}z	{SRC_DIR})rD   ZpackagenameZhostmachineZ
hostsubdirZdepends_buildZdepends_runZrpmurlZ	srcrpmurlr   r   license_familyZchecksum_namerx   r   r   ZPREFIXZRPMZPWDZ
RECIPE_DIRZSRC_DIRz	meta.yamlwrpm2cpioi  zbuild.sh)rX   r-   r	   rI   r   ra   r>   r?   write_conda_recipesr=   r   r<   r   r   r   r   r   r/   r}   RPM_METAr   RPM2CPIOBUILDSH)'	recursiverQ   rU   rR   rt   
output_diroverride_archr2   rW   Z
entry_namerV   rG   Zsrpm_urlr5   rH   r   Zmissing_depZ	e_missingZe_name_missingrP   Zcopy_providesrS   Z	dep_entryrT   Zdep_archZsnZdepends_specsZdependsstr_partZdependsstr_buildZdependsstr_runZ	package_lZpackage_cdt_namer   r   rd   Zodirfr   Zbuildshr&   )rt   r'   r     s    












r   c          
   C   s  |}|dkrdnd}	t ddi}
t ddi}y|
| }W n   |}Y nX y|| }W n   |}Y nX t ||||	d}t  }x<tt| D ],\}}t|tr|jf |||< q|||< qW d	|krt  |d	< |r<xd|D ]\}|d
 d}|d
 |d	 kr |d	 |d
  |dd   q|dd  |d	 |d
 < qW |d }t|dt	||j
}x*| D ]"}t||||dg||||j
 q\W d S )N)Zarmv6Zarmv7ai686i386Z32Z64r   r   Zppc64leZpowerpc64le)architecturebase_architecturegnu_architecturebitsr   r   ,r   r   ZprimaryZnoarch)r-   r   CDTs
isinstancer   r?   r<   extendr~   r   r2   r   )packagesdistror   r   r   r   r   configZcdt_namer   Zbase_architecturesZgnu_architecturesr   r   Zarchitecture_bitsrt   kvZpackage_and_missed_depsZas_listr   rQ   rU   r&   r&   r'   write_conda_recipei  sV    





 
r   r:   Fc	       	   	   C   s   t | ||||||| d S )N)r   )	r   r   rD   r   r   r   r   r   r   r&   r&   r'   skeletonize  s    r   c                s   | j ddd}|jdddd |jdd	d
d |jddddd |jddddd |jddtd |jddd dd   fdd}|jd|td  d |jd d!d"d#d$d% d S )&Nrpmz2
    Create recipe skeleton for RPM files
        )helpr   r   zRPM package name(s))nargsr   z--output-dirz5Directory to write recipes to (default: %(default)s).r:   )r   defaultz--recursive
store_truer   z<Create recipes for dependencies if they do not already exist)actiondestr   z--dependency-addra   zGAdd undeclared dependencies (format: package,missing_dep1,missing_dep2))r   r   r   z--architecturezUConda arch to make these packages for, used in URL expansions (default: %(default)s).z	--versionz(Version to use. Applies to all packages.c               S   s   d dd ttD S )Nz, c             S   s   g | ]\}}|qS r&   r&   )r   rO   r5   r&   r&   r'   r     s    z5add_parser.<locals>.valid_distros.<locals>.<listcomp>)r   r   r   r&   r&   r&   r'   valid_distros  s    z!add_parser.<locals>.valid_distrosc                s   | t krtd  | S )Nzvalid --distro values are {})r   argparseZArgumentTypeErrorr?   )Zdistro_name)r   r&   r'   r     s    zadd_parser.<locals>.distroz--distroz<Distro to use. Applies to all packages, valid values are: {})typer   r   z--no-override-archz'Do not override noarch in package namesr   TZstore_false)r   r   r   r   )
add_parseradd_argumentdefault_architecturedefault_distror?   )Zreposr   r   r&   )r   r'   r     sP    r   )T)NN)r   )Ar   Zconda_build.conda_interfacer   Zconda_build.sourcer   Zconda_build.license_familyr   r   ZcPickleri   r|   Zhashlibrk   osr   r   os.pathr   r	   r
   r   r   rl   Zsixr   textwrapr   Z	xml.etreer   rn   Zcranr   Zurllib.requestr   ImportErrorZurllib2r   r   r   r   r   r-   r   r!   r   r(   r7   rF   rI   rJ   rN   rX   r   r]   rv   r~   r   r   r   r   r   r   r   r   r   r&   r&   r&   r'   <module>   s   )

#


 C
 8