--- category: en type: paper layout: paper hastr: true tags: archlinux, configuration, linux title: Creating own repository short: creating-custom-repo description: It is a short paper devoted to creation own ArchLinux repository. ---
First find a server and desire to have sex with it. It is recommended to use Archlinux on it, but it is not necessarily - because you may create special root for Archlinux. Also you need two packages, devtools
and pacman
:
devtools is script set for building automation in the clean chroot. I think most of Arch maintainers use it.
Let's create working directories and set colors:
{% highlight bash %} # colors if [ ${USECOLOR} == "yes" ]; then bblue='\e[1;34m' bwhite='\e[1;37m' cclose='\e[0m' fi export USECOLOR # directories if [ ! -d "${PREPAREDIR}" ]; then [ -e "${PREPAREDIR}" ] && error_mes "file" "${PREPAREDIR}" echo -e "${bwhite}[II] ${bblue}Creating directory ${bwhite}'${PREPAREDIR}'${cclose}" mkdir -p "${PREPAREDIR}" || error_mes "unknown" fi if [ ! -d "${REPODIR}" ]; then [ -e "${REPODIR}" ] && error_mes "file" "${REPODIR}" echo -e "${bwhite}[II] ${bblue}Creating directory ${bwhite}'${REPODIR}'${cclose}" mkdir -p "${REPODIR}/"{i686,x86_64} || error_mes "unknown" fi if [ ! -d "${REPODIR}/i686" ]; then [ -e "${REPODIR}/i686" ] && error_mes "file" "${REPODIR}/i686" echo -e "${bwhite}[II] ${bblue}Creating directory ${bwhite}'${REPODIR}/i686'${cclose}" mkdir -p "${REPODIR}/i686" || error_mes "unknown" fi if [ ! -d "${REPODIR}/x86_64" ]; then [ -e "${REPODIR}/x86_64" ] && error_mes "file" "${REPODIR}/x86_64" echo -e "${bwhite}[II] ${bblue}Creating directory ${bwhite}'${REPODIR}/x86_64'${cclose}" mkdir -p "${REPODIR}/x86_64" || error_mes "unknown" fi if [ ! -d "${STAGINGDIR}" ]; then [ -e "${STAGINGDIR}" ] && error_mes "file" "${STAGINGDIR}" echo -e "${bwhite}[II] ${bblue}Creating directory ${bwhite}'${STAGINGDIR}'${cclose}" mkdir -p "${STAGINGDIR}" || error_mes "unknown" fi {% endhighlight %}${REPODIR}/{i686,x86_64}
are directories for repository, ${PREPAREDIR}
is directory where compiled packages will be stored, ${STAGINGDIR}
is one where packages will be built.
Create directory, share it (using ftp, for example). It has two subdirectories - i686
and x86_64
- for each architecture respectively. And fill them with a set of packages.
Updating repository may be split into the following steps:
Download source tarballs from AUR:
{% highlight bash %} cd "${STAGINGDIR}" yaourt -G package-name {% endhighlight %}Build each package automatically:
{% highlight bash %} func_build() { if [ ${USECOLOR} == "yes" ]; then _bblue='\e[1;34m' _bwhite='\e[1;37m' _cclose='\e[0m' fi _PREPAREDIR="$1" _ROOTDIR="$2" eval $(/usr/bin/grep 'arch=' PKGBUILD) eval $(/usr/bin/grep 'pkgname=' PKGBUILD) echo -e "${_bwhite}[II] ${_bblue}=>${_cclose} Building ${_bwhite}${pkgname}${_cclose}" if echo ${arch} | /usr/bin/grep 'any' -q; then LC_MESSAGES=C /usr/bin/sudo /usr/bin/staging-i686-build -r "${_ROOTDIR}" -c else eval $(/usr/bin/grep 'pkgname=' PKGBUILD) if echo ${pkgname} | /usr/bin/grep lib32 -q; then LC_MESSAGES=C /usr/bin/sudo /usr/bin/multilib-staging-build -r "${_ROOTDIR}" -c else if /usr/bin/grep 'lib32' PKGBUILD -q; then LC_MESSAGES=C /usr/bin/sudo /usr/bin/staging-i686-build -r "${_ROOTDIR}" -c LC_MESSAGES=C /usr/bin/sudo /usr/bin/multilib-staging-build -r "${_ROOTDIR}" -c else LC_MESSAGES=C /usr/bin/sudo /usr/bin/staging-i686-build -r "${_ROOTDIR}" -c LC_MESSAGES=C /usr/bin/sudo /usr/bin/staging-x86_64-build -r "${_ROOTDIR}" -c fi fi fi /usr/bin/cp *.pkg.tar.xz "${_PREPAREDIR}" } export -f func_build # building echo -e "${bwhite}[II]${cclose} Building packages" cd "${STAGINGDIR}" /usr/bin/find -name 'PKGBUILD' -type f -execdir /usr/bin/bash -c "func_build "${PREPAREDIR}" "${ROOTDIR}"" \; {% endhighlight %}It is recommended to add the following lines to /etc/sudoers
:
It is recommended to configure gpg-agent.
Here is a function for removal packages from database and repository:
{% highlight bash %} func_remove() { _PACKAGE="$1" /usr/bin/rm -f "${_PACKAGE}"{,.sig} } {% endhighlight %}i686
repository update:
x86_64
repository update:
You may want to create a directory, which will contain symlinks on actual packages with names, which does not contain version:
{% highlight bash %} # creating symlinks if [ ${SYMLINK} == "yes" ]; then echo -e "${bwhite}[II]${cclose} Creating symlinks" if [ ! -d "${REPODIR}/non-versioned" ]; then [ -e "${REPODIR}/non-versioned" ] && error_mes "file" "${REPODIR}/non-versioned" echo -e "${bwhite}[II] ${bblue}Creating directory ${bwhite}'${REPODIR}/non-versioned'${cclose}" mkdir -p "${REPODIR}/non-versioned" || error_mes "unknown" fi cd "${REPODIR}/non-versioned" for PACKAGE in ${i686_PACKAGES}; do PKGNAME=$(/usr/bin/package-query -p -f %n "${REPODIR}/i686/${PACKAGE}") /usr/bin/ln -sf "../i686/${PACKAGE}" "${PKGNAME}-i686.pkg.tar.xz" done for PACKAGE in ${x86_64_PACKAGES}; do PKGNAME=$(/usr/bin/package-query -p -f %n "${REPODIR}/x86_64/${PACKAGE}") /usr/bin/ln -sf "../x86_64/${PACKAGE}" "${PKGNAME}-x86_64.pkg.tar.xz" done fi {% endhighlight %}Here is the scripts. Download source tarballs and run script (editing variables if it is necessary).
Just add following lines to /etc/pacman.conf
: