. "$BST_LIB" # BST-TIMEOUT: 300 # Measured 2026-08-27 on the batch-1648 image: elapsed=103s, 63/63 green. # The bound stays 300 -- this suite is the slow one on this runtime (it drew # hwjs-worker-stall notices of up to 11.5s), and it emitted no case line at all # when it ran sixth in a shared boot. Run it early, or on its own. # mm-common 1.0.4 (meta-oe recipes-core, upstream GNOME) -- the common build # files the GNOME C++ binding modules (glibmm, gtkmm, cairomm, ...) are bootstrapped # from. `inherit gnomebase allarch`: nothing here is compiled, so the port is the # install layout and the paths meson substituted into the generated half. # # WHAT THE PACKAGE IS, IN TWO HALVES, BECAUSE THE SUITE TREATS THEM DIFFERENTLY. # # 23 files are VERBATIM -- meson's install_data copies them out of the release # tarball untouched. Their digests are upstream's, so pinning them is a # cross-arch equivalence claim: the recipe is `allarch`, and that inherit line # asserts the payload does not depend on the target. data/mm-common-dev-manifest.txt # was cross-checked against mm-common-1.0.4.tar.xz itself rather than against # our own build, so the comparison is not tautological. # # 5 files are GENERATED -- meson's configure_file substitutes @prefix@ and # friends into mm-common-prepare, mm-common-get, mm-common.m4 and the two .pc # files. Those are the only places a cross build can leak a build-host path, # and they are what the no-buildpath / no-unsubstituted / shebang cases are # about. # # 1 file is 5,145,690 bytes: doctags/libstdc++.tag, the Doxygen tag file for # GNU libstdc++. It is hashed at its two ends rather than whole -- see the # tag-* cases -- so this suite reads ~130 kB off the virtiofs root instead of # 5 MB. # # WHAT IS ASSERTED FUNCTIONALLY, AND WHY A FILE CENSUS ALONE WOULD NOT DO. # The two programs this package ships exist to COPY the other 27 files into a # binding module's source tree. That is a claim about behaviour, and a census # that only counted the files in ${datadir} would pass on an install whose # scripts pointed at a path that does not exist here -- which is precisely the # failure mode of a cross-built script carrying a substituted prefix. So both # are run against a real fixture under $TMPDIR (prepare-*, get-*), and # `tools-cover-install` closes the loop the other way: between them the two # tools copy EXACTLY the installed build/ and doctool/ sets, no file left over # and none invented. # # THREE PLACES THE TICKET'S PREMISE AND THE PACKAGE DISAGREE. Recorded here # rather than quietly narrowed, and each has a case of its own: # # 1. BRINTOS-1653 names "the `mm-common-libstdc++.tag` documentation tag # file". There is no such filename. `mm-common-libstdc++` is the PKG-CONFIG # module (/usr/share/pkgconfig/mm-common-libstdc++.pc); the tag file it # advertises through its `doxytagfile` variable is plain # /usr/share/mm-common/doctags/libstdc++.tag. pc-libstdcxx-doxytagfile # asserts that pairing, which is the thing the ticket was reaching for. # # 2. The ticket asks that "the `aclocal` macro directory the pkg-config file # advertises exists". NEITHER .pc advertises an aclocal directory -- # mm-common-util.pc advertises `doctooldir` and mm-common-libstdc++.pc # advertises `doxytagfile` and `htmlrefpub`, and that is the whole of it. # pc-no-aclocal-var records that as a measurement, and the aclocal-* cases # assert the macro directory directly instead: it exists, it holds this # package's eight m4 files, and those files define the fifteen macros a # binding module's configure.ac calls. # # 3. The ticket names "the `doc-reference` and `doc-install` utilities" as # though each were one program. Each is TWO, in different languages and in # different directories: doc-reference.am (automake fragment) beside # doc-reference.py (meson script) in build/, and doc-install.pl beside # doc_install.py in doctool/. The underscore-vs-hyphen split is upstream's # own convention -- Python module names cannot carry a hyphen -- and the # manifest carries all four. # # NO AUTOCONF PROGRAM CAN START ON THIS IMAGE, so nothing here runs aclocal or # autoconf over the installed macros. splice(2) is ENOSYS in arch/wasm32's # syscall table and autom4te's GNU-m4 version check is a grep whose stdout is # /dev/null, so every autoconf program aborts with "need GNU m4 1.4 or later" # against a working m4 -- brintos/linux-in-the-browser#167, the same fact the # gnome-common port records. aclocal-macros is therefore a TEXTUAL sweep of the # AC_DEFUN names in the shipped bytes. It says the macros are there and spelled # right; it does not say autoconf would expand them, and it must not be read as # saying so. # # THE PACKAGE INSTALLED IS mm-common-dev, NOT mm-common. Upstream's recipe sets # FILES:${PN} = "" and moves everything into -dev, because none of it is useful # at run time; the main package comes out empty (PKGSIZE 0) and is not produced. # mm-common-doc carries the two man pages, the README and the skeletonmm # tarball, and the image takes it too -- the man-*/doc-* cases below. root=${BST_ROOT:-} BIN=$root/usr/bin SHARE=$root/usr/share PKGDATA=$SHARE/mm-common ACDIR=$SHARE/aclocal PCDIR=$SHARE/pkgconfig TAG=$PKGDATA/doctags/libstdc++.tag PREPARE=$BIN/mm-common-prepare GET=$BIN/mm-common-get PV=1.0.4 # ---------------------------------------------------------------- 1. it is here check mm-common/prepare-present test -x "$PREPARE" check mm-common/get-present test -x "$GET" # ------------------------------------------- 2. the manifest sweep, five fields # # One pass over data/mm-common-dev-manifest.txt collecting FIVE independent # verdicts rather than one per file: 28 files x 5 assertions would be 140 case # lines for a package whose whole point is that it is inert, and a per-file red # says no more than the collected list does. Each accumulator is reported even # when the one before it is non-empty -- a file that is missing is skipped for # the later four, so an install that lost half its payload does not read as four # separate catastrophes. # # The manifest is read through bst_local: a `done < $BST_DATA/...` in the # top-level shell makes dup2(2) return 513 on the virtiofs root and ash EXITS, # which would truncate this suite and report every case above as a pass # (brintos/linux#73). MANIFEST=$(bst_local "$BST_DATA/mm-common-dev-manifest.txt") n=0; missing=; empty=; badmode=; badsize=; baddigest= while read -r sum mode size path origin; do case "$sum" in ''|'#'*) continue ;; esac n=$((n+1)) f=$root$path if [ ! -f "$f" ]; then missing="$missing $path"; continue; fi [ -s "$f" ] || empty="$empty $path" st=$(stat -c '%a %s' "$f" 2>/dev/null) gm=${st%% *}; gs=${st##* } [ "$gm" = "$mode" ] || badmode="$badmode $path($mode->$gm)" [ "$gs" = "$size" ] || badsize="$badsize $path($size->$gs)" d=$(sha256sum "$f" 2>/dev/null); d=${d%% *} [ "$d" = "$sum" ] || baddigest="$baddigest $path" done < "$MANIFEST" # The guard the four sweeps below are worthless without: an unreadable manifest # leaves every accumulator empty, which is indistinguishable from a clean sweep. check_eq mm-common/manifest-read 28 "$n" # "present and non-empty" -- the ticket's first pass criterion, both halves. check_eq mm-common/manifest-present "" "$missing" check_eq mm-common/manifest-nonempty "" "$empty" # The mode column is not decoration. install_data preserves the SOURCE mode, so # this package ships an asymmetry that reads like a packaging bug and is not: # check-dllexport-usage.py is 0644 while the other four build scripts are 0755, # and doc-postprocess.pl is 0644 while doc-install.pl is 0755. Pinning the whole # column is what keeps a future upstream normalisation visible. check_eq mm-common/manifest-mode "" "$badmode" check_eq mm-common/manifest-size "" "$badsize" # For the 23 verbatim rows this is upstream's own digest, so a red here means # this arm's copy of a file nothing compiled differs from the tarball's -- see # the header. For the 5 generated rows it is this arm's substitution. check_eq mm-common/manifest-sha256 "" "$baddigest" # The other direction: nothing in the package's own directories that the # manifest does not name. Scoped to what mm-common owns -- ${datadir}/aclocal # and ${datadir}/pkgconfig are SHARED directories on this image (autoconf-archive, # gnome-common and pkgconf all install into the first), so a bare listing there # would fail on a sibling package's file, which is not this port's business. mine=$( { find "$PKGDATA" -type f 2>/dev/null for g in "$ACDIR"/mm-*.m4 "$PCDIR"/mm-common-*.pc "$PREPARE" "$GET"; do [ -f "$g" ] && echo "$g" done } | sed "s|^$root||" | LC_ALL=C sort -u | tr '\n' ' ') named=$( { sed -n 's/^[0-9a-f]\{64\} [0-9]* [0-9]* \([^ ]*\) .*/\1/p' "$MANIFEST" echo /usr/share/mm-common/doctags/libstdc++.tag } | LC_ALL=C sort -u | tr '\n' ' ') check_eq mm-common/manifest-exact "$named" "$mine" # ------------------------------------------------- 3. the libstdc++ tag file # # 5.1 MB of Doxygen index, and the largest thing this port puts on the image. # Hashed at both ends plus the exact size rather than whole: a truncation shows # in the size, a corrupted middle would not -- which is the honest limit of this # arm and is why the XML frame is asserted too. A full sha256 would be a 5 MB # read off the virtiofs root, where this platform is slowest. st=$(stat -c %s "$TAG" 2>/dev/null) check_eq mm-common/tag-size 5145690 "$st" h=$(dd if="$TAG" bs=65536 count=1 2>/dev/null | sha256sum); h=${h%% *} check_eq mm-common/tag-head e68afe673c2babdb7fd3e4adc334a5af0639776aa8c547b179794226601055cd "$h" t=$(tail -c 65536 "$TAG" 2>/dev/null | sha256sum); t=${t%% *} check_eq mm-common/tag-tail b11ecd335278864788e4b6997040f35d6ea0dbbd637b621589e25705deae9d55 "$t" # The frame, so a red above can be told from a file that is not a tag file at # all. The doxygen_version is pinned deliberately: upstream ships this file # pre-built in the tarball (use-network defaults false and the recipe leaves it # false), so it is a constant of the release, not of our build host's doxygen. check_eq mm-common/tag-xml-open '' "$(sed -n 2p "$TAG" 2>/dev/null)" check_eq mm-common/tag-xml-close '' "$(tail -c 32 "$TAG" 2>/dev/null | tail -1)" # ------------------------------------- 4. the two commands run and self-describe if [ -n "$root" ]; then bst_skip mm-common/prepare-help "host validation run (BST_ROOT set)" bst_skip mm-common/get-help "host validation run (BST_ROOT set)" else # mm-common-prepare is #! /bin/sh -e and needs nothing but the shell. check_out mm-common/prepare-help-usage \ 'Usage: mm-common-prepare [OPTION]... [DIRECTORY | CONFIGURE-FILE]' "$PREPARE" --help check_out mm-common/prepare-help-copy ' -c, --copy' "$PREPARE" --help check_out mm-common/prepare-help-force ' -f, --force' "$PREPARE" --help check_eq mm-common/prepare-version "mm-common-prepare $PV" "$("$PREPARE" --version 2>&1)" # An unrecognized option is the package's own error path, and the ONE place # mm-common-prepare's exit status is not 0. Asserting it is what says the # `-e` shebang and the arg loop both survived the install. check_rc mm-common/prepare-badopt 1 "$PREPARE" --no-such-option # mm-common-get is #!/usr/bin/env python3. python3 is on this image; if it # ever is not, these land as reds and not as skips -- a tool that is installed # and cannot start is a defect, not an absence. check_out mm-common/get-help-usage 'usage: mm-common-get' "$GET" --help # The two positional arguments, which are the whole of its interface. The # heading above them ("options:" vs "optional arguments:") is argparse's and # moves with the Python version, so it is deliberately not asserted. check_out mm-common/get-help-buildscript 'buildscript_dir' "$GET" --help check_out mm-common/get-help-doctool 'doctool_dir' "$GET" --help check_eq mm-common/get-version "mm-common-get $PV" "$("$GET" --version 2>&1)" fi # --------------------------------- 5. the tools do the job the package is for # # Everything below runs under $TMPDIR, which is tmpfs on the guest. It has to: # mm-common-prepare's default action is `ln -s` and mm-common-get writes with # shutil.copy, and the virtiofs root is read-only. if [ -n "$root" ]; then bst_skip mm-common/prepare-run "host validation run (BST_ROOT set)" bst_skip mm-common/get-run "host validation run (BST_ROOT set)" bst_skip mm-common/tools-cover-install "host validation run (BST_ROOT set)" else W=${TMPDIR:-/tmp}/mm-common-fixture.$$ rm -rf "$W"; mkdir -p "$W/copy" "$W/link" "$W/none" "$W/get" # The two macros mm-common-prepare reads out of configure.ac. It parses them # with sed and never runs autoconf, which is the only reason this arm is # possible at all on an image where no autoconf program can start (#167). for p in copy link; do printf 'AC_INIT([demo],[0.1])\nAC_CONFIG_AUX_DIR([build])\nMM_CONFIG_DOCTOOL_DIR([docs])\n' \ > "$W/$p/configure.ac" done # rc=0 is a real assertion here and not a formality: the script is `sh -e`, so # the FIRST cp that cannot find its source aborts it. A prefix that had been # substituted with a build-host path would fail exactly here. check mm-common/prepare-rc "$PREPARE" -c "$W/copy" check_eq mm-common/prepare-am-set \ "compile-binding.am dist-changelog.am doc-reference.am generate-binding.am " \ "$(ls "$W/copy/build" 2>/dev/null | LC_ALL=C sort | tr '\n' ' ')" check_eq mm-common/prepare-doctool-set \ "doc-install.pl doc-postprocess.pl doxygen-extra.css doxygen.css tagfile-to-devhelp2.xsl " \ "$(ls "$W/copy/docs" 2>/dev/null | LC_ALL=C sort | tr '\n' ' ')" # Copied, not merely named: every file byte-identical to the installed # original. This is what makes prepare-am-set more than a listing. bad= for f in compile-binding.am dist-changelog.am doc-reference.am generate-binding.am; do cmp -s "$W/copy/build/$f" "$PKGDATA/build/$f" || bad="$bad build/$f" done for f in doc-install.pl doc-postprocess.pl doxygen.css doxygen-extra.css tagfile-to-devhelp2.xsl; do cmp -s "$W/copy/docs/$f" "$PKGDATA/doctool/$f" || bad="$bad doctool/$f" done check_eq mm-common/prepare-identical "" "$bad" # Without -c the default action is `ln -s`, and the symlink has to RESOLVE -- # a dangling link would satisfy `test -L` on its own, so both are asserted. check mm-common/prepare-links "$PREPARE" "$W/link" check mm-common/prepare-symlink test -L "$W/link/build/compile-binding.am" check mm-common/prepare-symlink-resolves test -f "$W/link/build/compile-binding.am" # The error path: no configure.ac, so nothing to read the aux directory out of. check_rc mm-common/prepare-no-acfile 1 "$PREPARE" "$W/none" # mm-common-get takes its two destinations as positional arguments and creates # them itself (os.makedirs), so this also exercises the argparse surface. check mm-common/get-rc "$GET" "$W/get/bs" "$W/get/dt" check_eq mm-common/get-build-set \ "check-dllexport-usage.py dist-build-scripts.py dist-changelog.py doc-reference.py generate-binding.py " \ "$(ls "$W/get/bs" 2>/dev/null | LC_ALL=C sort | tr '\n' ' ')" check_eq mm-common/get-doctool-set \ "doc_install.py doc_postprocess.py doxygen-extra.css doxygen.css tagfile-to-devhelp2.xsl " \ "$(ls "$W/get/dt" 2>/dev/null | LC_ALL=C sort | tr '\n' ' ')" bad= for f in check-dllexport-usage.py dist-build-scripts.py dist-changelog.py doc-reference.py generate-binding.py; do cmp -s "$W/get/bs/$f" "$PKGDATA/build/$f" || bad="$bad build/$f" done for f in doc_install.py doc_postprocess.py doxygen.css doxygen-extra.css tagfile-to-devhelp2.xsl; do cmp -s "$W/get/dt/$f" "$PKGDATA/doctool/$f" || bad="$bad doctool/$f" done check_eq mm-common/get-identical "" "$bad" # The loop closed. Neither tool copies the whole of either directory -- prepare # takes the four .am fragments and the Perl/CSS/XSL doctool set, get takes the # five Meson scripts and the Python doctool set -- and their UNION is exactly # what is installed. So the install carries nothing the tools cannot deliver # (dead payload) and asks for nothing that is not installed (a broken port, # which on `sh -e` would already have reddened prepare-rc). An upstream release # that adds a build script and forgets to list it in mm-common-get fails here # and nowhere else. check_eq mm-common/tools-cover-install \ "$( { ls "$PKGDATA/build"; ls "$PKGDATA/doctool"; } 2>/dev/null | LC_ALL=C sort -u | tr '\n' ' ')" \ "$( { ls "$W/copy/build"; ls "$W/copy/docs"; ls "$W/get/bs"; ls "$W/get/dt"; } 2>/dev/null | LC_ALL=C sort -u | tr '\n' ' ')" rm -rf "$W" fi # ---------------------------------------- 6. the pkg-config surface, and aclocal # # This is how a binding module actually finds any of the above: `pkg-config # --variable=doctooldir mm-common-util`. pkgconf is on this image and reads # ${datadir}/pkgconfig by default, so these run for real rather than by # inspecting the .pc text. if [ -n "$root" ]; then bst_skip mm-common/pkgconfig "host validation run (BST_ROOT set)" else check_eq mm-common/pc-util-modversion "$PV" "$(pkg-config --modversion mm-common-util 2>&1)" check_eq mm-common/pc-util-doctooldir /usr/share/mm-common/doctool \ "$(pkg-config --variable=doctooldir mm-common-util 2>&1)" check_eq mm-common/pc-libstdcxx-modversion "$PV" \ "$(pkg-config --modversion mm-common-libstdc++ 2>&1)" check_eq mm-common/pc-libstdcxx-doxytagfile /usr/share/mm-common/doctags/libstdc++.tag \ "$(pkg-config --variable=doxytagfile mm-common-libstdc++ 2>&1)" check_eq mm-common/pc-libstdcxx-htmlrefpub \ http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/ \ "$(pkg-config --variable=htmlrefpub mm-common-libstdc++ 2>&1)" fi # Each advertised path is a promise about this image, so both are dereferenced. check mm-common/pc-doctooldir-exists test -d "$PKGDATA/doctool" check mm-common/pc-doxytagfile-exists test -f "$TAG" # The ticket's premise, measured -- see header note 2. Neither .pc file mentions # aclocal in any form. This is a tripwire, not a defect check: if upstream ever # does advertise the macro directory, the port's story changes and this case is # where a reader finds out. check_eq mm-common/pc-no-aclocal-var "" \ "$(grep -l aclocal "$PCDIR/mm-common-util.pc" "$PCDIR/mm-common-libstdc++.pc" 2>/dev/null | tr '\n' ' ')" # The macro directory itself, which is what the ticket was asking after. It is a # SHARED directory -- pkgconf, gnome-common and autoconf-archive install into it # too -- so this is scoped to mm-common's own eight files. check mm-common/aclocal-dir test -d "$ACDIR" check_eq mm-common/aclocal-set \ "mm-ax_cxx_compile_stdcxx.m4 mm-ax_cxx_compile_stdcxx_11.m4 mm-common.m4 mm-dietlib.m4 mm-doc.m4 mm-module.m4 mm-pkg.m4 mm-warnings.m4 " \ "$(cd "$ACDIR" 2>/dev/null && ls mm-*.m4 2>/dev/null | LC_ALL=C sort | tr '\n' ' ')" # TEXTUAL, not an expansion -- see the header. Fifteen names, the private # _MM_PRE_INIT among them because m4_pattern_forbid([^_?MM_]) is what turns an # unexpanded MM_ call into a configure-time error rather than silence, and a # release that dropped it would take that safety net with it. check_eq mm-common/aclocal-macros \ "MM_ARG_DISABLE_DEPRECATED_API MM_ARG_ENABLE_DOCUMENTATION MM_ARG_ENABLE_WARNINGS MM_ARG_WITH_TAGFILE_DOC MM_AX_CXX_COMPILE_STDCXX MM_AX_CXX_COMPILE_STDCXX_11 MM_CHECK_GNU_MAKE MM_CHECK_PERL MM_CONFIG_DOCTOOL_DIR MM_INIT_MODULE MM_PATH_PERL MM_PKG_CONFIG_SUBST MM_PREREQ MM_PROG_GCC_VISIBILITY _MM_PRE_INIT " \ "$(cat "$ACDIR"/mm-*.m4 2>/dev/null | sed -n 's/^AC_DEFUN(\[\([A-Za-z_0-9]*\)\].*/\1/p' | LC_ALL=C sort -u | tr '\n' ' ')" # mm-common.m4 is the ONE macro file meson generates, and MM_PREREQ's version # comparison is compiled into it from @PACKAGE_VERSION@ at configure time. A # substitution that silently produced an empty version would leave every # module's MM_PREREQ passing against nothing. check_eq mm-common/aclocal-prereq-version 1 \ "$(grep -c '\[mm-common\], \[1\.0\.4\]' "$ACDIR/mm-common.m4" 2>/dev/null)" # -------------------------------- 7. nothing from the build host came along # # The ticket's fourth pass criterion. The sweep is over the 28 small files -- # the 5.1 MB tag file is excluded because it is Doxygen's index of libstdc++ and # a 5 MB grep off the virtiofs root buys nothing here. files=$( { find "$PKGDATA" -type f ! -name 'libstdc++.tag' 2>/dev/null for g in "$ACDIR"/mm-*.m4 "$PCDIR"/mm-common-*.pc "$PREPARE" "$GET"; do [ -f "$g" ] && echo "$g" done } | LC_ALL=C sort -u) check_eq mm-common/no-buildpath "" \ "$(grep -lE 'recipe-sysroot|tmp-glibc|python3-native|brintos-epic|/build-BRINTOS' $files 2>/dev/null | sed "s|^$root||" | tr '\n' ' ')" # The other half of the same criterion, and the one a path sweep cannot see: a # substitution that never happened leaves the @token@ in place, and the script # then carries a literal '@prefix@' where the path should be. Scoped to the five # generated files -- the verbatim 23 are upstream's and some legitimately # discuss @-tokens (doc-reference.am writes Doxyfile substitutions). check_eq mm-common/no-unsubstituted "" \ "$(grep -lE '@[A-Za-z_][A-Za-z_0-9]*@' "$PREPARE" "$GET" "$ACDIR/mm-common.m4" \ "$PCDIR/mm-common-util.pc" "$PCDIR/mm-common-libstdc++.pc" 2>/dev/null \ | sed "s|^$root||" | tr '\n' ' ')" # The substituted values themselves, at the two places the tools read them. A # generic path sweep passes on prefix="" just as happily as on prefix="/usr". check_eq mm-common/prefix-prepare 'prefix="/usr"' "$(grep -m1 '^prefix=' "$PREPARE" 2>/dev/null)" check_eq mm-common/pkgdatadir-get \ "pkgdatadir = os.path.join('/usr/share', 'mm-common')" \ "$(grep -m1 '^pkgdatadir' "$GET" 2>/dev/null)" check_eq mm-common/prefix-pc 'prefix=/usr' "$(sed -n 1p "$PCDIR/mm-common-util.pc" 2>/dev/null)" # The shebangs, which is where a cross build leaks a native interpreter path. check_eq mm-common/shebang-prepare '#! /bin/sh -e' "$(sed -n 1p "$PREPARE" 2>/dev/null)" check_eq mm-common/shebang-get '#!/usr/bin/env python3' "$(sed -n 1p "$GET" 2>/dev/null)" # The doctool Perl scripts carry NO shebang at all -- their first line is # `package main;`, because mm-common-prepare drops them into a binding module # that runs them as `perl doc-install.pl`. It is exactly the asymmetry a reader # assumes is uniform, and a well-meant future `install -m 0755` plus a planted # shebang would be a change to upstream's interface rather than a fix. check_eq mm-common/shebang-perl-none 'package main;;package main;' \ "$(sed -n 1p "$PKGDATA/doctool/doc-install.pl" 2>/dev/null);$(sed -n 1p "$PKGDATA/doctool/doc-postprocess.pl" 2>/dev/null)" # ------------------------------------------- 8. mm-common-doc, taken by the image DOCD=$SHARE/doc/mm-common MAND=$SHARE/man/man1 check mm-common/doc-readme test -s "$DOCD/README" check mm-common/doc-skeletonmm test -s "$DOCD/skeletonmm.tar.xz" check mm-common/man-prepare test -s "$MAND/mm-common-prepare.1" check mm-common/man-get test -s "$MAND/mm-common-get.1" # The man page and the program have to agree about the version, and they are # generated from different configuration_data() objects in meson.build -- which # is exactly how they could stop agreeing. check_eq mm-common/man-version "mm-common $PV" \ "$(sed -n '1s/.*"\(mm-common [^"]*\)".*/\1/p' "$MAND/mm-common-prepare.1" 2>/dev/null)" # -------------------------------------------------- 9. the main package is empty # # Upstream sets FILES:${PN} = "" and moves the payload into -dev, so `mm-common` # packages to PKGSIZE 0 and is never produced. Nothing of this package may # therefore appear outside the five locations above -- in particular there is no # library and no header, and a future recipe that started shipping one would be # a change in what this port IS. check_eq mm-common/no-library "" \ "$(find "$root/usr/lib" -name 'libmm-common*' 2>/dev/null | tr '\n' ' ')" check_eq mm-common/no-header "" \ "$(find "$root/usr/include" -name 'mm-common*' 2>/dev/null | tr '\n' ' ')"