[PYTHON] So erstellen Sie ein Conda-Paket

So erstellen Sie ein Conda-Paket

Der Benutzer hat Anaconda Python in seinem Home-Verzeichnis Wenn installiert, Verfügbar im Conda-Paket sowie in Python Anwendungen, Bibliotheken usw. Es wird einfach zu bedienen sein.

In diesem Artikel wird beschrieben, wie Sie ein Conda-Paket in Anaconda Python erstellen Dies ist ein Dokument für Linux.

Conda-Paket

Bei Python-Paketen sind von PyPI (Python Package Index) verteilte Pakete bekannt. Diese können mit dem Befehl pip installiert werden.

** Installationsbeispiel mit Befehl pip **

$ pip install shpinx

PyPI-Pakete werden mit einem Verpackungstool namens setuptools erstellt. Weil es eine etwas eigenartige Methode zur Paketerstellung ist Es gibt einige Schwierigkeiten bei der Benutzerfreundlichkeit.

In Anaconda Python Sie können Pakete mit dem Befehl Conda hinzufügen / entfernen Es wird eine einfache Möglichkeit zum Erstellen eines Pakets bereitgestellt.

Das Conda-Paket wird von folgendem Speicherort heruntergeladen:

Vorbereiten der Erstellung eines Conda-Pakets

Wenn nur, um das Conda-Paket zu erstellen Sie können Miniconda verwenden.

** So installieren Sie 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

Als nächstes in der Root-Umgebung von Anaconda Python Installieren Sie das conda-build-Paket.

$ conda install -n root conda-build

Es wird empfohlen, die neueste Version von conda-build zu verwenden. Auch nach der Installation können Sie wie folgt aktualisieren.

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

Verzeichnisstruktur von conda-build

Miniconda3, wenn Sie Miniconda3 unter $ HOME / conda / x64 installiert haben conda-build legt die Dateien in den folgenden Verzeichnissen ab:

$HOME/conda/x64/conda-bld/
├── git_cache           --Quelle mit git heruntergeladen
├── hg_cache            --Quelle mit mercurial heruntergeladen
├── linux-64            --Conda-Paket(x86_64:Systemabhängig)
├── linux-ppc64le       --Conda-Paket(ppc64le:Systemabhängig)
├── noarch              --Conda-Paket(noarch)
├── src_cache           --Quelle mit Curl heruntergeladen
└── svn_cache           --Quelle mit Subversion heruntergeladen

Das Paket ist nach dem Rezept aufgebaut (dazu später mehr), Wenn Sie das Paket installieren, wird es normalerweise in das folgende Verzeichnis extrahiert.

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

Wenn Sie es in ein Conda-Paket legen, Unter dem Home-Verzeichnis des Benutzers Sie können Pakete mit Benutzerrechten hinzufügen / entfernen.

Konvertieren Sie von einem vorhandenen Paket in ein Conda-Paket

Sie finden es unter CPAN, CRAN, luarocks.org, PyPI mit dem Befehl conda skeleton. Sie können ein vorhandenes Paket in ein Conda-Paket konvertieren.

Zum Beispiel Pyinstrument, das von PyPI vertrieben wird Führen Sie den Befehl wie folgt aus, um daraus ein Conda-Paket zu machen.

$ 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.

Bei der Ausführung befindet es sich im aktuellen Verzeichnis Ein Verzeichnis mit dem Paketnamen sphinx wird erstellt Die erforderlichen Dateien werden erstellt.

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

Diese Dateien werden als Conda-Paketrezepte bezeichnet.

Wenn Sie dem Befehl conda build das Verzeichnis geben, in dem das Rezept gespeichert ist, Sie können ein Conda-Paket erstellen.

conda build autopep8

Dadurch wird eine Paketdatei erstellt (eigentlich ein Tarball).

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

Namenskonvention für Conda-Pakete

Das Conda-Paket erstellt eine Paketdatei mit derselben Namenskonvention wie jetzt.

Paketnamen-Ausführung-Build-Typ_Build-Nummer.tar.bz2

Conda-Pakete für verschiedene Python-Versionen

Wenn Sie Miniconda3-4.3.14 installieren Die Standardversion von Python ist 3.6. Auf dieser Plattform Wenn Sie ein Conda-Paket für Python 2.7 erstellen möchten Bauen Sie wie folgt:

$ conda build --python=2.7 autopep8

Die als Ergebnis der Erstellung erstellte Datei lautet wie folgt

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

Kanalregistrierung

Kanalregistrierung

Zum Beispiel auf einem Linux-Computer mit der x86_64-Architektur Mit Conda unter / home / iisaka / py3 installiert Wenn Sie das Paket erstellen, wird es im folgenden Verzeichnis gespeichert.

Registrieren wir dies als Kanal.

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

Rezept

Das Rezept besteht aus den folgenden Dateien.

Paketmetadaten

Paketmetadaten Paketname, Paketnummer, Build-Nummer, wie man die Quelle erhält usw. Die Datei ist im YAML-Format geschrieben und der Dateiname lautet meta.yaml.

#Kommentare vom scharfen Zeichen bis zum Ende der Zeile
package:
  name:Paketnamen
  version:Versionsnummer

source:
  fn:Dateiname zum Speichern
  url:URL zum Herunterladen der Quelle
#Der Prüfsummenwert kann entweder nur der eine oder der andere sein
  md5:Überprüfen Sie den Summenwert von md5sum
  sha1:Überprüfen Sie den Summenwert von sha1sum
  sha256:Überprüfen Sie den Summenwert von sha256sum

#   patches:    #Liste der Patch-Dateien(Optional)
#      - fix1.patch
#      - fix2.patch
build:
  number: 0       #Build-Nummer

requirements:     #Beschreiben Sie den Namen des abhängigen Pakets
  build:          #Zum Zeitpunkt der Erstellung erforderliche Pakete
    - python
    - setuptools

  run:            #Zur Laufzeit erforderliche Pakete
    - python

about:      #Beschreiben Sie die Paketbeschreibung
  home:     #URL der Site oder des Projekts, die die Quelle verteilt
  license:  #Listenlizenz GPL2, GPL3, AGPL3, BSD,MIT etc.
  summary:  #Überblick
  description:Erläuterung
  license_family: BSD

Für Quelle statt URL Sie können auch einen relativen Pfad aus dem Rezeptverzeichnis mit Pfad angeben.

Das Format der jungfräulichen Nummer folgt PEP-440.

Wenn Sie die Anforderungen und die Build-Nummer für jede Plattform ändern möchten, Geben Sie den Selektor an und beschreiben Sie ihn wie folgt.

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

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

Der Selektor hat das Format `# [Wert]` und der Wert kann wie folgt angegeben werden.

Auswahlwert Inhalt
x86 X86-Architektur mit Intel- und AMD-CPUs(32bit/64bit)Richtig bei
x86_64 X86 mit Intel oder AMD CPU_64 Architektur(64bit)Richtig bei
linux Richtig, wenn die Plattform Linux ist
linux32 Richtig, wenn die Plattform Linux ist und die Python-Architektur 32-Bit ist
linux64 True, wenn die Plattform Linux ist und die Python-Architektur 64-Bit ist
armv6l True, wenn die Plattform Linux und die Python-Architektur armv6l ist
armv7l Richtig, wenn die Plattform Linux und die Python-Architektur armv7l ist
ppc64le True, wenn die Plattform Linux ist und die Python-Architektur ppc64le ist
osx True, wenn die Plattform OS X ist
unix Plattform ist Unix(OS X oder Linux)Richtig bei
win True, wenn die Plattform Windows ist
win32 Richtig, wenn die Plattform Windows und die Python-Architektur 32-Bit ist
win64 True, wenn die Plattform Windows und die Python-Architektur 64-Bit ist
py XX Zwei-Buchstaben-Versionsnotation von Python(Beispiel 27)Gib CONDA_Entspricht dem Wert von PY)
py3k Richtig, wenn die Hauptversion von Python 3 ist
py2k True, wenn die Hauptversion von Python 2 ist
py27 Python Version 2.Richtig um 7
py34 Python Version 3.Richtig, wenn 4
py35 Python Version 3.Richtig bei 5
py36 Python Version 3.Richtig um 6
np XX Ganzzahlige Notation der NumPy-Version(Beispiel 111) CONDA_Entspricht dem Wert von NPY

Skript erstellen

Was ist ein Build-Skript? Erforderlich, um ein Paket zu erstellen Ein Skript mit Anweisungen.

#!/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.

Entsprechend den in den Metadaten beschriebenen Quellenverfügbarkeitsinformationen Der Befehl conda build wird heruntergeladen Extrahieren Sie es in Ihr Arbeitsverzeichnis und rufen Sie das Build-Skript auf.

Das Arbeitsverzeichnis befindet sich unter $ HOME / conda / x64 / conda-build. Erstellt mit einem * Paketnamen-Epochenzeit * -Verzeichnisnamen.

Bei der Installation beim Erstellen eines Pakets Wechseln Sie unter dem Arbeitsverzeichnis zu dem Verzeichnis, das mit "b_env" beginnt Es wird in installiert.

/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

Vor- / Nachbearbeitung

Wenn Sie vor und nach der Installation des Conda-Pakets verarbeiten möchten, Erstellen Sie das folgende Skript.

Diese Skripte werden ausgeführt, nachdem die folgenden Umgebungsvariablen festgelegt wurden.

Umgebungsvariable Inhalt
PREFIX (--Angegeben durch Präfix)Installationsverzeichnis
PKG_VERSION Paketversion
PKG_BUILDNUM Paket-Build-Nummer

Bei der Vor- / Nachbearbeitung wird nichts an die Standardausgabe oder die Standardfehlerausgabe ausgegeben. Es wird in $ PREFIX / .messages.txt gespeichert.

Umgebungsvariablen im Conda-Erstellungsprozess

Die folgenden Umgebungsvariablen werden intern in Conda festgelegt: Sie können im Build-Skript darauf verweisen.

Umgebungsvariable Inhalt
ARCH Entweder 32 oder 64. Die Standardeinstellung hängt von der Plattform ab, auf der conda ausgeführt wird.
CMAKE_GENERATOR CMake-Generatorzeichenfolge für die aktuelle Build-Umgebung. Auf Unix-Systemen ist dies immer der Fall"Unix Makefiles"ist.
CONDA_BUILD=1 1 ist immer gesetzt.
CPU_COUNT Anzahl der CPUs(multiprocessing.cpu_count()Wert zurückgegeben von)
SHLIB_EXT Gemeinsame Bibliothekserweiterung
DIRTY zum Befehl conda build--Wenn das Dirty-Flag übergeben wird, wird es auf 1 gesetzt. Es kann verwendet werden, um Teile des Build-Skripts bedingt zu überspringen.(Keine Wiederholung erforderlich, um Zeit beim Herunterladen, Bereitstellen und Entwickeln von Rezepten zu sparen>Etwas wie)
HTTP_PROXY Erbt die in der Shell festgelegten Umgebungsvariablen.
HTTPS_PROXY Erbt die in der Shell festgelegten Umgebungsvariablen.
LANG Erbt die in Ihrer Shell festgelegten Umgebungsvariablen.
MAKEFLAGS Erbt die in Ihrer Shell festgelegten Umgebungsvariablen. Zum Bauen mit zwei CPUs-Zu ergänzende Argumente wie j2.
NPY_VER Numpy Version zu bauen(CONDA_NPY-Umgebungsvariablen und--Mit numpy einstellen)
PATH Erbt die in Ihrer Shell festgelegten Umgebungsvariablen.$PREFIX/bin wird hinzugefügt.
PREFIX (--Angegeben durch Präfix)Installationsverzeichnis)
PKG_VERSION Paketversion
PYTHON Der Pfad zur ausführbaren Python-Datei in der Build-Umgebung.
R Der Pfad zur ausführbaren R-Datei in der Build-Umgebung. R wird nur installiert, wenn es als Build-Anforderung aufgeführt ist)
RECIPE_DIR Rezeptverzeichnis
SP_DIR Python-Site-Pfad zu Paketen
SRC_DIR Quelle entfaltet sich(Oder klonen)Pfad, den die Quelldatei erkennen kann(.zip, .tar, .tar.gz, .tar.bz2, .tar.xz )Wenn nicht, ist dies der Pfad zu dem Verzeichnis, in das die Quelldateien kopiert wurden.
STDLIB_DIR Pfad zur Python-Standardbibliothek
PKG_CONFIG_PATH Pfad zum Verzeichnis pkgconfig
LD_RUN_PATH <build_prefix>/lib

Umgebungsvariablen in git

Wenn Sie ein Git-Repository mit "git_url" oder "path" als Quelle angeben, werden auch die folgenden Umgebungsvariablen festgelegt:

Umgebungsvariable Inhalt
GIT_BUILD_STR GIT_DESCRIBE_NUMMER und GIT_DESCRIBE_HASH unterstreichen(_)Zeichenketten verbunden durch.
GIT_DESCRIBE_HASH git describe --Aktueller Commit-Short-Hash-Wert, der von Tags angezeigt wird
GIT_DESCRIBE_NUMBER Eine Zeichenfolge, die die Anzahl der Commits aus dem letzten Tag angibt
GIT_DESCRIBE_TAG Eine Zeichenfolge, die das neueste Tag aus dem aktuellen Commit darstellt(git describe --Ausgabe von Tags)
GIT_FULL_HASH Eine Zeichenfolge, die den vollständigen SHA1-Wert des aktuellen HEAD angibt

Umgebungsvariablen in Quecksilber

Wenn ein Quecksilber-Repository für die Quelle angegeben ist, Die folgenden Umgebungsvariablen werden ebenfalls festgelegt:

Umgebungsvariable Inhalt
HG_BRANCH Eine Zeichenfolge, die den aktuell aktiven Zweig angibt
HG_BUILD_STR HG_NUM_ID und HG_SHORT_ID unterstreichen(_)Zeichenkette verbunden durch
HG_LATEST_TAG Eine Zeichenfolge, die das neueste Tag aus dem aktuellen Commit angibt
HG_LATEST_TAG_DISTANCE Eine Zeichenfolge, die die Anzahl der Commits vom letzten Tag angibt
HG_NUM_ID Zeichenfolge, die die Versionsnummer angibt
HG_SHORT_ID Eine Zeichenfolge, die den Commit-Hash angibt

Vererbung von Umgebungsvariablen

Auf der Linux-Plattform in einer Umgebung, in der andere als die oben genannten Konda-Builds aufgerufen werden, Es werden keine Variablen geerbt. Durch Hinzufügen zu meta.yaml Sie können zu vererbende Umgebungsvariablen hinzufügen.

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

Wenn die geerbte Variable zur Erstellungszeit in der Shell-Umgebung fehlt Diese Variable bleibt nicht zugeordnet. Es wird eine Warnung angezeigt, die besagt, dass der Wert nicht eingestellt wurde.

Hinweis: Umgebungsvariablen erben Für andere kann es schwierig sein, die Binärdatei anhand des Rezepts aus der Quelle zu reproduzieren. Verwenden Sie diese Funktion mit Vorsicht oder vermeiden Sie sie überhaupt.

Umgebungsvariablen, die den Erstellungsprozess beeinflussen

Umgebungsvariable Inhalt
CONDA_PY 27,Gib 34 oder 35. Die Version von Python zum Erstellen des Pakets.
CONDA_NPY 19,Gib 110 oder 111. Die Version von numpy, die beim Erstellen des Pakets verwendet wird.
CONDA_PREFIX /path/to/conda/Pfad zur Conda-Umgebung, die beim Erstellen eines Pakets wie env verwendet wird

Umgebungsvariablen in Build-Features

Auch wenn die Funktionen den gleichen Namen und die gleiche Version haben Mit diesem Mechanismus können Sie den Unterschied zwischen Paketen registrieren. Die von track_features angegebenen Pakete werden ebenfalls installiert.

Die Funktion ist nicht das Paket selbst Dies sind die Merkmale der Umgebung, in der das Paket installiert ist. Wenn beispielsweise mkl in track_features angegeben ist, Regelmäßige numpy entfernt und mkl vorgestellten numpy Paket installiert Dies liegt daran, dass sich die Conda automatisch entsprechend der angegebenen Funktion ändert, z.

Umgebungsvariable Inhalt
FEATURE_NOMKL Geben Sie beim Erstellen des Pakets die Funktion nomkl an. 0 für aus, 1 für ein
FEATURE_DEBU Geben Sie beim Erstellen von Paketen Debug-Funktionen an. 0 für aus, 1 für ein
FEATURE_OPT Geben Sie beim Erstellen des Pakets die Option opt an. 0 für aus, 1 für ein

Tipps erstellen

Wenn ich versuche, ein Paket zu erstellen, erhalte ich mehrere abhängige Pakete Möglicherweise müssen Sie es erstellen.

Stellen Sie den Namen des Rezeptverzeichnisses auf den in der Metadatei angegebenen Paketnamen ein.

Auf diese Weise, wenn Sie das Paket erstellen Das gleiche Verzeichnis wie das abhängige Paket Wenn im aktuellen Verzeichnis Dieses Paket wird automatisch für Sie erstellt.

Machen wir den PGI-Compiler zu einem Conda-Paket

Seit 2016 ist die Community-Version des PGI-Compilers kostenlos verfügbar Machen wir dies zu einem Conda-Paket.

numactl Paket

Erstellen Sie zunächst das vom PGI-Compiler benötigte numactl-Paket.

Erstellen Sie dasselbe Verzeichnis wie den Paketnamen numactl Platzieren Sie dort die Metadatendatei und das Bulld-Skript.

$ mkdir numactl 

** Metadatendatei **

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

** Skript erstellen **

#!/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

Erstellen Sie das numactl-Paket

$ conda build numactl

PGI-Compiler

Da die Notation von jinja2 in der Metadatei verwendet werden kann, Wird durch den Wert der Umgebungsvariablen zur Erstellungszeit wie folgt generiert Ich versuche Pakete zu wechseln.

Legen Sie Standardwerte für abhängige Pakete fest

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

#Enthält den Wert der Umgebungsvariablen HOME
{% set home = environ.get("HOME") %}

#Umgebungsvariable PGI_Enthält den Wert von COMPONENT
{% set component = environ.get("PGI_COMPONENT") %}

# PGI_Das Paketziel wird gemäß dem von COMPONENT angegebenen Wert geteilt.
{% 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" %}
#Fordern Sie numactl-Pakete nur für Compiler an
{% set numactl = "- numactl" %}
{% endif %}

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

source:
#TAR-Ball im Voraus von der ggA-Website heruntergeladen$Speichern Sie zu Hause
  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."

Das Build-Skript sieht folgendermaßen aus:

#!/bin/bash

#Legen Sie die Parameter für das Installationsskript fest
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

#Installationsverzeichnis erstellen
[ -d ${PREFIX}/pgi ] || mkdir ${PREFIX}/pgi

# post-link.sh / pre-unlink.Löschen Sie sh, wenn es sich im Rezeptverzeichnis befindet
[ -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
Extrahieren Sie die Datei gemäß dem Paketnamen
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
    #Post nur für Compiler-link.sh / pre-unlink.aktiviere 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

#Löschen Sie nicht benötigte Dateien
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
}

Mit scripts / post-link.sh im Rezeptverzeichnis Erstellen Sie 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

In der Metadatendatei angegebene Patch-Datei

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"

Referenzmaterial

Recommended Posts

So erstellen Sie ein Conda-Paket
So erstellen Sie eine virtuelle Brücke
Wie erstelle ich eine Docker-Datei?
So erstellen Sie eine Konfigurationsdatei
So erstellen Sie einen Klon aus Github
So fügen Sie ein Paket mit PyCharm hinzu
So installieren Sie ein Paket mithilfe eines Repositorys
So erstellen Sie ein Repository aus Medien
So erstellen Sie ein Funktionsobjekt aus einer Zeichenfolge
So erstellen Sie eine JSON-Datei in Python
So erstellen Sie ein QGIS-Plug-In (Paketerzeugung)
[Hinweis] So erstellen Sie eine Ruby-Entwicklungsumgebung
So erstellen Sie ein 1-zeiliges Kivy-Eingabefeld
Verfahren zur Erstellung plattformübergreifender Apps mit kivy
So erstellen Sie eine Rest-API in Django
[Hinweis] So erstellen Sie eine Mac-Entwicklungsumgebung
So rufen Sie eine Funktion auf
Wie man ein Terminal hackt
Wie man Conda fernhält
Lesen Sie die Python-Markdown-Quelle: So erstellen Sie einen Parser
So erstellen Sie ein Untermenü mit dem Plug-In [Blender]
[Go] So erstellen Sie einen benutzerdefinierten Fehler für Sentry
So erstellen Sie ein Python-Paket mit VS Code
So erstellen Sie ein lokales Repository für Linux
So erstellen Sie ein einfaches TCP-Server / Client-Skript
[Python] So erstellen Sie mit Matplotlib ein zweidimensionales Histogramm
Wie erstelle ich eine japanisch-englische Übersetzung?
So setzen Sie einen symbolischen Link
Schritte zum Erstellen eines Django-Projekts
Wie man einen lockeren Bot macht
Wie erstelle ich einen Crawler?
So erstellen Sie mit snappyHexMesh ein Flussnetz um einen Zylinder
So erstellen Sie eine rekursive Funktion
Wie erstelle ich ein Python-Paket (geschrieben für Praktikanten)
[Python Kivy] So erstellen Sie ein einfaches Popup-Fenster
So erstellen / löschen Sie symbolische Links
Verwendung von Nix Package Manager
So registrieren Sie ein Paket in PyPI (Stand September 2017)
[Blender] So erstellen Sie ein Blender-Plug-In
So löschen Sie einen Docker-Container
5 Möglichkeiten zum Erstellen eines Python-Chatbots
Wie erstelle ich einen Crawler?
So erstellen Sie eine Bezeichnung (Maske) für die Segmentierung mit labelme (semantische Segmentierungsmaske)
[C-Sprache] So erstellen, vermeiden und erstellen Sie einen Zombie-Prozess
Wie erstelle ich eine große Menge an Testdaten in MySQL? ??
So erstellen Sie mit Faker eine CSV-Dummy-Datei mit Japanisch
So schreiben Sie eine Dokumentzeichenfolge, um ein benanntes Tupeldokument mit Sphinx zu erstellen
So erstellen Sie mit AWS Lambda eine serverlose API für maschinelles Lernen
Ich habe versucht, einen Linebot zu erstellen (Implementierung)
So verpacken und verteilen Sie Python-Skripte
Erstellen Sie einen Bot, um Corona-Virus-Informationen zu retweeten
So teilen und speichern Sie einen DataFrame
So erstellen Sie eine Sphinx-Übersetzungsumgebung