Package Management: Difference between revisions

From miki
Jump to navigation Jump to search
 
(61 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Ubuntu / Debian ==
== Ubuntu / Debian ==
See [[apt]].


== RPM's ==
Installing a package '''from REPOSITORIES''', using '''aptitude''':
* [http://susefaq.sourceforge.net/articles/rpm.html RPM RedHat Package Manager]
* [http://linuxgazette.net/issue68/nazario.html Using RPM: THe Basics (Part I)]
* '''Install commands'''
<source lang="bash">
<source lang="bash">
rpm -ivh package # Installing a package - verbose and progress bars
# ----- Installing from the REPOSITORIES - APTITUDE
aptitude update # (OPTIONAL) update the local repository cache
rpm -iv -nodeps package # Installing a package (verbose), ignore dependencies
aptitude install <package(s)> # Install given package
aptitude remove <package(s)> # Remove package (or install it if package name prefixed with - )
</source>
</source>
* '''Query commands'''
''Note: Advantage of <code>aptitude</code> over <code>apt-get</code> is that it maintains <tt>/var/log/aptitude</tt>, and remove dependencies by default.''

Installing a package '''from REPOSITORIES''', using '''apt-get''':
<source lang="bash">
<source lang="bash">
rpm -ql package # List files provided by a package
# ----- Installing from the REPOSITORIES - APT-GET
apt-get update # (OPTIONAL) update the local repository cache
apt-get install <package(s)> # Install given package
apt-get upgrade # Install new version of all installed package (without installing new package)
apt-get remove <package(s)> # Remove package (or install it if package name prefixed with - )
apt-get autoremove <package(s)> # Remove package and all its unused dependencies
apt-get purge <package(s)> # Remove package and related configuration files
apt-get autoremove # Remove package installed to satisfy dependencies for some package and that are no more needed
</source>
</source>
:* To query a package that has '''not been installed''', add '''-p''' option to the command:

Installing a package '''from a .deb PACKAGE file''':
<source lang="bash">
<source lang="bash">
rpm -qpl package # List files provided by a package
# ----- Installing from a .deb PACKAGE file
dpkg --install <debfile> # (or -i) Install a package from given .deb file
</source>
</source>


== Source package ==
Querying the '''cache''' or '''installed''' packages:
Installing from source package is usually done with
<source lang=bash>
<source lang="bash">
# ----- Querying INSTALLED PACKAGE
./configure
dpkg --get-selections # Show the list of packages installed through apt-get
make
dpkg --get-selections | grep php # ... filtering for some specific package keyword
sudo make install
dpkg -L <package> # List files delivered by a given <package>
dlocate -L <package> # ... same as above but much faster (require package dlocate)
dpkg -S <file> # List packages providing given file
dlocate -S <file> # ... same as above but much faster (require package dlocate)
dlocate <file> # ... same as dpkg -L -S combined but much faster (require package dlocate)
# ----- Querying the CACHE
apt-cache search <regex> # Search package cache (package name and description) for given <regex>
apt-cache search --name-only <regex> # ... same but only search in package name
apt-cache showpkg <package(s)> # Show version and dependencies information about given package(s)
apt-cache show <package(s)> # Show information (description...) about given package(s)
# ----- Querying a .deb PACKAGE file
dpkg --info <debfile> # (or -I) Show information of given .deb file
dpkg --content <debfile> # (or -c) Show content of given .deb file
</source>
</source>
Usually <code>./configure --help</code> gives additional package configuration options (like installing documentation, etc).


;Installing build dependencies
Querying packages that are '''not installed yet''' (requires package '''apt-file'''):<br>
: Building from sources usually requires more dependencies than using the package. If the package is available on the distribution, the easiest way to install these dependencies is usually via <code>apt-get build-dep</code>:
<source lang=bash>
<source lang=bash>
sudo apt-get build-dep udisks
apt-file update # (optional - needed 1st time use)
apt-file list <package> # Search package in repositories, and show the content
apt-file search <file> # Display the name of all packages within repository that contain this file
apt-file search -x "/<file>$" # ... more accurate query using regex
</source>
</source>
:''Note: An alternative is to use the script '''[{{#file: dweblocate}} dweblocate]''', but '''apt-file''' is more powerful actually''
<div style="display:none"><source lang="bash">
#!/bin/bash


;Installing as a package
# Very handy script to query online debian/ubuntu package database.
: Instead of installing with <code>make install</code>, use <code>[https://help.ubuntu.com/community/CheckInstall checkinstall]</code> to create a temporary package that can later be uninstalled with the package manager.
# It more or less imitates the behaviour of dlocate, but is not limited to package installed on the current system.
<source lang="bash">
#
./configure
# Usage:
make
#
sudo checkinstall # Creates a package and install it as if 'sudo make install' was run
# dweblocate -L <package> List all files in package <package>
# dweblocate -S <filename> List all packages that contains <filename>
#
# Based on script at http://mydebian.blogdns.org/?p=742
# Modified by Fuujuhi, 2009.


#... to uninstall:
DIST=ubuntu # debian | ubuntu
sudo dpkg -r <packagename>
SUITENAME=jaunty # Not necessary for debian
</source>
:Note that <tt>checkinstall</tt> can actually run any arbitrary command and monitor change on the file system.


== Backports ==
if [ "$DIST" = "ubuntu" ] ; then
=== Debian ===
LISTURL="http://packages.ubuntu.com/$DISTNAME/all/$2/filelist"
See [https://www.ocf.berkeley.edu/docs/staff/procedures/backporting-packages/ Backporting Debian packages].
SEARCHURL="http://packages.ubuntu.com/search?suite=${SUITENAME}&searchon=contents&keywords=$2"
elif [ "$DIST" = "debian" ] ; then
LISTURL="http://packages.ubuntu.com/$DISTNAME/all/$2/filelist"
SEARCHURL="http://packages.debian.org/search?suite=stable&searchon=contents&keywords=$2"
else
echo -e "Unknown distribution $DIST... Aborting!"
exit 1
fi


== Managing alternatives with <code>update-alternatives</code> ==
if [ $# -lt 2 ]; then
Display current set of alternatives (e.g. here for ''gcc'' on ''Cygwin''):
echo -e "Usage:\t$0 -S file \n\t$0 -L package"
<source lang=bash>
exit 1
$ /usr/sbin/update-alternatives --display gcc
fi

if [ "$1" = "-L" ]; then
wget -q "$LISTURL" -O- | sed -n '/<pre>/,/<\/pre>/ {s/^[^/]*//;/\/pre>/!p}'
elif [ "$1" = "-S" ]; then
wget -q "$SEARCHURL" -O- | sed -n '/<table>/,/<\/table>/ { s/[[:space:]]*<a href="[^>]*>\([^<]*\)<\/a>/\1/p}'
else
echo "Error: invalid argument \"$1\"";
exit 2
fi
</source></div>

View package installation history:
<source lang="bash">
grep install /var/log/dpkg.log # Also check dpkg.log.1, etc.
sudo cat /var/log/apt/terl.log # Also check
sudo cat /var/log/apt/history.log
</source>
</source>
<source lang=bash>

# gcc - status is manual.
To add a repository:
# link currently points to /usr/bin/gcc-3.exe
<source lang="bash">
# /usr/bin/gcc-3.exe - priority 30
vi /etc/apt/sources.list # or edit files in /etc/apt/sources.list.d/
# slave lib-cpp: <NONE>
apt-get update
# slave cc: /usr/bin/cc-3.exe
# slave cpp: /usr/bin/cpp-3.exe
# slave gcov: /usr/bin/gcov-3.exe
# slave i686-pc-cygwin-gcc-4.3.4: <NONE>
# slave i686-pc-cygwin-gcc: /usr/bin/i686-pc-cygwin-gcc-3.exe
# slave protoize: /usr/bin/protoize-3.exe
# slave unprotoize: /usr/bin/unprotoize-3.exe
# slave cpp.1.gz: /usr/share/man/man1/cpp-3.1.gz
# slave gcc.1.gz: /usr/share/man/man1/gcc-3.1.gz
# slave gcov.1.gz: /usr/share/man/man1/gcov-3.1.gz
# slave ffi.3.gz: <NONE>
# slave ffi_call.3.gz: <NONE>
# slave ffi_prep_cif.3.gz: <NONE>
# /usr/bin/gcc-4.exe - priority 40
# slave lib-cpp: /usr/bin/cpp-4.exe
# slave cc: /usr/bin/gcc-4.exe
# slave cpp: /usr/bin/cpp-4.exe
# slave gcov: /usr/bin/gcov-4.exe
# slave i686-pc-cygwin-gcc-4.3.4: <NONE>
# slave i686-pc-cygwin-gcc: /usr/bin/i686-pc-cygwin-gcc-4.exe
# slave protoize: <NONE>
# slave unprotoize: <NONE>
# slave cpp.1.gz: /usr/share/man/man1/cpp-4.1.gz
# slave gcc.1.gz: /usr/share/man/man1/gcc-4.1.gz
# slave gcov.1.gz: /usr/share/man/man1/gcov-4.1.gz
# slave ffi.3.gz: /usr/share/man/man3/ffi-4.3.gz
# slave ffi_call.3.gz: /usr/share/man/man3/ffi_call-4.3.gz
# slave ffi_prep_cif.3.gz: /usr/share/man/man3/ffi_prep_cif-4.3.gz
# Current `best' version is /usr/bin/gcc-4.exe.
</source>
</source>


'''Create a new entry''' with
To add a package authentication key:
<source lang="bash">
<source lang=bash>
/usr/sbin/update-alternatives --install /usr/bin/gcc.exe gcc /usr/bin/gcc-3.exe 30 \
gpg --keyserver keyserver.ubuntu.com --recv 247D1CFF # (optional) Get the key from some keyserver
--slave /usr/bin/cc.exe cc /usr/bin/cc-3.exe \
gpg --export --armor 247D1CFF | sudo apt-key add - # Add the key
--slave /usr/bin/cpp.exe cpp /usr/bin/cpp-3.exe \
--slave /usr/bin/gcov.exe gcov /usr/bin/gcov-3.exe \
--slave /usr/bin/i686-pc-cygwin-gcc.exe i686-pc-cygwin-gcc /usr/bin/i686-pc-cygwin-gcc-3.exe \
--slave /usr/bin/protoize.exe protoize /usr/bin/protoize-3.exe \
--slave /usr/bin/unprotoize.exe unprotoize /usr/bin/unprotoize-3.exe \
--slave /usr/share/man/man1/cpp.1.gz cpp.1.gz /usr/share/man/man1/cpp-3.1.gz \
--slave /usr/share/man/man1/gcc.1.gz gcc.1.gz /usr/share/man/man1/gcc-3.1.gz \
--slave /usr/share/man/man1/gcov.1.gz gcov.1.gz /usr/share/man/man1/gcov-3.1.gz
</source>
</source>


'''Select an entry''' with
To subscribe / unsubscribe to the package usage survey:
<source lang="bash">
<source lang=bash>
/usr/sbin/update-alternatives --auto gcc # Select alternative for gcc based on priority
dpkg-reconfigure popularity-contest
/usr/sbin/update-alternatives --set gcc /usr/bin/gcc-3.exe # Set gcc-3 as alternative for gcc (also set slaves, etc)
/usr/sbin/update-alternatives --config gcc # Select alternative via menu
</source>
</source>


=== Alternatives for clang ===
== RPM's ==
* [http://susefaq.sourceforge.net/articles/rpm.html RPM RedHat Package Manager]
* [http://linuxgazette.net/issue68/nazario.html Using RPM: THe Basics (Part I)]
* '''Install commands'''
<source lang="bash">
<source lang="bash">
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-3.8 100
rpm -ivh package # Installing a package - verbose and progress bars
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-6.0 1000
rpm -iv -nodeps package # Installing a package (verbose), ignore dependencies
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-3.8 100
</source>
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-6.0 1000
* '''Query commands'''
sudo update-alternatives --config clang
<source lang="bash">
sudo update-alternatives --config clang++
rpm -ql package # List files provided by a package
</source>
:* To query a package that has '''not been installed''', add '''-p''' option to the command:
<source lang="bash">
rpm -qpl package # List files provided by a package
</source>
</source>

Latest revision as of 09:24, 26 November 2019

Ubuntu / Debian

See apt.

RPM's

rpm -ivh package                    # Installing a package - verbose and progress bars
rpm -iv -nodeps package             # Installing a package (verbose), ignore dependencies
  • Query commands
rpm -ql package                     # List files provided by a package
  • To query a package that has not been installed, add -p option to the command:
rpm -qpl package                    # List files provided by a package

Source package

Installing from source package is usually done with

./configure
make
sudo make install

Usually ./configure --help gives additional package configuration options (like installing documentation, etc).

Installing build dependencies
Building from sources usually requires more dependencies than using the package. If the package is available on the distribution, the easiest way to install these dependencies is usually via apt-get build-dep:
sudo apt-get build-dep udisks
Installing as a package
Instead of installing with make install, use checkinstall to create a temporary package that can later be uninstalled with the package manager.
./configure
make
sudo checkinstall                  # Creates a package and install it as if 'sudo make install' was run

#... to uninstall:
sudo dpkg -r <packagename>
Note that checkinstall can actually run any arbitrary command and monitor change on the file system.

Backports

Debian

See Backporting Debian packages.

Managing alternatives with update-alternatives

Display current set of alternatives (e.g. here for gcc on Cygwin):

$ /usr/sbin/update-alternatives --display gcc
# gcc - status is manual.
#  link currently points to /usr/bin/gcc-3.exe
# /usr/bin/gcc-3.exe - priority 30
#  slave lib-cpp: <NONE>
#  slave cc: /usr/bin/cc-3.exe
#  slave cpp: /usr/bin/cpp-3.exe
#  slave gcov: /usr/bin/gcov-3.exe
#  slave i686-pc-cygwin-gcc-4.3.4: <NONE>
#  slave i686-pc-cygwin-gcc: /usr/bin/i686-pc-cygwin-gcc-3.exe
#  slave protoize: /usr/bin/protoize-3.exe
#  slave unprotoize: /usr/bin/unprotoize-3.exe
#  slave cpp.1.gz: /usr/share/man/man1/cpp-3.1.gz
#  slave gcc.1.gz: /usr/share/man/man1/gcc-3.1.gz
#  slave gcov.1.gz: /usr/share/man/man1/gcov-3.1.gz
#  slave ffi.3.gz: <NONE>
#  slave ffi_call.3.gz: <NONE>
#  slave ffi_prep_cif.3.gz: <NONE>
# /usr/bin/gcc-4.exe - priority 40
#  slave lib-cpp: /usr/bin/cpp-4.exe
#  slave cc: /usr/bin/gcc-4.exe
#  slave cpp: /usr/bin/cpp-4.exe
#  slave gcov: /usr/bin/gcov-4.exe
#  slave i686-pc-cygwin-gcc-4.3.4: <NONE>
#  slave i686-pc-cygwin-gcc: /usr/bin/i686-pc-cygwin-gcc-4.exe
#  slave protoize: <NONE>
#  slave unprotoize: <NONE>
#  slave cpp.1.gz: /usr/share/man/man1/cpp-4.1.gz
#  slave gcc.1.gz: /usr/share/man/man1/gcc-4.1.gz
#  slave gcov.1.gz: /usr/share/man/man1/gcov-4.1.gz
#  slave ffi.3.gz: /usr/share/man/man3/ffi-4.3.gz
#  slave ffi_call.3.gz: /usr/share/man/man3/ffi_call-4.3.gz
#  slave ffi_prep_cif.3.gz: /usr/share/man/man3/ffi_prep_cif-4.3.gz
# Current `best' version is /usr/bin/gcc-4.exe.

Create a new entry with

/usr/sbin/update-alternatives --install /usr/bin/gcc.exe gcc /usr/bin/gcc-3.exe  30 \
 --slave /usr/bin/cc.exe cc /usr/bin/cc-3.exe \
 --slave /usr/bin/cpp.exe cpp /usr/bin/cpp-3.exe \
 --slave /usr/bin/gcov.exe gcov /usr/bin/gcov-3.exe \
 --slave /usr/bin/i686-pc-cygwin-gcc.exe i686-pc-cygwin-gcc /usr/bin/i686-pc-cygwin-gcc-3.exe \
 --slave /usr/bin/protoize.exe protoize /usr/bin/protoize-3.exe \
 --slave /usr/bin/unprotoize.exe unprotoize /usr/bin/unprotoize-3.exe \
 --slave /usr/share/man/man1/cpp.1.gz cpp.1.gz /usr/share/man/man1/cpp-3.1.gz \
 --slave /usr/share/man/man1/gcc.1.gz gcc.1.gz /usr/share/man/man1/gcc-3.1.gz \
 --slave /usr/share/man/man1/gcov.1.gz gcov.1.gz /usr/share/man/man1/gcov-3.1.gz

Select an entry with

/usr/sbin/update-alternatives --auto gcc                        # Select alternative for gcc based on priority
/usr/sbin/update-alternatives --set gcc /usr/bin/gcc-3.exe      # Set gcc-3 as alternative for gcc (also set slaves, etc)
/usr/sbin/update-alternatives --config gcc                      # Select alternative via menu

Alternatives for clang

sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-3.8 100
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-6.0 1000
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-3.8 100
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-6.0 1000
sudo update-alternatives --config clang
sudo update-alternatives --config clang++