[PYTHON] Comment créer un package Conda

Comment créer un package Conda

L'utilisateur a Anaconda Python dans son répertoire personnel S'il est installé, Disponible dans le package Conda ainsi que Python Applications, bibliothèques, etc. Ce sera facile à utiliser.

Cet article explique comment créer un package Conda dans Anaconda Python Ceci est un document pour Linux.

Forfait Conda

Comme pour les packages Python, les packages distribués par PyPI (Python Package Index) sont connus. Ceux-ci peuvent être installés avec la commande pip.

** Exemple d'installation avec la commande pip **

$ pip install shpinx

Les packages PyPI sont créés avec un outil de packaging appelé setuptools. Parce que c'est une méthode de création de paquet légèrement excentrique Il y a des difficultés d'utilisation.

Dans Anaconda Python Vous pouvez ajouter / supprimer des packages avec la commande Conda, Un moyen simple de créer un package est fourni.

Le package Conda est téléchargé à partir de l'emplacement suivant:

Préparation à la création d'un package Conda

Si juste pour construire le package Conda Vous pouvez utiliser miniconda.

** Comment installer miniconda **

$ wget https://repo.continuum.io/miniconda/Miniconda3-4.3.14-Linux-x86_64.sh
$ bash Miniconda3-4.3.14-Linux-x86_64.sh -b -p $HOME/conda/x64
$ echo export PATH=$HOME/conda/x64/bin:$PATH >> $HOME/.bash_profile
$ source $HOME/.bash_profile

Ensuite, dans l'environnement racine d'Anaconda Python Installez le package conda-build.

$ conda install -n root conda-build

Il est recommandé d'utiliser la dernière version de conda-build. Même après l'installation, vous pouvez mettre à jour comme suit.

$ conda upgrade -n root conda
$ conda upgrade -n root conda-build

Structure de répertoire de conda-build

Miniconda3 si vous avez Miniconda3 installé sous $ HOME / conda / x64 conda-build place les fichiers dans les répertoires suivants:

$HOME/conda/x64/conda-bld/
├── git_cache           --Source téléchargée avec git
├── hg_cache            --Source téléchargée avec mercurial
├── linux-64            --forfait conda(x86_64:Dépendant du système)
├── linux-ppc64le       --forfait conda(ppc64le:Dépendant du système)
├── noarch              --forfait conda(noarch)
├── src_cache           --Source téléchargée avec curl
└── svn_cache           --Source téléchargée avec subversion

Le package est construit selon la recette (plus à ce sujet plus tard), Lorsque vous installez le package, il est généralement extrait dans le répertoire suivant.

$HOME/conda/x64
├── bin
├── etc
├── lib
├── include
├── man
└── share

Si vous le mettez dans un package conda, Sous le répertoire personnel de l'utilisateur Vous pouvez ajouter / supprimer des packages avec des privilèges d'utilisateur.

Conversion d'un package existant en package Conda

Vous pouvez le trouver sur CPAN, CRAN, luarocks.org, PyPI en utilisant la commande conda skeleton. Vous pouvez convertir un package existant en package Conda.

Par exemple, pyinstrument distribué par PyPI Pour en faire un package Conda, exécutez la commande comme suit.

$ conda skeleton pypi autopep8
Using url https://pypi.python.org/packages/0a/fc/c541b2fa1b244e0484216076b95468dc011ae90016b8f37333a24a11e468/autopep8-1.3.2.tar.gz (105 KB) for autopep8.
Downloading autopep8
INFO:fetch.start:('autopep8-1.3.2', 107915)
INFO:fetch.update:16384
INFO:fetch.update:32768
INFO:fetch.update:49152
INFO:fetch.update:65536
INFO:fetch.update:81920
INFO:fetch.update:98304
INFO:fetch.update:107915
INFO:fetch.stop:None
Unpacking autopep8...
done
working in /tmp/tmptgwzsstsconda_skeleton_autopep8-1.3.2.tar.gz

The following NEW packages will be INSTALLED:

    openssl:    1.0.2l-0           
    pip:        9.0.1-py35_1       
    python:     3.5.3-1            
    pyyaml:     3.12-py35_0   hpcs 
    readline:   6.2-2         local
    setuptools: 27.2.0-py35_0      
    sqlite:     3.13.0-0           
    tk:         8.5.18-0           
    wheel:      0.29.0-py35_0      
    xz:         5.2.2-1            
    zlib:       1.2.8-3            

Applying patch: '/tmp/tmptgwzsstsconda_skeleton_autopep8-1.3.2.tar.gz/pypi-distutils.patch'
patching file core.py
Hunk #1 succeeded at 167 with fuzz 2 (offset 1 line).
Writing recipe for autopep8
INFO:conda_build.config:--dirty flag not specified.  Removing build folder after successful build/test.

Une fois exécuté, il sera dans le répertoire courant Un répertoire avec le nom de package sphinx est créé Les fichiers requis seront créés.

$ $ ls autopep8/
bld.bat  build.sh  meta.yaml

Ces fichiers sont appelés recettes de package Conda.

Si vous donnez à la commande conda build le répertoire dans lequel la recette est stockée, Vous pouvez créer un package Conda.

conda build autopep8

Cela créera un fichier de package (en fait une archive tar).

/home/iisaka/conda/x64/conda-bld/linux-64/autopep8-1.3.2-py35_0.tar.bz2

Convention de dénomination des packages Conda

Le package Conda crée un fichier de package avec la même convention de dénomination que maintenant.

nom du paquet-version-Type de construction_Numéro de build.tar.bz2

Paquets Conda pour différentes versions de Python

Lorsque vous installez Miniconda3-4.3.14 La version Python par défaut est 3.6. Sur cette plateforme Si vous souhaitez créer un package Conda pour Python 2.7 Construisez comme suit:

$ conda build --python=2.7 autopep8

Le fichier créé à la suite de la construction est le suivant

/home/iisaka//conda/x64/conda-bld/linux-64/autopep8-1.3.2-py27_0.tar.bz2

Enregistrement de la chaîne

Enregistrement de la chaîne

Par exemple, sur une machine Linux avec l'architecture x86_64 Avec conda installé sous / home / iisaka / py3 Lorsque vous construisez le package, il sera enregistré dans le répertoire suivant.

Enregistrons ceci en tant que canal.

$ conda config --add channels file:///home/iisaka/conda/x64/conda-bld

recette

La recette se compose des fichiers suivants.

Métadonnées du package

Métadonnées du package Nom du package, numéro de package, numéro de build, comment obtenir la source, etc. Le fichier est écrit au format YAML et le nom du fichier est meta.yaml.

#Commentaires du signe pointu à la fin de la ligne
package:
  name:nom du paquet
  version:Numéro de version

source:
  fn:Nom de fichier à enregistrer
  url:URL pour télécharger la source
#La valeur de la somme de contrôle peut être l'un ou l'autre
  md5:Vérifier la valeur de somme de md5sum
  sha1:Vérifier la valeur de la somme de sha1sum
  sha256:Vérifier la valeur de la somme de sha256sum

#   patches:    #Liste des fichiers de correctifs(Optionnel)
#      - fix1.patch
#      - fix2.patch
build:
  number: 0       #Numéro de build

requirements:     #Décrivez le nom du package dépendant
  build:          #Paquets requis au moment de la construction
    - python
    - setuptools

  run:            #Packages requis lors de l'exécution
    - python

about:      #Décrivez la description du package
  home:     #URL du site ou du projet qui distribue la source
  license:  #Liste de licence GPL2, GPL3, AGPL3, BSD,MIT etc.
  summary:  #Aperçu
  description:La description
  license_family: BSD

Pour la source au lieu de l'url Vous pouvez également spécifier un chemin relatif à partir du répertoire de recette avec chemin.

Le format du nombre vierge suit PEP-440.

Si vous souhaitez modifier les exigences et le numéro de build de chaque plateforme, Spécifiez le sélecteur et décrivez comme suit.

build:
  number: 2 # [osx]
  number: 1 # [linux]

requirements:
  build:
    - ncurses
    - dbus # [osx]
    - jpeg # [linux]

Le sélecteur est donné au format # [valeur] , et la valeur peut être spécifiée comme suit.

Valeur du sélecteur Contenu
x86 Architecture X86 avec processeurs Intel et AMD(32bit/64bit)Vrai à
x86_64 X86 avec processeur Intel ou AMD_64 architecture(64bit)Vrai à
linux Vrai quand la plate-forme est Linux
linux32 Vrai lorsque la plate-forme est Linux et que l'architecture Python est 32 bits
linux64 Vrai lorsque la plate-forme est Linux et que l'architecture Python est 64 bits
armv6l Vrai lorsque la plate-forme est Linux et que l'architecture Python est armv6l
armv7l Vrai lorsque la plate-forme est Linux et que l'architecture Python est armv7l
ppc64le Vrai lorsque la plate-forme est Linux et que l'architecture Python est ppc64le
osx Vrai quand la plate-forme est OS X
unix La plate-forme est Unix(OS X ou Linux)Vrai à
win Vrai lorsque la plate-forme est Windows
win32 Vrai lorsque la plate-forme est Windows et que l'architecture Python est 32 bits
win64 Vrai lorsque la plate-forme est Windows et que l'architecture Python est 64 bits
py XX Notation de version à deux lettres de Python(Exemple 27)Donner CONDA_Identique à la valeur de PY)
py3k Vrai quand la version majeure de Python est 3
py2k Vrai quand la version majeure de Python est 2
py27 Python version 2.Vrai à 7
py34 Python version 3.Vrai quand 4
py35 Python version 3.Vrai à 5
py36 Python version 3.Vrai à 6
np XX Notation entière de la version NumPy(Exemple 111) CONDA_Identique à la valeur de NPY

Créer un script

Qu'est-ce qu'un script de construction? Requis pour créer un package Un script avec des instructions.

#!/bin/bash

$PYTHON setup.py install

# Add more build steps here, if they are necessary.

# See
# http://docs.continuum.io/conda/build.html
# for a list of environment variables that are set during the build process.

Selon les informations de disponibilité de la source décrites dans les métadonnées Téléchargement de la commande conda build Extrayez-le dans votre répertoire de travail, puis appelez le script de construction.

Le répertoire de travail se trouve sous $ HOME / conda / x64 / conda-build, Créé avec un nom de répertoire * nom de package-époque *.

Lors de l'installation lors de la création d'un package Sous le répertoire de travail, allez dans le répertoire commençant par _b_env_ Il sera installé dans.

/home/iisaka/conda/x64/conda-bld/lftp_1485460657191
├── _b_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_pl
│   ├── bin
│   ├── conda-meta
│   ├── include
│   ├── lib
│   ├── share
│   └── ssl
└── work
    └── lftp-4.7.5

Pré / post traitement

Si vous souhaitez traiter avant et après l'installation du package conda, Créez le script suivant.

Ces scripts sont exécutés une fois les variables d'environnement suivantes définies.

Variable d'environnement Contenu
PREFIX (--Spécifié par préfixe)Répertoire d'installation
PKG_VERSION Version du package
PKG_BUILDNUM Numéro de version du package

En pré / post-traitement, rien n'est émis vers la sortie standard ou la sortie d'erreur standard, Il est stocké dans $ PREFIX / .messages.txt.

Variables d'environnement dans le processus de construction Conda

Les variables d'environnement suivantes sont définies en interne dans Conda, Vous pouvez vous y référer dans le script de construction.

Variable d'environnement Contenu
ARCH Soit 32 ou 64. La valeur par défaut est choisie en fonction de la plate-forme sur laquelle conda est exécuté.
CMAKE_GENERATOR Chaîne de générateur CMake pour l'environnement de construction actuel. Sur les systèmes Unix, c'est toujours"Unix Makefiles"est.
CONDA_BUILD=1 1 est toujours défini.
CPU_COUNT Nombre de processeurs(multiprocessing.cpu_count()Valeur renvoyée par)
SHLIB_EXT Extension de bibliothèque partagée
DIRTY à la commande conda build--Si le drapeau sale est passé, il sera mis à 1. Il peut être utilisé pour ignorer conditionnellement des parties du script de construction.(Pas besoin de répéter pour gagner du temps lors du téléchargement, du déploiement, du développement de recettes>Quelque chose comme)
HTTP_PROXY Hérite des variables d'environnement définies dans le shell.
HTTPS_PROXY Hérite des variables d'environnement définies dans le shell.
LANG Hérite des variables d'environnement définies dans votre shell.
MAKEFLAGS Hérite des variables d'environnement définies dans votre shell. Pour construire avec deux processeurs-Arguments à ajouter à faire, tels que j2.
NPY_VER Version Numpy à construire(CONDA_Variables d'environnement NPY et--Sertie de numpy)
PATH Hérite des variables d'environnement définies dans votre shell.$PREFIX/bin est ajouté.
PREFIX (--Spécifié par préfixe)Répertoire d'installation)
PKG_VERSION Version du package
PYTHON Le chemin d'accès à l'exécutable Python dans l'environnement de construction.
R Chemin d'accès à l'exécutable R dans l'environnement de construction. R ne sera installé que s'il est répertorié comme une exigence de construction)
RECIPE_DIR Répertoire de recettes
SP_DIR Site Python-Chemin d'accès aux packages
SRC_DIR La source se déroule(Ou cloner)Chemin que le fichier source peut reconnaître(.zip, .tar, .tar.gz, .tar.bz2, .tar.xz )Sinon, ce sera le chemin vers le répertoire où les fichiers source ont été copiés.
STDLIB_DIR Chemin vers la bibliothèque standard Python
PKG_CONFIG_PATH Chemin vers le répertoire pkgconfig
LD_RUN_PATH <build_prefix>/lib

Variables d'environnement dans git

Si vous spécifiez un référentiel git avec git_url ou path pour la source, les variables d'environnement suivantes sont également définies:

Variable d'environnement Contenu
GIT_BUILD_STR GIT_DESCRIBE_NUMBER et GIT_DESCRIBE_Souligner HASH(_)Chaînes de caractères reliées par.
GIT_DESCRIBE_HASH git describe --Valeur de hachage courte de validation actuelle affichée par les balises
GIT_DESCRIBE_NUMBER Une chaîne indiquant le nombre de validations de la balise la plus récente
GIT_DESCRIBE_TAG Une chaîne représentant la dernière balise du commit actuel(git describe --Sortie de balises)
GIT_FULL_HASH Une chaîne indiquant la valeur SHA1 complète de la HEAD actuelle

Variables d'environnement dans mercurial

Lorsqu'un référentiel mercuriel est spécifié pour la source, Les variables d'environnement suivantes sont également définies:

Variable d'environnement Contenu
HG_BRANCH Une chaîne indiquant la branche actuellement active
HG_BUILD_STR HG_NUM_ID et HG_SHORT_Identifiant de soulignement(_)Chaîne de caractères reliée par
HG_LATEST_TAG Une chaîne indiquant la dernière balise de la validation actuelle
HG_LATEST_TAG_DISTANCE Une chaîne indiquant le nombre de validations de la dernière balise
HG_NUM_ID Chaîne de caractères indiquant le numéro de révision
HG_SHORT_ID Une chaîne indiquant le hachage de validation

Héritage des variables d'environnement

Sur la plate-forme Linux, dans un environnement qui appelle conda build autre que ce qui précède, Aucune variable n'est héritée. En l'ajoutant à meta.yaml Vous pouvez ajouter des variables d'environnement à hériter.

build:
  script_env:
   - TMPDIR
   - LD_LIBRARY_PATH # [linux]

Si la variable héritée est absente de l'environnement shell au moment de la construction Cette variable reste non allouée, Un avertissement s'affiche indiquant que la valeur n'a pas été définie.

Remarque: hériter des variables d'environnement Il peut être difficile pour d'autres de reproduire le binaire à partir de la source en utilisant la recette. Utilisez cette fonction avec prudence ou évitez-la du tout.

Variables d'environnement qui affectent le processus de construction

Variable d'environnement Contenu
CONDA_PY 27,Donnez 34 ou 35. La version de Python pour la construction du package.
CONDA_NPY 19,Donnez 110 ou 111. La version de numpy utilisée lors de la construction du package.
CONDA_PREFIX /path/to/conda/Chemin d'accès à l'environnement conda utilisé lors de la construction d'un package comme env

Variables d'environnement dans les fonctionnalités de construction

Même si les fonctionnalités ont le même nom et la même version C'est un mécanisme qui vous permet d'enregistrer la différence entre les packages. Les packages spécifiés par track_features seront également installés.

La fonctionnalité n'est pas le package lui-même Ce sont les caractéristiques de l'environnement dans lequel le package est installé. Par exemple, si mkl est spécifié dans track_features, Numpy régulier supprimé et package numpy en vedette mkl installé En effet, la conda change automatiquement en fonction de la fonctionnalité spécifiée, telle que.

Variable d'environnement Contenu
FEATURE_NOMKL Donnez la fonction nomkl lors de la construction du paquet. 0 pour désactivé, 1 pour activé
FEATURE_DEBU Donnez des fonctionnalités de débogage lors de la création de packages. 0 pour désactivé, 1 pour activé
FEATURE_OPT Donnez la fonction opt lors de la construction du package. 0 pour désactivé, 1 pour activé

Conseils de création

Lorsque j'essaie de créer un package, j'obtiens plusieurs packages dépendants Vous devrez peut-être le construire.

Faites en sorte que le nom du répertoire de recette soit le même que le nom du package spécifié dans le métafichier.

De cette façon, lorsque vous créez le package Le même répertoire que le package dépendant Si dans le répertoire courant Il construira automatiquement ce package pour vous.

Faisons du compilateur PGI un package Conda

Depuis 2016, la version communautaire du compilateur PGI est disponible gratuitement, donc Faisons un package Conda.

paquet numactl

Tout d'abord, créez le package numactl requis par le compilateur PGI.

Créez le même répertoire que le nom du package numactl Placez-y le fichier de métadonnées et le script bulld.

$ mkdir numactl 

** Fichier de métadonnées **

package:
    name: numactl
    version: 2.0.11

source:
    fn:  numactl-2.0.11.tar.gz
    url: https://github.com/numactl/numactl/archive/v2.0.11.tar.gz
    md5: b56d2367217cde390b4d8087e00773b8

requirements:
    build:
      - m4
      - autoconf
      - automake
      - libtool
      - pkg-config
    run:

about:
    home: http://oss.sgi.com/projects/libnuma/
    summary: NUMA support for Linux
    license: GPL2.0

** Script de construction **

#!/bin/bash

export CFLAGS="${CFLAGS} -I${PREFIX}/include"
export CXXFLAGS="${CFLAGS}"
export CPPFLAGS="-I${PREFIX}/include"
export LDFLAGS="${LDFLAGS} -L${PREFIX}/lib"

bash autogen.sh

./configure --help
./configure \
    --prefix="${PREFIX}"   \
    --enable-static

make -j${CPU_COUNT}
make install

Construire le package numactl

$ conda build numactl

Compilateur PGI

Puisque la notation de jinja2 peut être utilisée dans le fichier méta, Généré par la valeur de la variable d'environnement au moment de la construction comme suit J'essaye de changer de paquet.

Définir les valeurs par défaut pour les packages dépendants

{% set require1 = "" %}
{% set require2 = "" %}
{% set numactl  = "" %}

#Contient la valeur de la variable d'environnement HOME
{% set home = environ.get("HOME") %}

#Variable d'environnement PGI_Contient la valeur de COMPONENT
{% set component = environ.get("PGI_COMPONENT") %}

# PGI_La cible du package est divisée en fonction de la valeur donnée par COMPONENT.
{% if component == "openmpi" %}
{% set name = "pgi-openmpi" %}
{% set require1 = "- pgi-compiler" %}
{% elif component == "cuda80" %}
{% set name = "pgi-cuda80" %}
{% set require1 = "- pgi-compiler" %}
{% set require2 = "- pgi-java" %}
{% elif component == "cuda75" %}
{% set name = "pgi-cuda75" %}
{% set require1 = "- pgi-compiler" %}
{% set require2 = "- pgi-java" %}
{% elif component == "examples" %}
{% set name = "pgi-examples" %}
{% set require1 = "- pgi-compiler" %}
{% elif component == "java" %}
{% set name = "pgi-java" %}
{% else %}
{% set name = "pgi-compiler" %}
#Demander des packages numactl uniquement pour les compilateurs
{% set numactl = "- numactl" %}
{% endif %}

package:
  name: {{ name }}
  version: 17.4

source:
#Balle TAR téléchargée à l'avance sur le site PGI$Enregistrer dans HOME
  url: file://{{ home }}/pgilinux-2017-174-x86_64.tar.gz
patch:
  - fix-install.patch

build:
  number: 0
  binary_relocation: false

requirements:
  build:
    - perl
    {{ numactl }}
  run:
    {{ numactl }}
    {{ require1 }}
    {{ require2 }}

about:
  home: http://www.pgroup.com/products/community.htm
  license: PGI Eng-User License
  license_file: LICENSE.txt
  summary: "A no-cost license to a recent release of the PGI Fortran, C and C++ compilers and tools for multicore CPUs and NVIDIA Tesla GPUs, including all OpenACC, OpenMP and CUDA Fortran features."

Le script de construction ressemble à ceci:

#!/bin/bash

#Définir les paramètres du script d'installation
export PGI_SILENT=true
export PGI_ACCEPT_EULA=accept
export PGI_INSTALL_DIR=${PREFIX}/pgi
export PGI_INSTALL_NVIDIA=false
export PGI_INSTALL_AMD=false
export PGI_INSTALL_JAVA=false
export PGI_INSTALL_MPI=false
export PGI_MPI_GPU_SUPPORT=false
export PGI_INSTALL_MANAGED=false

#Créer un répertoire d'installation
[ -d ${PREFIX}/pgi ] || mkdir ${PREFIX}/pgi

# post-link.sh / pre-unlink.Supprimer sh s'il se trouve dans le répertoire des recettes
[ -f ${RECIPE_DIR}/post-link.sh ]  && rm -f ${RECIPE_DIR}/post-link.sh
[ -f ${RECIPE_DIR}/pre-unlink.sh ] && rm -f ${RECIPE_DIR}/pre-unlink.sh
Extraire le fichier en fonction du nom du package
case "${PKG_NAME}" in
*-cuda75)
    tar -zxvf install_components/linux86-64.pgicuda.tar.gz \
              -C ${PREFIX}/pgi
    rm -rf ${PREFIX}/pgi/linux86-64/2017/cuda/8.0
    exit 0
;;
*-cuda80)
    tar -zxvf install_components/linux86-64.pgicuda8.0-libnvvp.tar.gz \
              -C ${PREFIX}/pgi
    tar -zxvf install_components/linux86-64.pgicuda.tar.gz \
              -C ${PREFIX}/pgi
    rm -rf ${PREFIX}/pgi/linux86-64/2017/cuda/7.5
    exit 0
;;
*-compiler)
    export PGI_INSTALL_MANAGED=true
    export PGI_INSTALL_AMD=true
    #Publier uniquement pour le compilateur-link.sh / pre-unlink.activer sh
    [ -f ${RECIPE_DIR}/scripts/post-link.sh ]  && \
         cp ${RECIPE_DIR}/scripts/post-link.sh ${RECIPE_DIR}/post-link.sh
    [ -f ${RECIPE_DIR}/scripts/pre-unlink.sh ] && \
         cp ${RECIPE_DIR}/scripts/pre-unlink.sh ${RECIPE_DIR}/pre-unlink.sh
;;
*-openmpi)
    export PGI_INSTALL_MPI=true
    mkdir -vp workdir
    tar -zxvf install_components/openmpi-1.10.2_2017_x86_64.tar.gz \
              -C workdir
    tar -zxvf workdir/linux86-64.openmpi-1.10.2.tar.gz \
              -C ${PREFIX}/pgi/
    tar -zxvf install_components/scalapack-2.0.2_2017_x86_64.tar.gz \
              -C ${PREFIX}/pgi/

    mkdir -vp ${PREFIX}/pgi/modulefiles
    perl workdir/openmpi.pl \
         -libdir ${PREFIX}/pgi/linux86-64/2017/mpi/openmpi-1.10.2 \
         -openmpiver 1.10.2 \
         -install ${PREFIX}/pgi/modulefiles/ \
         -release 2017
    exit 0
;;
*-java)
    export PGI_INSTALL_JAVA=true
    mkdir -vp ${PREFIX}/pgi/linux86-64/17.4/java
    tar -zxvf install_components/common/jre-8u112-linux-x64.tar.gz \
       -C ${PREFIX}/pgi/linux86-64/17.4/java

    mkdir -vp ${PREFIX}/pgi/linux86-64/17.4/bin
    cp install_components/linux86-64/17.4/bin/*.jar \
       ${PREFIX}/pgi/linux86-64/17.4/bin
    cp install_components/linux86-64/17.4/bin/pgtjavarc \
       ${PREFIX}/pgi/linux86-64/17.4/bin
    exit 0
;;
*-example)
    tar -zxvf install_components/linux86-64.examples.tar.gz \
              -C ${PREFIX}/pgi
    exit 0
;;
esac

./install

#Supprimer les fichiers inutiles
rm -rf ${PREFIX}/pgi/linux86-64/17.4/cray
rm -rf ${PREFIX}/pgi/linux86-64/2017/cray
rm -rf ${PREFIX}/pgi/linux86-64/2017/examples/

[ "${PGI_INSTALL_MPI}" != "true" ] && \
    rm -rf ${PREFIX}/pgi/linux86-64/17.4/lib/scalapack

[ "${PGI_INSTALL_MPI}" != "true" ] && {
    rm -rf ${PREFIX}/pgi/linux86-5/17.4/bin/*.jar
    rm -rf ${PREFIX}/pgi/linux86-5/17.4/bin/pgtjavarc
}

Avec scripts / post-link.sh dans le répertoire des recettes Créez scripts / pre-unlink.sh.

scripts/post-link.sh

#!/bin/bash

mkdir -p ${PREFIX}/etc/conda/deactivate.d
mkdir -p ${PREFIX}/etc/conda/activate.d

cat <<EOF > ${PREFIX}/etc/conda/deactivate.d/${PKG_NAME}.sh
export PATH=\${PATH_pgi}
export MANPATH=\${MANPATH_pgi}
export LD_LIBRARY_PATH=\${LD_LIBRARY_PATH_pgi}
unset PATH_pgi
unset MANPATH_pgi
unset LD_LIBRARY_PATH_pgi
EOF

cat <<EOF > ${PREFIX}/etc/conda/activate.d/${PKG_NAME}.sh
export PGI=${PREFIX}/pgi/linux86-64/${PKG_VERSION}
export CC=\${PGI}/bin/pgcc
export FC=\${PGI}/bin/pgfortran
export F90=\${PGI}/bin/pgf90
export F77=\${PGI}/bin/pgf77
export CPP="\${PGI}/bin/pgcc -E"
export CXX=\${PGI}/bin/pgc++
#
export PATH_pgi=\${PATH}
export PATH=\${PGI}/bin:\${PATH}
#
export MANPATH_pgi=\${MANPATH}
export MANPATH=\${PGI}/man:\${MANPATH}
#
export LD_LIBRARY_PATH_pgi=\${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH=\${PGI}/lib:\${LD_LIBRARY_PATH}
EOF

scripts/pre-unlink.sh

#!/bin/sh

rm -f ${PREFIX}/etc/conda/deactivate.d/${PKG_NAME}.sh
rm -f ${PREFIX}/etc/conda/activate.d/${PKG_NAME}.sh

Fichier de correctif spécifié dans le fichier de métadonnées

fix-install.patch

diff -Nru pgilinux-2017-174-x86_64.orig/install_components/install pgilinux-2017-174-x86_64/install_components/install
--- pgilinux-2017-174-x86_64.orig/install_components/install	2017-04-22 02:16:31.000000000 +0900
+++ pgilinux-2017-174-x86_64/install_components/install	2017-06-01 14:30:18.902018374 +0900
@@ -739,27 +739,7 @@
             cd ..
             rm -rf scalapack
 
-            numa_lib=""
-            if test -e /usr/lib64/libnuma.so ; then
-                numa_lib=/usr/lib64/libnuma.so
-            elif test -e /usr/lib64/libnuma.so.1 ; then
-                numa_lib=/usr/lib64/libnuma.so.1
-            elif test -e /lib64/libnuma.so ; then
-                numa_lib=/lib64/libnuma.so
-            elif test -e /lib64/libnuma.so.1 ; then
-                numa_lib=/lib64/libnuma.so.1
-            elif test -e /usr/lib/x86_64-linux-gnu/libnuma.so ; then
-                numa_lib=/usr/lib/x86_64-linux-gnu/libnuma.so
-            elif test -e /usr/lib/x86_64-linux-gnu/libnuma.so.1 ; then
-                numa_lib=/usr/lib/x86_64-linux-gnu/libnuma.so.1
-            fi
-            if test "numa_lib" != "" ; then
-                ln -sf $numa_lib $INSTALL_DIR/linux86-64/$REL_VERSION/mpi/openmpi-${OMPI_VERSION}/lib/libnuma.so
-            else
-                echo "WARNING: libnuma.so was not found on your system!"
-                echo "Open MPI requires libnuma.so to function correctly."
-                echo "Please install libnuma.so from your Linux distribution onto this system."
-            fi
+            numa_lib="${PREFIX}/lib/libnuma.so"
 
             if test "$ans" != "y" -a "$ans" != "yes" ; then
                 mpi_wrapper="$INSTALL_DIR/linux86-64/$REL_VERSION/mpi/openmpi-${OMPI_VERSION}/bin/env.sh"

Matériel de référence

Recommended Posts

Comment créer un package Conda
Comment créer un pont virtuel
Comment créer un Dockerfile (basique)
Comment créer un fichier de configuration
Comment créer un clone depuis Github
Comment ajouter un package avec PyCharm
Comment installer un package à l'aide d'un référentiel
Comment créer un référentiel à partir d'un média
Comment créer un objet fonction à partir d'une chaîne
Comment créer un fichier JSON en Python
Comment créer un plug-in QGIS (génération de package)
[Note] Comment créer un environnement de développement Ruby
Comment créer une boîte de saisie Kivy 1 ligne
Procédure de création d'application multi-plateforme avec kivy
Comment créer une API Rest dans Django
[Note] Comment créer un environnement de développement Mac
Comment appeler une fonction
Comment pirater un terminal
Comment garder le conda éteint
Lire la source Python-Markdown: Comment créer un analyseur
Comment créer un sous-menu avec le plug-in [Blender]
[Go] Comment créer une erreur personnalisée pour Sentry
Comment créer un package Python à l'aide de VS Code
Comment créer un référentiel local pour le système d'exploitation Linux
Comment créer un simple script serveur / client TCP
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
Comment faire une traduction japonais-anglais
Comment mettre un lien symbolique
Étapes pour créer un projet Django
Comment créer un bot slack
Comment créer un robot - Avancé
Comment créer un maillage de flux autour d'un cylindre avec SnappyHexMesh
Comment créer une fonction récursive
Comment créer un package Python (écrit pour un stagiaire)
[Python Kivy] Comment créer une simple fenêtre pop-up
Comment créer / supprimer des liens symboliques
Comment utiliser Nix Package Manager
Comment enregistrer un package dans PyPI (à partir de septembre 2017)
[Blender] Comment créer un plug-in Blender
Comment supprimer un conteneur Docker
5 façons de créer un chatbot Python
Comment créer un robot - Basic
Comment créer une étiquette (masque) pour la segmentation avec labelme (masque de segmentation sémantique)
[Langage C] Comment créer, éviter et créer un processus zombie
Comment créer une grande quantité de données de test dans MySQL? ??
Comment créer un fichier factice CSV contenant du japonais à l'aide de Faker
Comment écrire une docstring pour créer un document tuple nommé avec sphinx
Comment créer une API de machine learning sans serveur avec AWS Lambda
J'ai essayé de créer un linebot (implémentation)
Comment empaqueter et distribuer des scripts Python
Créer un bot pour retweeter les informations sur le virus corona
Comment diviser et enregistrer un DataFrame
Comment créer un environnement de traduction sphinx