diff options
Diffstat (limited to 'meta-sota')
10 files changed, 665 insertions, 204 deletions
diff --git a/meta-sota/classes/image_types_ostree.bbclass b/meta-sota/classes/image_types_ostree.bbclass index 5b9ac97..a180721 100644 --- a/meta-sota/classes/image_types_ostree.bbclass +++ b/meta-sota/classes/image_types_ostree.bbclass @@ -1,33 +1,40 @@ # OSTree deployment -inherit image_types +inherit image IMAGE_DEPENDS_ostree = "ostree-native:do_populate_sysroot \ virtual/kernel:do_deploy \ - ${INITRAMFS_IMAGE}:do_image_cpio" + ${OSTREE_INITRAMFS_IMAGE}:do_image_cpio" -# Please redefine OSTREE_REPO in your local.conf in order to have a persistent -# OSTree repo -OSTREE_REPO ?= "${DEPLOY_DIR_IMAGE}/ostree_repo" export OSTREE_REPO - -# OSTREE_BRANCHNAME can also be redefined -OSTREE_BRANCHNAME ?= "${IMAGE_BASENAME}" export OSTREE_BRANCHNAME IMAGE_CMD_ostree () { - OSTREE_ROOTFS=`mktemp -d ${WORKDIR}/ostree-root-XXXXX` - cp -rp ${IMAGE_ROOTFS}/* ${OSTREE_ROOTFS} + if [ -z "$OSTREE_REPO" ]; then + bbfatal "OSTREE_REPO should be set in your local.conf" + fi + + if [ -z "$OSTREE_BRANCHNAME" ]; then + bbfatal "OSTREE_BRANCHNAME should be set in your local.conf" + fi + + OSTREE_ROOTFS=`mktemp -du ${WORKDIR}/ostree-root-XXXXX` + cp -a ${IMAGE_ROOTFS} ${OSTREE_ROOTFS} + chmod a+rx ${OSTREE_ROOTFS} + sync + cd ${OSTREE_ROOTFS} # Create sysroot directory to which physical sysroot will be mounted mkdir sysroot - ln -sf /sysroot/ostree ostree - ln -sf /sysroot/tmp tmp + ln -sf sysroot/ostree ostree + + rm -rf tmp/* + ln -sf sysroot/tmp tmp mkdir -p usr/rootdirs - mkdir -p var/rootdirs + mv etc usr/ # Implement UsrMove dirs="bin sbin lib" @@ -35,23 +42,46 @@ IMAGE_CMD_ostree () { if [ -d ${dir} ] && [ ! -L ${dir} ] ; then mv ${dir} usr/rootdirs/ rm -rf ${dir} - ln -sf /usr/rootdirs/${dir} ${dir} + ln -sf usr/rootdirs/${dir} ${dir} fi done + + if [ ! -d "usr/etc/tmpfiles.d" ]; then + mkdir usr/etc/tmpfiles.d + fi + tmpfiles_conf=usr/etc/tmpfiles.d/00ostree-tmpfiles.conf + + echo "d /var/rootdirs 0755 root root -" >>${tmpfiles_conf} + echo "L /var/rootdirs/home - - - - /sysroot/home" >>${tmpfiles_conf} + # Preserve data in /home to be later copied to /sysroot/home by + # sysroot generating procedure + mkdir -p usr/homedirs + if [ -d "home" ] && [ ! -L "home" ]; then + mv home usr/homedirs/home + ln -sf var/rootdirs/home home + fi # Move persistent directories to /var - dirs="home opt mnt media srv" + dirs="opt mnt media srv" for dir in ${dirs}; do if [ -d ${dir} ] && [ ! -L ${dir} ]; then - mv ${dir} var/rootdirs/ - ln -sf /var/rootdirs/${dir} ${dir} + if [ "$(ls -A $dir)" ]; then + bbwarn "Data in /$dir directory is not preserved by OSTree. Consider moving it under /usr" + fi + echo "d /var/rootdirs/${dir} 0755 root root -" >>${tmpfiles_conf} + rm -rf ${dir} + ln -sf var/rootdirs/${dir} ${dir} fi done if [ -d root ] && [ ! -L root ]; then - mv root var/roothome - ln -sf /var/roothome root + if [ "$(ls -A root)" ]; then + bberror "Data in /root directory is not preserved by OSTree." + fi + echo "d /var/roothome 0755 root root -" >>${tmpfiles_conf} + rm -rf root + ln -sf var/roothome root fi # Creating boot directories is required for "ostree admin deploy" @@ -63,14 +93,17 @@ IMAGE_CMD_ostree () { checksum=`sha256sum ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} | cut -f 1 -d " "` cp ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} boot/vmlinuz-${checksum} - cp ${DEPLOY_DIR_IMAGE}/${INITRD_IMAGE}-${MACHINE}.cpio.gz boot/initramfs-${checksum} + cp ${DEPLOY_DIR_IMAGE}/${OSTREE_INITRAMFS_IMAGE}-${MACHINE}.cpio.gz boot/initramfs-${checksum} cd ${WORKDIR} # Create a tarball that can be then commited to OSTree repo OSTREE_TAR=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ostree.tar.bz2 - tar -C ${OSTREE_ROOTFS} -cjf ${OSTREE_TAR} . - rm -rf ${OSTREE_ROOTFS} + tar -C ${OSTREE_ROOTFS} --xattrs --xattrs-include='*' -cjf ${OSTREE_TAR} . + sync + + rm -f ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.rootfs.ostree.tar.bz2 + ln -s ${IMAGE_NAME}.rootfs.ostree.tar.bz2 ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.rootfs.ostree.tar.bz2 if [ ! -d ${OSTREE_REPO} ]; then ostree --repo=${OSTREE_REPO} init --mode=archive-z2 @@ -78,10 +111,11 @@ IMAGE_CMD_ostree () { # Commit the result ostree --repo=${OSTREE_REPO} commit \ - --tree=tar=${OSTREE_TAR} \ + --tree=dir=${OSTREE_ROOTFS} \ --skip-if-unchanged \ --branch=${OSTREE_BRANCHNAME} \ --subject="Commit-id: ${IMAGE_NAME}" + rm -rf ${OSTREE_ROOTFS} } diff --git a/meta-sota/classes/image_types_ota.bbclass b/meta-sota/classes/image_types_ota.bbclass index bb55e61..b9126ec 100644 --- a/meta-sota/classes/image_types_ota.bbclass +++ b/meta-sota/classes/image_types_ota.bbclass @@ -6,75 +6,103 @@ # OSTree updates may require some space on boot file system for # boot scripts, kernel and initramfs images # -BOOTFS_EXTRA_SIZE ?= "512" -export BOOTFS_EXTRA_SIZE - -do_otaimg[depends] += "e2fsprogs-native:do_populate_sysroot \ - parted-native:do_populate_sysroot \ - virtual/kernel:do_deploy \ - virtual/bootloader:do_deploy \ - ${INITRD_IMAGE}:do_image_cpio \ - ${PN}:do_image_ext4" - -ROOTFS ?= "${DEPLOY_DIR_IMAGE}/${IMAGE_BASENAME}-${MACHINE}.ext4" -INITRD_IMAGE ?= "core-image-minimal-initramfs" -INITRD ?= "${DEPLOY_DIR_IMAGE}/${INITRD_IMAGE}-${MACHINE}.cpio.gz" - -build_bootfs () { - KERNEL_FILE=${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} - KERNEL_SIZE=`du -Lbs ${KERNEL_FILE} | cut -f 1` - - RAMDISK_FILE=${DEPLOY_DIR_IMAGE}/${INITRD_IMAGE}-${MACHINE}.cpio.gz - RAMDISK_SIZE=`du -Lbs ${RAMDISK_FILE} | cut -f 1` - - EXTRA_BYTES=$(expr $BOOTFS_EXTRA_SIZE \* 1024 \* 1024) - - TOTAL_SIZE=$(expr ${KERNEL_SIZE} \+ ${RAMDISK_SIZE} \+ ${EXTRA_BYTES}) - TOTAL_BLOCKS=$(expr 1 \+ $TOTAL_SIZE / 1024) - - dd if=/dev/zero of=$1 bs=1024 count=${TOTAL_BLOCKS} - BOOTTMP=$(mktemp -d mkotaboot-XXX) - cp ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE} ${BOOTTMP} - cp ${DEPLOY_DIR_IMAGE}/${INITRD_IMAGE}-${MACHINE}.cpio.gz ${BOOTTMP} - mkfs.ext4 $1 -d ${BOOTTMP} - rm -rf $BOOTTMP + +inherit image + +IMAGE_DEPENDS_otaimg = "e2fsprogs-native:do_populate_sysroot \ + virtual/bootloader:do_deploy" + +calculate_size () { + BASE=$1 + SCALE=$2 + MIN=$3 + MAX=$4 + EXTRA=$5 + ALIGN=$6 + + SIZE=`echo "$BASE * $SCALE" | bc -l` + REM=`echo $SIZE | cut -d "." -f 2` + SIZE=`echo $SIZE | cut -d "." -f 1` + + if [ -n "$REM" -o ! "$REM" -eq 0 ]; then + SIZE=`expr $SIZE \+ 1` + fi + + if [ "$SIZE" -lt "$MIN" ]; then + $SIZE=$MIN + fi + + SIZE=`expr $SIZE \+ $EXTRA` + SIZE=`expr $SIZE \+ $ALIGN \- 1` + SIZE=`expr $SIZE \- $SIZE \% $ALIGN` + + if [ -n "$MAX" ]; then + if [ "$SIZE" -gt "$MAX" ]; then + return -1 + fi + fi + + echo "${SIZE}" } -do_otaimg () { - BOOTIMG=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.otaboot.ext4 - rm -f $BOOTIMG - build_bootfs $BOOTIMG +export OSTREE_OSNAME +export OSTREE_BRANCHNAME +export OSTREE_REPO - ROOTIMG=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.ext4 +IMAGE_CMD_otaimg () { + if ${@bb.utils.contains('IMAGE_FSTYPES', 'otaimg', 'true', 'false', d)}; then + if [ -z "$OSTREE_REPO" ]; then + bbfatal "OSTREE_REPO should be set in your local.conf" + fi - BOOTFSBLOCKS=`du -bks ${BOOTIMG} | cut -f 1` + if [ -z "$OSTREE_OSNAME" ]; then + bbfatal "OSTREE_OSNAME should be set in your local.conf" + fi - ROOTFSBLOCKS=`du -bks ${ROOTIMG} | cut -f 1` - TOTALSIZE=`expr $BOOTFSBLOCKS \+ $ROOTFSBLOCKS` - END1=`expr $BOOTFSBLOCKS \* 1024` - END2=`expr $END1 + 512` - END3=`expr \( $ROOTFSBLOCKS \* 1024 \) + $END1` + if [ -z "$OSTREE_BRANCHNAME" ]; then + bbfatal "OSTREE_BRANCHNAME should be set in your local.conf" + fi - FULLIMG=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.otaimg - rm -rf ${FULLIMG} - dd if=/dev/zero of=${FULLIMG} bs=1024 seek=${TOTALSIZE} count=1 - parted ${FULLIMG} mklabel msdos - parted ${FULLIMG} mkpart primary ext4 0 ${END1}B - parted ${FULLIMG} unit B mkpart primary ext4 ${END2}B ${END3}B + PHYS_SYSROOT=`mktemp -d ${WORKDIR}/ota-sysroot-XXXXX` - OFFSET=`expr $END2 / 512` + ostree admin --sysroot=${PHYS_SYSROOT} init-fs ${PHYS_SYSROOT} + ostree admin --sysroot=${PHYS_SYSROOT} os-init ${OSTREE_OSNAME} - dd if=${BOOTIMG} of=${FULLIMG} conv=notrunc seek=1 bs=512 - dd if=${ROOTIMG} of=${FULLIMG} conv=notrunc seek=$OFFSET bs=512 + mkdir -p ${PHYS_SYSROOT}/boot/loader.0 + ln -s loader.0 ${PHYS_SYSROOT}/boot/loader - cd ${DEPLOY_DIR_IMAGE} - rm -f ${IMAGE_LINK_NAME}.otaimg - ln -s ${IMAGE_NAME}.otaimg ${IMAGE_LINK_NAME}.otaimg -} + touch ${PHYS_SYSROOT}/boot/loader/uEnv.txt + + ostree --repo=${PHYS_SYSROOT}/ostree/repo pull-local --remote=${OSTREE_OSNAME} ${OSTREE_REPO} ${OSTREE_BRANCHNAME} + ostree admin --sysroot=${PHYS_SYSROOT} deploy --os=${OSTREE_OSNAME} ${OSTREE_OSNAME}:${OSTREE_BRANCHNAME} + + # Copy deployment /home to sysroot + HOME_TMP=`mktemp -d ${WORKDIR}/home-tmp-XXXXX` + tar --xattrs --xattrs-include='*' -C ${HOME_TMP} -xf ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.rootfs.ostree.tar.bz2 ./usr/homedirs + mv ${HOME_TMP}/usr/homedirs/home ${PHYS_SYSROOT}/ + rm -rf ${HOME_TMP} + + OTA_ROOTFS_SIZE=$(calculate_size `du -ks $PHYS_SYSROOT | cut -f 1` "${IMAGE_OVERHEAD_FACTOR}" "${IMAGE_ROOTFS_SIZE}" "${IMAGE_ROOTFS_MAXSIZE}" `expr ${IMAGE_ROOTFS_EXTRA_SPACE}` "${IMAGE_ROOTFS_ALIGNMENT}") -addtask otaimg before do_build + if [ $OTA_ROOTFS_SIZE -lt 0 ]; then + exit -1 + fi + eval local COUNT=\"0\" + eval local MIN_COUNT=\"60\" + if [ $OTA_ROOTFS_SIZE -lt $MIN_COUNT ]; then + eval COUNT=\"$MIN_COUNT\" + fi + + rm -rf ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.otaimg + sync + dd if=/dev/zero of=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.otaimg seek=$OTA_ROOTFS_SIZE count=$COUNT bs=1024 + mkfs.ext4 ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.otaimg -d ${PHYS_SYSROOT} + rm -rf ${PHYS_SYSROOT} + + rm -f ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.otaimg + ln -s ${IMAGE_NAME}.otaimg ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.otaimg + fi +} -IMAGE_TYPES += " otaimg" -IMAGE_TYPES_MASKED += "otaimg" -IMAGE_TYPEDEP_otaimg = "ext4" +IMAGE_TYPEDEP_otaimg = "ostree" diff --git a/meta-sota/recipes-bsp/u-boot/u-boot-ota/0001-Set-up-environment-for-OSTree-integration.patch b/meta-sota/recipes-bsp/u-boot/u-boot-ota/0001-Set-up-environment-for-OSTree-integration.patch index c33d40c..186a2a2 100644 --- a/meta-sota/recipes-bsp/u-boot/u-boot-ota/0001-Set-up-environment-for-OSTree-integration.patch +++ b/meta-sota/recipes-bsp/u-boot/u-boot-ota/0001-Set-up-environment-for-OSTree-integration.patch @@ -1,36 +1,41 @@ -From 2b4d519bef51d9bfb646588aa5198f71022a867b Mon Sep 17 00:00:00 2001 +From ebb26338d0c2f436a86fd4d7cb8d723a90d6a369 Mon Sep 17 00:00:00 2001 From: Anton Gerasimov <anton@advancedtelematic.com> -Date: Mon, 15 Aug 2016 15:54:20 +0200 -Subject: [PATCH] Set up environment for OSTree integration +Date: Thu, 15 Sep 2016 17:52:41 +0200 +Subject: [PATCH 1/2] Set up environment for OSTree integration --- - include/configs/qemu-x86.h | 15 +++++++++++++++ - 1 file changed, 15 insertions(+) + include/configs/qemu-x86.h | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) diff --git a/include/configs/qemu-x86.h b/include/configs/qemu-x86.h -index 476d37d..f49e2a5 100644 +index 78c296f..79df455 100644 --- a/include/configs/qemu-x86.h +++ b/include/configs/qemu-x86.h -@@ -56,4 +56,19 @@ +@@ -74,4 +74,24 @@ #undef CONFIG_ENV_IS_IN_SPI_FLASH #define CONFIG_ENV_IS_NOWHERE +#undef CONFIG_BOOTARGS +#define CONFIG_BOOTARGS "root=/dev/hda2 console=ttyS0" + ++#undef CONFIG_BOOTDELAY ++#define CONFIG_BOOTDELAY 3 ++ +#undef CONFIG_BOOTCOMMAND +#define CONFIG_BOOTCOMMAND "run loadenv;" \ -+ "ext2load ide 0:1 $loadaddr $kernel_image;" \ -+ "ext2load ide 0:1 $ramdiskaddr $ramdisk_image;" \ ++ "setenv bootargs $bootargs\" console=ttyS0 root=/dev/hda\";" \ ++ "ext2load ide 0 $loadaddr \"/boot\"$kernel_image;" \ ++ "ext2load ide 0 $ramdiskaddr \"/boot\"$ramdisk_image;" \ + "zboot $loadaddr - $ramdiskaddr $filesize" + +#undef CONFIG_EXTRA_ENV_SETTINGS +#define CONFIG_EXTRA_ENV_SETTINGS "kernel_image=/bzImage\0" \ + "ramdisk_image=/initrd\0" \ + "ramdiskaddr=0x4000000\0" \ -+ "loadenv=if ext2ls ide 0:1 /loader.0/uEnv.txt; then ext2load ide 0:1 $loadaddr uEnv.txt; env import -t $loadaddr $filesize; fi;" ++ "bootdelay=3\0" \ ++ "loadenv=if ext2load ide 0 $loadaddr /boot/loader/uEnv.txt; then env import -t $loadaddr $filesize; fi;" + #endif /* __CONFIG_H */ -- -2.8.3 +2.9.3 diff --git a/meta-sota/recipes-bsp/u-boot/u-boot-ota/0002-Replace-wraps-with-built-in-code-to-remove-dependenc.patch b/meta-sota/recipes-bsp/u-boot/u-boot-ota/0002-Replace-wraps-with-built-in-code-to-remove-dependenc.patch index 83e223f..7540b74 100644 --- a/meta-sota/recipes-bsp/u-boot/u-boot-ota/0002-Replace-wraps-with-built-in-code-to-remove-dependenc.patch +++ b/meta-sota/recipes-bsp/u-boot/u-boot-ota/0002-Replace-wraps-with-built-in-code-to-remove-dependenc.patch @@ -1,44 +1,38 @@ -From d5bea58bf85522a289194d59dfab00207ffdfb4f Mon Sep 17 00:00:00 2001 +From ab0d7e270d89f6eb99582197d2d58bf60c9c3d26 Mon Sep 17 00:00:00 2001 From: Anton Gerasimov <anton@advancedtelematic.com> -Date: Fri, 26 Aug 2016 13:51:30 +0200 +Date: Thu, 15 Sep 2016 16:49:32 +0200 Subject: [PATCH 2/2] Replace wraps with built-in code to remove dependency on multilib --- - arch/x86/config.mk | 3 -- - arch/x86/lib/gcc.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++------- - 2 files changed, 86 insertions(+), 14 deletions(-) + arch/x86/config.mk | 2 -- + arch/x86/lib/gcc.c | 104 ++++++++++++++++++++++++++++++++++++++++++++--------- + 2 files changed, 87 insertions(+), 19 deletions(-) diff --git a/arch/x86/config.mk b/arch/x86/config.mk -index d7addd8..892e0fc 100644 +index 999143e..139576e 100644 --- a/arch/x86/config.mk +++ b/arch/x86/config.mk -@@ -21,9 +21,6 @@ PLATFORM_RELFLAGS += -ffunction-sections -fvisibility=hidden - - PLATFORM_LDFLAGS += -Bsymbolic -Bsymbolic-functions -m elf_i386 +@@ -22,5 +22,3 @@ PLATFORM_RELFLAGS += -ffunction-sections -fvisibility=hidden + PLATFORM_LDFLAGS += --emit-relocs -Bsymbolic -Bsymbolic-functions -m elf_i386 + LDFLAGS_FINAL += --gc-sections -pie -LDFLAGS_FINAL += --wrap=__divdi3 --wrap=__udivdi3 -LDFLAGS_FINAL += --wrap=__moddi3 --wrap=__umoddi3 -- - # This is used in the top-level Makefile which does not include - # PLATFORM_LDFLAGS - LDFLAGS_EFI_PAYLOAD := -Bsymbolic -Bsymbolic-functions -shared --no-undefined diff --git a/arch/x86/lib/gcc.c b/arch/x86/lib/gcc.c -index 3c70d79..6b47785 100644 +index 497ad75..c321b11 100644 --- a/arch/x86/lib/gcc.c +++ b/arch/x86/lib/gcc.c -@@ -8,22 +8,97 @@ +@@ -19,22 +19,92 @@ #ifdef __GNUC__ -+#include <stdint.h> -+#include <stddef.h> - /* - * GCC's libgcc handling is quite broken. While the libgcc functions - * are always regparm(0) the code that calls them uses whatever the - * compiler call specifies. Therefore we need a wrapper around those - * functions. See gcc bug PR41055 for more information. - */ +-/* +- * GCC's libgcc handling is quite broken. While the libgcc functions +- * are always regparm(0) the code that calls them uses whatever the +- * compiler call specifies. Therefore we need a wrapper around those +- * functions. See gcc bug PR41055 for more information. +- */ -#define WRAP_LIBGCC_CALL(type, name) \ - type __normal_##name(type a, type b) __attribute__((regparm(0))); \ - type __wrap_##name(type a, type b); \ @@ -50,92 +44,95 @@ index 3c70d79..6b47785 100644 -WRAP_LIBGCC_CALL(unsigned long long, __udivdi3) -WRAP_LIBGCC_CALL(long long, __moddi3) -WRAP_LIBGCC_CALL(unsigned long long, __umoddi3) ++#include <stdint.h> ++#include <stddef.h> ++ +uint64_t __udivmoddi4 ( uint64_t num, -+ uint64_t den, -+ uint64_t *rem_p ) ++ uint64_t den, ++ uint64_t *rem_p ) +{ -+ uint64_t quot = 0, qbit = 1; -+ -+ if ( den == 0 ) { -+ return 1/((unsigned)den); /* Intentional divide by zero, without -+ triggering a compiler warning which -+ would abort the build */ -+ } -+ -+ /* Left-justify denominator and count shift */ -+ while ( (int64_t)den >= 0 ) { -+ den <<= 1; -+ qbit <<= 1; -+ } -+ -+ while ( qbit ) { -+ if ( den <= num ) { -+ num -= den; -+ quot += qbit; -+ } -+ den >>= 1; -+ qbit >>= 1; -+ } -+ -+ if ( rem_p ) -+ *rem_p = num; -+ -+ return quot; -+} ++ uint64_t quot = 0, qbit = 1; ++ ++ if ( den == 0 ) { ++ return 1/((unsigned)den); /* Intentional divide by zero, without ++ triggering a compiler warning which ++ would abort the build */ ++ } + ++ /* Left-justify denominator and count shift */ ++ while ( (int64_t)den >= 0 ) { ++ den <<= 1; ++ qbit <<= 1; ++ } ++ ++ while ( qbit ) { ++ if ( den <= num ) { ++ num -= den; ++ quot += qbit; ++ } ++ den >>= 1; ++ qbit >>= 1; ++ } ++ ++ if ( rem_p ) ++ *rem_p = num; ++ ++ return quot; ++} +uint64_t __udivdi3( uint64_t num, uint64_t den ) +{ -+ return __udivmoddi4(num, den, NULL); ++ return __udivmoddi4(num, den, NULL); +} + +uint64_t __umoddi3 ( uint64_t num, uint64_t den ) +{ -+ uint64_t v; ++ uint64_t v; + -+ (void) __udivmoddi4(num, den, &v); -+ return v; ++ (void) __udivmoddi4(num, den, &v); ++ return v; +} + +int64_t __divmoddi4 ( int64_t num, -+ int64_t den, -+ int64_t* rem_p ) ++ int64_t den, ++ int64_t* rem_p ) +{ -+ int minus = 0; -+ int64_t v; -+ -+ if ( num < 0 ) { -+ num = -num; -+ minus = 1; -+ } -+ if ( den < 0 ) { -+ den = -den; -+ minus ^= 1; -+ } -+ -+ v = __udivmoddi4(num, den, (uint64_t *)rem_p); -+ if ( minus ) { -+ v = -v; -+ if ( rem_p ) -+ *rem_p = -(*rem_p); -+ } -+ -+ return v; ++ int minus = 0; ++ int64_t v; ++ ++ if ( num < 0 ) { ++ num = -num; ++ minus = 1; ++ } ++ if ( den < 0 ) { ++ den = -den; ++ minus ^= 1; ++ } ++ ++ v = __udivmoddi4(num, den, (uint64_t *)rem_p); ++ if ( minus ) { ++ v = -v; ++ if ( rem_p ) ++ *rem_p = -(*rem_p); ++ } ++ ++ return v; +} + ++ +int64_t __moddi3 (int64_t num, int64_t den) +{ -+ int64_t v; ++ int64_t v; + -+ (void) __divmoddi4(num, den, &v); -+ return v; ++ (void) __divmoddi4(num, den, &v); ++ return v; +} + +int64_t __divdi3(int64_t num, int64_t den) +{ -+ return __divmoddi4(num, den, NULL); ++ return __divmoddi4(num, den, NULL); +} #endif -- -2.9.2 +2.9.3 diff --git a/meta-sota/recipes-bsp/u-boot/u-boot-ota_2015.07.bb b/meta-sota/recipes-bsp/u-boot/u-boot-ota_2015.07.bb new file mode 100644 index 0000000..ab5d403 --- /dev/null +++ b/meta-sota/recipes-bsp/u-boot/u-boot-ota_2015.07.bb @@ -0,0 +1,24 @@ +include recipes-bsp/u-boot/u-boot.inc +DEPENDS += "dtc-native" + +LICENSE = "GPLv2+" +LIC_FILES_CHKSUM = "file://Licenses/README;md5=0507cd7da8e7ad6d6701926ec9b84c95" + +# This revision corresponds to the tag "v2015.07" +# We use the revision in order to avoid having to fetch it from the +# repo during parse +SRCREV = "baba2f57e8f4ed3fa67fe213d22da0de5e00f204" + +SRC_URI += "file://0001-Set-up-environment-for-OSTree-integration.patch \ + file://0002-Replace-wraps-with-built-in-code-to-remove-dependenc.patch \ + " + +PV = "v2015.07+git${SRCPV}" + +EXTRA_OEMAKE_append = " KCFLAGS=-fgnu89-inline " +EXTRA_OEMAKE_append_qemux86 = " BUILD_ROM=y" +EXTRA_OEMAKE_append_qemux86-64 = " BUILD_ROM=y" + +UBOOT_SUFFIX = "bin" +UBOOT_SUFFIX_qemux86 = "rom" +UBOOT_SUFFIX_qemux86-64 = "rom" diff --git a/meta-sota/recipes-bsp/u-boot/u-boot-ota_2016.07.bb b/meta-sota/recipes-bsp/u-boot/u-boot-ota_2016.07.bb deleted file mode 100644 index 7d440ef..0000000 --- a/meta-sota/recipes-bsp/u-boot/u-boot-ota_2016.07.bb +++ /dev/null @@ -1,23 +0,0 @@ -include recipes-bsp/u-boot/u-boot.inc -DEPENDS += "dtc-native" - -LICENSE = "GPLv2+" -LIC_FILES_CHKSUM = "file://Licenses/README;md5=a2c678cfd4a4d97135585cad908541c6" - -# This revision corresponds to the tag "v2016.07" -# We use the revision in order to avoid having to fetch it from the -# repo during parse -SRCREV = "25922d42f8e9e7ae503ae55a972ba1404e5b6a8c" - -SRC_URI += "file://0001-Set-up-environment-for-OSTree-integration.patch \ - file://0002-Replace-wraps-with-built-in-code-to-remove-dependenc.patch" - -PV = "v2016.07+git${SRCPV}" - -EXTRA_OEMAKE_append = " KCFLAGS=-fgnu89-inline" -EXTRA_OEMAKE_append_qemux86 = " KCFLAGS=-fgnu89-inline BUILD_ROM=y" -EXTRA_OEMAKE_append_qemux86-64 = " KCFLAGS=-fgnu89-inline BUILD_ROM=y" - -UBOOT_SUFFIX = "bin" -UBOOT_SUFFIX_qemux86 = "rom" -UBOOT_SUFFIX_qemux86-64 = "rom" diff --git a/meta-sota/recipes-core/images/initramfs-ostree-image.bb b/meta-sota/recipes-core/images/initramfs-ostree-image.bb new file mode 100644 index 0000000..71aa631 --- /dev/null +++ b/meta-sota/recipes-core/images/initramfs-ostree-image.bb @@ -0,0 +1,23 @@ +# Netboot initramfs image. +DESCRIPTION = "OSTree initramfs image" + +PACKAGE_INSTALL = "ostree ostree-initramfs systemd-initramfs busybox base-passwd ${ROOTFS_BOOTSTRAP_INSTALL}" + +SYSTEMD_DEFAULT_TARGET = "initrd.target" + +# Do not pollute the initrd image with rootfs features +IMAGE_FEATURES = "" + +export IMAGE_BASENAME = "initramfs-ostree-image" +IMAGE_LINGUAS = "" + +LICENSE = "MIT" + +IMAGE_FSTYPES = "${INITRAMFS_FSTYPES}" +inherit core-image + +IMAGE_ROOTFS_SIZE = "8192" + +BAD_RECOMMENDATIONS += "busybox-syslog" + + diff --git a/meta-sota/recipes-sota/ostree-initramfs/ostree-initramfs.bb b/meta-sota/recipes-sota/ostree-initramfs/ostree-initramfs.bb new file mode 100644 index 0000000..5b3818c --- /dev/null +++ b/meta-sota/recipes-sota/ostree-initramfs/ostree-initramfs.bb @@ -0,0 +1,32 @@ +# Small hook to call ostree-prepare-root on initrd-switch-root + +LICENSE = "GPLv2+" +LIC_FILES_CHKSUM = "file://COPYING.GPL;md5=751419260aa954499f7abaabaa882bbe" + +S = "${WORKDIR}" + +SRC_URI = "file://COPYING.GPL" + +DEPENDS += " ostree" + +FILES_${PN} += "${systemd_unitdir} \ + ${systemd_unitdir}/system \ + ${systemd_unitdir}/system/initrd-switch-root.target.wants \ + ${systemd_unitdir}/system/initrd-switch-root.target.wants/ostree-prepare-root.service \ + ${sysconfdir}/initrd-release \ + " + +export OSTREE_INITRAMFS_IMAGE + +do_install() { + if ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then + install -d ${D}${sysconfdir} + echo "NAME=${OSTREE_INITRAMFS_IMAGE}" > ${D}/${sysconfdir}/initrd-release + install -d ${D}${systemd_unitdir} + install -d ${D}${systemd_unitdir}/system + + install -d ${D}${systemd_unitdir}/system/initrd-switch-root.target.wants + ln -s ${systemd_unitdir}/system/ostree-prepare-root.service \ + "${D}${systemd_unitdir}/system/initrd-switch-root.target.wants/ostree-prepare-root.service" + fi +} diff --git a/meta-sota/recipes-sota/ostree-initramfs/ostree-initramfs/COPYING.GPL b/meta-sota/recipes-sota/ostree-initramfs/ostree-initramfs/COPYING.GPL new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/meta-sota/recipes-sota/ostree-initramfs/ostree-initramfs/COPYING.GPL @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/meta-sota/recipes-sota/ostree/ostree_git.bb b/meta-sota/recipes-sota/ostree/ostree_git.bb index a35799e..6adac5f 100644 --- a/meta-sota/recipes-sota/ostree/ostree_git.bb +++ b/meta-sota/recipes-sota/ostree/ostree_git.bb @@ -7,7 +7,7 @@ inherit autotools-brokensep pkgconfig systemd INHERIT_remove_class-native = "systemd" SRC_URI = "gitsm://github.com/ostreedev/ostree.git;branch=master" -SRCREV="v2016.10" +SRCREV="v2016.5" S = "${WORKDIR}/git" @@ -19,7 +19,8 @@ DEPENDS_remove_class-native = "systemd-native" RDEPENDS_${PN} = "python util-linux-libuuid util-linux-libblkid util-linux-libmount libcap xz" RDEPENDS_${PN}_remove_class-native = "python-native" -EXTRA_OECONF = "--with-libarchive --disable-gtk-doc --disable-gtk-doc-html --disable-gtk-doc-pdf --disable-man" +EXTRA_OECONF = "CFLAGS='-DDISABLE_OTMPFILE' --with-libarchive --disable-gtk-doc --disable-gtk-doc-html --disable-gtk-doc-pdf --disable-man" +EXTRA_OEMAKE = "CFLAGS='-DDISABLE_OTMPFILE'" SYSTEMD_REQUIRED = "${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}" SYSTEMD_REQUIRED_class-native = "" @@ -29,7 +30,7 @@ SYSTEMD_SERVICE_${PN}_class-native = "" PACKAGECONFIG ??= "${@base_contains('DISTRO_FEATURES', 'systemd', 'systemd', '', d)}" PACKAGECONFIG_class-native = "" -PACKAGECONFIG[systemd] = "--with-systemdsystemunitdir=${systemd_unitdir}/system/,,," +PACKAGECONFIG[systemd] = "--with-systemdsystemunitdir=${systemd_unitdir}/system/ --with-dracut" FILES_${PN} += "${libdir}/ostree/ ${libdir}/ostbuild" @@ -57,6 +58,7 @@ do_install_append() { FILES_${PN} += " \ ${@'${systemd_unitdir}/system/' if d.getVar('SYSTEMD_REQUIRED', True) else ''} \ + ${@'${libdir}/dracut/modules.d/98ostree/module-setup.sh' if d.getVar('SYSTEMD_REQUIRED', True) else ''} \ ${datadir}/gir-1.0 \ ${datadir}/gir-1.0/OSTree-1.0.gir \ ${libdir}/girepository-1.0 \ |