본문 바로가기
리눅스

Wolfram Mathematica 데비안 패키징 만들기

by 다움위키 2025. 3. 17.

원문 보기: https://dawoum.duckdns.org/wiki/Wolfram_Mathematica

 

먼저, 설치 프로그램은 다운로드 센터에서 아이콘을 보고 선택할 수 있습니다. 그런-다음 루트 권한으로 스크립트를 실행합니다:

  • sudo bash Wolfram_14.2.0_LIN.sh
  • 대부분 ↵ Enter를 입력하면 됩니다
  • /usr/local/bin은 overwrite
  • system integration? y

Debian packaging

위와 같이 설치했을 때, 나중에 제거하기가 귀찮기 때문에, 패키지로 묶어둘 수 있습니다. 절차가 다른 프로그램에 비해 복잡하므로, 아치 패키징 파일을 참고할 필요가 있습니다:

아치 리눅스 패키징에 사용하는 2개의 파일을 같은 디렉토리에 둡니다. 그리고, 설치 스크립트를 만듭니다:

#!/bin/bash

pkgname=mathematica
pkgver=14.2.0
_pkgver=${pkgver%.[0-9]}
pkgrel=1

pkgdir=mathematica_14.2.0-1_amd64
srcdir=.

_installdir='/opt/Mathematica'

prepare() {
    echo "Building Mathematica takes around 24GiB of space for 'makepkg'."
    echo 'Building in a tmpfs (e.g. /tmp when mounted into RAM) may not work.'

    if [ "$(echo "${srcdir}" | wc -w)" -ne 1 ]; then
        echo "ERROR: The Mathematica installer doesn't support directory names with spaces."
        echo "Current build directory: ${srcdir}"
        exit 1
    fi

    echo 'Extracting Mathematica installer...'
    bash "${srcdir}/Wolfram_${pkgver}_LIN_Bndl.sh" \
      --keep \
      --target "${srcdir}/bundle" \
      -- \
      -help >/dev/null

    patch -p1 -d "${srcdir}"/bundle < "${srcdir}"/remove-xdg-scripts.patch
}

package() {
    installdir="$(realpath -m "${pkgdir}/${_installdir}")"

    echo 'Running Mathematica installer'
    # https://reference.wolfram.com/language/tutorial/InstallingWolfram.html#650929293
    bash "${srcdir}/bundle/Unix/Installer/WolframInstaller" \
        -execdir="${pkgdir}/usr/bin" \
        -targetdir="${installdir}" \
        -auto

    # Install documentation
    bash "${srcdir}"/bundle/Unix/.bundle/Unix/Installer/MathInstaller \
        -targetdir="${pkgdir}/tmp" \
        -auto
    rsync -a --remove-source-files "${pkgdir}"/tmp/Documentation/English "${installdir}"/Documentation/
    rm -rf "${pkgdir}"/tmp

    if [ -s "${installdir}"/InstallErrors ]; then
        echo "Review installation errors:"
        cat "${installdir}"/InstallErrors
    fi
    rm -f "${installdir}"/InstallErrors

    echo 'Fixing symbolic links'
    rm "${pkgdir}"/usr/bin/*
    ln -sf '../SystemFiles/Kernel/Binaries/Linux-x86-64/wolframscript' "${installdir}/Executables/"
    relative_installdir="$(realpath --relative-to="${pkgdir}/usr/bin" "${installdir}")"
    ln -s "${relative_installdir}"/Executables/math "${pkgdir}"/usr/bin/
    ln -s "${relative_installdir}"/Executables/MathKernel "${pkgdir}"/usr/bin/
    ln -s "${relative_installdir}"/Executables/mcc "${pkgdir}"/usr/bin/
    ln -s "${relative_installdir}"/Executables/wolfram "${pkgdir}"/usr/bin/
    ln -s "${relative_installdir}"/Executables/wolframnb "${pkgdir}"/usr/bin/
    ln -s "${relative_installdir}"/Executables/WolframKernel "${pkgdir}"/usr/bin/
    ln -s "${relative_installdir}"/Executables/WolframNB "${pkgdir}"/usr/bin/
    ln -s "${relative_installdir}"/SystemFiles/Kernel/Binaries/Linux-x86-64/ELProver "${pkgdir}"/usr/bin/
    ln -s "${relative_installdir}"/SystemFiles/Kernel/Binaries/Linux-x86-64/wolframscript "${pkgdir}"/usr/bin/

    echo 'Setting up WolframScript'
    mkdir -p "${srcdir}"/WolframScript
    mkdir -p "${pkgdir}"/usr/share
    mkdir -p "${pkgdir}"/tmp/WolframScript
    bsdtar -xf "${installdir}"/SystemFiles/Installation/wolframscript_*_amd64.deb -C "${pkgdir}"/tmp/WolframScript data.tar.xz
    tar -xf "${pkgdir}"/tmp/WolframScript/data.tar.xz -C "${pkgdir}" ./usr/share/
    rm -rf "${pkgdir}"/tmp

    echo 'Copying menu and mimetype information'
    mkdir -p \
          "${pkgdir}"/usr/share/applications \
          "${pkgdir}"/usr/share/desktop-directories \
          "${pkgdir}"/usr/share/mime/packages
    desktopFile="com.wolfram.Wolfram.${_pkgver}.desktop"
    sed -Ei 's|^(\s*TryExec=).*$|\1/usr/bin/WolframNB|g' "${installdir}/SystemFiles/Installation/$desktopFile"
    sed -Ei "s|^(\s*Exec=).*$|\1/usr/bin/WolframNB --name com.wolfram.Wolfram.${_pkgver} %F|g" "${installdir}/SystemFiles/Installation/$desktopFile"
    echo 'Categories=Science;Education;Languages;ArtificialIntelligence;Astronomy;Biology;Chemistry;ComputerScience;DataVisualization;Geography;ImageProcessing;Math;NumericalAnalysis;MedicalSoftware;Physics;ParallelComputer;' >> "${installdir}/SystemFiles/Installation/$desktopFile"
    cp "${installdir}/SystemFiles/Installation/$desktopFile" "${pkgdir}"/usr/share/applications/
    cp "${installdir}"/SystemFiles/Installation/*.directory "${pkgdir}"/usr/share/desktop-directories/
    cp "${installdir}"/SystemFiles/Installation/*.xml "${pkgdir}"/usr/share/mime/packages/

    echo 'Copying icons'
    tempdir="$(pwd)"
    mkdir -p "${pkgdir}"/usr/share/icons/hicolor/{32x32,64x64,128x128}/{apps,mimetypes}
    cd "${installdir}"/SystemFiles/FrontEnd/SystemResources/X || exit 1
    for i in 32 64 128; do
        cp App-${i}.png "${tempdir}/${pkgdir}"/usr/share/icons/hicolor/${i}x${i}/apps/wolfram-wolfram-${_pkgver}.png
        for mimetype in $(find . -name 'vnd.*' | cut -d '-' -f1 | uniq); do
            mimetype="$(basename "$mimetype")"
            cp "${mimetype}-${i}.png" "${tempdir}/${pkgdir}/usr/share/icons/hicolor/${i}x${i}/mimetypes/application-${mimetype}.png"
        done
    done
  
    cd -
    echo 'Copying man pages'
    mkdir -p "${pkgdir}"/usr/share/man/man1
    cp "${installdir}"/SystemFiles/SystemDocumentation/Unix/*.1 "${pkgdir}"/usr/share/man/man1

    echo 'Copying license'
    mkdir -p "${pkgdir}"/usr/share/licenses/Mathematica
    cp "${installdir}"/LICENSE.txt "${pkgdir}"/usr/share/licenses/Mathematica/LICENSE.txt

    echo 'Fixing file permissions'
    chmod go-w -R "${pkgdir}"/*
}

prepare
package

나머지 과정은 다른 바이너리 패키지 만드는 것과 동일합니다.