'MSYS2 makepkg PKGBUILD with meson - which directory is used in package()?
In MSYS2, there is already a package for tio, version 1.32; this package is built through a PKGBUILD file, which can be seen here:
I wanted to build the latest version of tio, which is currently 1.37, for MSYS2 (I use it on Windows 10). One of the main differences is that whereas tio 1.32 used configure.ac and a Makefile for building, tio 1.37 uses the meson build system.
So, I tried to convert the existing PKGBUILD for tio 1.32, into PKGBUILD that would use meson for 1.37; I've put related files in this gist:
First off, I have a C:\src directory, and there I create a new directory for building, using the MSYS2 bash shell, where I retrieve the edited file (from the gist) - and finally, I issue the makepkg command (found in https://www.msys2.org/wiki/Creating-Packages/)
$ mkdir tio_msys2
$ cd tio_msys2
$ wget https://gist.githubusercontent.com/sdbbs/77ce5e0bfa59cdabda5fad5596ab9ccd/raw/462234c53bb1cfcdbe0d6323afbef4845231cab2/01_PKGBUILD -O PKGBUILD
$ makepkg -sCLf
In short, the PKGBUILD file looks like this:
pkgname=tio
pkgver=1.37
pkgrel=1
pkgdesc="A simple TTY terminal I/O application"
arch=('i686' 'x86_64')
url="https://tio.github.io/"
license=('GPL')
makedepends=('autotools' 'gcc' 'meson' 'ninja')
source=(https://github.com/tio/tio/releases/download/v${pkgver}/tio-${pkgver}.tar.xz)
sha256sums=('a54cd09baeaabd306fdea486b8161eea6ea75bb970b27cae0e8e407fb2dd7181')
validpgpkeys=('101BAC1C15B216DBE07A3EEA2BDB4A0944FA00B1') # Martin Lund
prepare() {
cd "${srcdir}/${pkgname}-${pkgver}"
}
build() {
cd "${srcdir}/${pkgname}-${pkgver}"
meson --prefix=/usr --buildtype=plain build
meson compile -C build
}
package() {
echo "srcdir ${srcdir} pkgname ${pkgname} pkgver ${pkgver} destdir ${destdir}"
cd "${srcdir}/${pkgname}-${pkgver}"
meson install -C build --destdir "$pkgdir"
}
The build succeeds - you can see the full build log in 02_makepkg.log, but the relevant thing is that tio.exe does get generated:
$ find . -name '*.exe'
./pkg/tio/usr/bin/tio.exe
./src/tio-1.37/build/meson-private/sanitycheckc.exe
./src/tio-1.37/build/meson-private/sanitycheckcpp.exe
./src/tio-1.37/build/meson-private/__CMake_compiler_info__/CMakeFiles/3.22.1/CompilerIdC/a.exe
./src/tio-1.37/build/src/tio.exe
Also, a pkg directory gets generated (that is, /c/src/tio_msys2/pkg), probably in the package() step (probably as a result of the meson install ... command) -- which does look like a "packaged" tree, as we expect to see it in an installation package:
$ tree -a pkg
pkg
└── tio
├── .BUILDINFO
├── .MTREE
├── .PKGINFO
└── usr
├── bin
│ └── tio.exe
└── share
├── bash-completion
│ └── completions
│ └── tio
└── man
└── man1
└── tio.1.gz
8 directories, 6 files
(you can also see the full tree listing of /c/src/tio_msys2/ in 03_files_after_makepkg.log)
HOWEVER, when I inspect the final package file (the one that actually gets installed by the package manager/pacman), which (I think) is tio-1.37.tar.xz - I see no .exe whatsoever?
$ tar tJvf tio-1.37.tar.xz
drwxrwxr-x lundmar/lundmar 0 2022-04-13 18:01 tio-1.37/
drwxrwxr-x lundmar/lundmar 0 2022-04-13 18:00 tio-1.37/.circleci/
-rw-rw-r-- lundmar/lundmar 1112 2022-04-13 18:00 tio-1.37/.circleci/config.yml
-rw-rw-r-- lundmar/lundmar 34 2022-04-13 18:00 tio-1.37/.gitignore
-rw-rw-r-- lundmar/lundmar 1150 2022-04-13 18:00 tio-1.37/AUTHORS
-rw-rw-r-- lundmar/lundmar 21770 2022-04-13 18:00 tio-1.37/ChangeLog
-rw-rw-r-- lundmar/lundmar 709 2022-04-13 18:00 tio-1.37/LICENSE
-rw-rw-r-- lundmar/lundmar 3988 2022-04-13 18:00 tio-1.37/README.md
drwxrwxr-x lundmar/lundmar 0 2022-04-13 18:00 tio-1.37/images/
-rw-rw-r-- lundmar/lundmar 12344 2022-04-13 18:00 tio-1.37/images/paypal.png
-rw-rw-r-- lundmar/lundmar 1846157 2022-04-13 18:00 tio-1.37/images/tio-demo.gif
drwxrwxr-x lundmar/lundmar 0 2022-04-13 18:00 tio-1.37/man/
-rw-rw-r-- lundmar/lundmar 375 2022-04-13 18:00 tio-1.37/man/meson.build
-rw-rw-r-- lundmar/lundmar 6022 2022-04-13 18:00 tio-1.37/man/tio.1.in
-rw-rw-r-- lundmar/lundmar 1578 2022-04-13 18:00 tio-1.37/meson.build
-rw-rw-r-- lundmar/lundmar 130 2022-04-13 18:00 tio-1.37/meson_options.txt
drwxrwxr-x lundmar/lundmar 0 2022-04-13 18:00 tio-1.37/src/
drwxrwxr-x lundmar/lundmar 0 2022-04-13 18:00 tio-1.37/src/bash-completion/
-rw-rw-r-- lundmar/lundmar 647 2022-04-13 18:00 tio-1.37/src/bash-completion/meson.build
-rw-rw-r-- lundmar/lundmar 3017 2022-04-13 18:00 tio-1.37/src/bash-completion/tio.in
-rw-rw-r-- lundmar/lundmar 6650 2022-04-13 18:00 tio-1.37/src/configfile.c
-rw-rw-r-- lundmar/lundmar 1130 2022-04-13 18:00 tio-1.37/src/configfile.h
-rw-rw-r-- lundmar/lundmar 1251 2022-04-13 18:00 tio-1.37/src/error.c
-rw-rw-r-- lundmar/lundmar 929 2022-04-13 18:00 tio-1.37/src/error.h
-rw-rw-r-- lundmar/lundmar 962 2022-04-13 18:00 tio-1.37/src/iossiospeed.c
-rw-rw-r-- lundmar/lundmar 2394 2022-04-13 18:00 tio-1.37/src/log.c
-rw-rw-r-- lundmar/lundmar 936 2022-04-13 18:00 tio-1.37/src/log.h
-rw-rw-r-- lundmar/lundmar 2313 2022-04-13 18:00 tio-1.37/src/main.c
-rw-rw-r-- lundmar/lundmar 880 2022-04-13 18:00 tio-1.37/src/meson.build
-rw-rw-r-- lundmar/lundmar 2955 2022-04-13 18:00 tio-1.37/src/misc.c
-rw-rw-r-- lundmar/lundmar 967 2022-04-13 18:00 tio-1.37/src/misc.h
-rw-rw-r-- lundmar/lundmar 9897 2022-04-13 18:00 tio-1.37/src/options.c
-rw-rw-r-- lundmar/lundmar 1611 2022-04-13 18:00 tio-1.37/src/options.h
-rw-rw-r-- lundmar/lundmar 1434 2022-04-13 18:00 tio-1.37/src/print.c
-rw-rw-r-- lundmar/lundmar 2113 2022-04-13 18:00 tio-1.37/src/print.h
-rw-rw-r-- lundmar/lundmar 1295 2022-04-13 18:00 tio-1.37/src/setspeed2.c
-rw-rw-r-- lundmar/lundmar 1174 2022-04-13 18:00 tio-1.37/src/signals.c
-rw-rw-r-- lundmar/lundmar 859 2022-04-13 18:00 tio-1.37/src/signals.h
-rw-rw-r-- lundmar/lundmar 24490 2022-04-13 18:00 tio-1.37/src/tty.c
-rw-rw-r-- lundmar/lundmar 1397 2022-04-13 18:00 tio-1.37/src/tty.h
drwxrwxr-x lundmar/lundmar 0 2022-04-13 18:00 tio-1.37/subprojects/
-rw-rw-r-- lundmar/lundmar 82 2022-04-13 18:00 tio-1.37/subprojects/libinih.wrap
In fact, it looks like, only the src, man, images and subprojects subdirectories of the src/tio-1.37 (that is, /c/src/tio_msys2/src/tio-1.37) directory are included (but not the build subdirectory) ?! For reference, this is what this directory lists:
$ ls -1 /c/src/tio_msys2/src/tio-1.37
build/
images/
man/
src/
subprojects/
AUTHORS
ChangeLog
LICENSE
meson.build
meson_options.txt
README.md
So, for some reason, makepkg running on this PKGBUILD file, includes the sources only, but not the packaged output files (that is, the executables)?!
So my question is: where am I going wrong, and how can I have the actual compiled binary executable file (or rather, the package prepared files in the pkg subdirectory) included in the final package file?
(Sidenote: I have also found this PKGBUILD https://github.com/msys2/MSYS2-packages/blob/5391c11/pkgconf/PKGBUILD from MSYS2, which also uses meson, but manually copies the executables after the meson install step; so maybe I'm supposed to manually copy the executables here as well??)
Solution 1:[1]
OK, it seems, that I had misunderstood what is the actual package file produced by makepkg, which eventually gets installed by pacman.
So far, I was quite persuaded, that it is the tio-1.37.tar.xz file - which, as seen in the OP, does not have the "built"/"executable" files.
However, after re-reading the docs, I noticed https://wiki.archlinux.org/title/makepkg :
Once all dependencies are satisfied and the package builds successfully, a package file (
pkgname-pkgver.pkg.tar.zst) will be created in the working directory. To install, use-i/--install(same aspacman -U pkgname-pkgver.pkg.tar.zst)
So, the final built package file is actually tio-1.37-1-x86_64.pkg.tar.zst! And if I try to inspect its contents:
$ tar tf tio-1.37-1-x86_64.pkg.tar.zst
.BUILDINFO
.MTREE
.PKGINFO
usr/
usr/bin/
usr/bin/tio.exe
usr/share/
usr/share/bash-completion/
usr/share/bash-completion/completions/
usr/share/bash-completion/completions/tio
usr/share/man/
usr/share/man/man1/
usr/share/man/man1/tio.1.gz
... indeed, it appears that all of the "executable" files are there!
So, first let's check the previously installed version of package tio by pacman:
$ pacman -Qi tio
Name : tio
Version : 1.32-1
Description : A simple TTY terminal I/O application
Architecture : x86_64
URL : https://tio.github.io/
Licenses : GPL
Groups : None
Provides : None
Depends On : None
Optional Deps : None
Required By : None
Optional For : None
Conflicts With : None
Replaces : None
Installed Size : 47.00 KiB
Packager : Alexey Pavlov <[email protected]>
Build Date : Mon, Nov 26, 2018 7:33:50 AM
Install Date : Thu, Feb 14, 2019 3:53:15 PM
Install Reason : Explicitly installed
Install Script : No
Validated By : Signature
$ pacman -Ql tio
tio /usr/
tio /usr/bin/
tio /usr/bin/tio.exe
tio /usr/share/
tio /usr/share/bash-completion/
tio /usr/share/bash-completion/completions/
tio /usr/share/bash-completion/completions/tio
tio /usr/share/licenses/
tio /usr/share/licenses/tio/
tio /usr/share/licenses/tio/COPYING
tio /usr/share/man/
tio /usr/share/man/man1/
tio /usr/share/man/man1/tio.1.gz
$ tio --version | head -2
tio v1.32
Copyright (c) 2014-2018 Martin Lund
... and a quick check of the newly built .zst file, too:
$ pacman -Qi --file tio-1.37-1-x86_64.pkg.tar.zst
Name : tio
Version : 1.37-1
Description : A simple TTY terminal I/O application
Architecture : x86_64
URL : https://tio.github.io/
Licenses : GPL
Groups : None
Provides : None
Depends On : None
Optional Deps : None
Conflicts With : None
Replaces : None
Compressed Size : 24.63 KiB
Installed Size : 42.12 KiB
Packager : Unknown Packager
Build Date : Fri, Apr 29, 2022 4:08:19 PM
Install Script : No
Validated By : None
Signatures : None
... and finally, we can try to install - or rather, upgrade, since the old version is already installed - the newly built package with pacman:
$ pacman -U tio-1.37-1-x86_64.pkg.tar.zst
loading packages...
resolving dependencies...
looking for conflicting packages...
Packages (1) tio-1.37-1
Total Installed Size: 0.04 MiB
Net Upgrade Size: 0.00 MiB
:: Proceed with installation? [Y/n] y
(1/1) checking keys in keyring [#######################################] 100%
(1/1) checking package integrity [#######################################] 100%
(1/1) loading package files [#######################################] 100%
(1/1) checking for file conflicts [#######################################] 100%
(1/1) checking available disk space [#######################################] 100%
:: Processing package changes...
(1/1) upgrading tio [#######################################] 100%
$ tio --version | head -2
tio v1.37
Copyright (c) 2014-2022 Martin Lund
Well, that's great - everything had, in fact, built fine - and it installs fine as well.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | sdbbs |
