diff options
author | Eric Bénard <eric@eukrea.com> | 2012-12-24 13:19:52 +0100 |
---|---|---|
committer | Eric Bénard <eric@eukrea.com> | 2013-01-07 11:53:09 +0100 |
commit | 9ef11b2c062464862025a2610d312b2cea882aeb (patch) | |
tree | 2e8fec43774eb035217cb4cbcd3e5919b48341a5 | |
parent | 06ea40eb6dd84922423da88f06154aba6574eedc (diff) | |
download | meta-openembedded-9ef11b2c062464862025a2610d312b2cea882aeb.tar.gz |
systemd: recover previous _git recipe
Signed-off-by: Eric Bénard <eric@eukrea.com>
3 files changed, 560 insertions, 0 deletions
diff --git a/meta-oe/recipes-core/systemd/systemd/format-replace-m-uclibc.patch b/meta-oe/recipes-core/systemd/systemd/format-replace-m-uclibc.patch new file mode 100644 index 0000000000..1c95023bbd --- /dev/null +++ b/meta-oe/recipes-core/systemd/systemd/format-replace-m-uclibc.patch @@ -0,0 +1,380 @@ +Patch from Henning. %m is a glibc only thing. For uclibc we need to do it +differently. So we use static strings instead of mallocing them and free'ing + +I dont know if upstream systemd have plans to make systemd work on non +glibc system libraries if not then this patch would not make sense for +upstream + +Signed-off-by: Khem Raj <raj.khem@gmail.com> + +Index: git/src/mount-setup.c +=================================================================== +--- git.orig/src/mount-setup.c 2012-01-25 21:27:23.000000000 -0800 ++++ git/src/mount-setup.c 2012-01-25 21:59:43.897031326 -0800 +@@ -182,10 +182,10 @@ + (void) fgets(buf, sizeof(buf), f); + + for (;;) { +- char *controller; ++ char controller[30]; + int enabled = 0; + +- if (fscanf(f, "%ms %*i %*i %i", &controller, &enabled) != 2) { ++ if (fscanf(f, "%s %*i %*i %i", controller, &enabled) != 2) { + + if (feof(f)) + break; +@@ -196,14 +196,12 @@ + } + + if (!enabled) { +- free(controller); + continue; + } + + r = set_put(controllers, controller); + if (r < 0) { + log_error("Failed to add controller to set."); +- free(controller); + goto finish; + } + } +@@ -273,7 +271,6 @@ + p.fatal = false; + + r = mount_one(&p, true); +- free(controller); + free(where); + + if (r < 0) { +Index: git/src/socket-util.c +=================================================================== +--- git.orig/src/socket-util.c 2012-01-25 21:27:23.000000000 -0800 ++++ git/src/socket-util.c 2012-01-25 21:59:43.897031326 -0800 +@@ -192,7 +192,7 @@ + int socket_address_parse_netlink(SocketAddress *a, const char *s) { + int family; + unsigned group = 0; +- char* sfamily = NULL; ++ char sfamily[50]; + assert(a); + assert(s); + +@@ -200,17 +200,14 @@ + a->type = SOCK_RAW; + + errno = 0; +- if (sscanf(s, "%ms %u", &sfamily, &group) < 1) ++ if (sscanf(s, "%49s %u", &sfamily, &group) < 1) + return errno ? -errno : -EINVAL; + + if ((family = netlink_family_from_string(sfamily)) < 0) + if (safe_atoi(sfamily, &family) < 0) { +- free(sfamily); + return -EINVAL; + } + +- free(sfamily); +- + a->sockaddr.nl.nl_family = AF_NETLINK; + a->sockaddr.nl.nl_groups = group; + +Index: git/src/swap.c +=================================================================== +--- git.orig/src/swap.c 2012-01-25 21:27:23.000000000 -0800 ++++ git/src/swap.c 2012-01-25 21:59:43.897031326 -0800 +@@ -1049,11 +1049,12 @@ + (void) fscanf(m->proc_swaps, "%*s %*s %*s %*s %*s\n"); + + for (i = 1;; i++) { +- char *dev = NULL, *d; ++ char *d; ++ char dev[20]; + int prio = 0, k; + + if ((k = fscanf(m->proc_swaps, +- "%ms " /* device/file */ ++ "%19s " /* device/file */ + "%*s " /* type of swap */ + "%*s " /* swap size */ + "%*s " /* used */ +@@ -1064,12 +1065,10 @@ + break; + + log_warning("Failed to parse /proc/swaps:%u.", i); +- free(dev); + continue; + } + + d = cunescape(dev); +- free(dev); + + if (!d) + return -ENOMEM; +Index: git/src/tmpfiles.c +=================================================================== +--- git.orig/src/tmpfiles.c 2012-01-25 21:27:23.000000000 -0800 ++++ git/src/tmpfiles.c 2012-01-25 22:06:58.649052774 -0800 +@@ -73,8 +73,8 @@ + typedef struct Item { + ItemType type; + +- char *path; +- char *argument; ++ char path[50]; ++ char argument[50]; + uid_t uid; + gid_t gid; + mode_t mode; +@@ -822,7 +822,6 @@ + case CREATE_CHAR_DEVICE: + case CREATE_BLOCK_DEVICE: + case IGNORE_PATH: +- case RELABEL_PATH: + case RECURSIVE_RELABEL_PATH: + case WRITE_FILE: + break; +@@ -858,8 +857,6 @@ + static void item_free(Item *i) { + assert(i); + +- free(i->path); +- free(i->argument); + free(i); + } + +@@ -906,7 +903,7 @@ + + static int parse_line(const char *fname, unsigned line, const char *buffer) { + Item *i, *existing; +- char *mode = NULL, *user = NULL, *group = NULL, *age = NULL; ++ char mode[50], user[50], group[50], age[50]; + char type; + Hashmap *h; + int r, n = -1; +@@ -923,18 +920,18 @@ + + if (sscanf(buffer, + "%c " +- "%ms " +- "%ms " +- "%ms " +- "%ms " +- "%ms " ++ "%s " ++ "%s " ++ "%s " ++ "%s " ++ "%s " + "%n", + &type, + &i->path, +- &mode, +- &user, +- &group, +- &age, ++ mode, ++ user, ++ group, ++ age, + &n) < 2) { + log_error("[%s:%u] Syntax error.", fname, line); + r = -EIO; +@@ -1096,11 +1093,6 @@ + r = 0; + + finish: +- free(user); +- free(group); +- free(mode); +- free(age); +- + if (i) + item_free(i); + +Index: git/src/mount.c +=================================================================== +--- git.orig/src/mount.c 2012-01-25 21:27:23.000000000 -0800 ++++ git/src/mount.c 2012-01-25 21:59:43.901031505 -0800 +@@ -24,6 +24,7 @@ + #include <mntent.h> + #include <sys/epoll.h> + #include <signal.h> ++#include <string.h> + + #include "unit.h" + #include "mount.h" +@@ -1561,7 +1562,13 @@ + static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) { + int r = 0; + unsigned i; +- char *device, *path, *options, *options2, *fstype, *d, *p, *o; ++ char *d, *p, *o; ++ char device[50]; ++ char path[50]; ++ char options[50]; ++ char options2[50]; ++ char fstype[50]; ++ + + assert(m); + +@@ -1570,26 +1577,26 @@ + for (i = 1;; i++) { + int k; + +- device = path = options = options2 = fstype = d = p = o = NULL; ++ d = p = o = NULL; + + if ((k = fscanf(m->proc_self_mountinfo, + "%*s " /* (1) mount id */ + "%*s " /* (2) parent id */ + "%*s " /* (3) major:minor */ + "%*s " /* (4) root */ +- "%ms " /* (5) mount point */ +- "%ms" /* (6) mount options */ ++ "%49s " /* (5) mount point */ ++ "%49s" /* (6) mount options */ + "%*[^-]" /* (7) optional fields */ + "- " /* (8) separator */ +- "%ms " /* (9) file system type */ +- "%ms" /* (10) mount source */ +- "%ms" /* (11) mount options 2 */ ++ "%49s " /* (9) file system type */ ++ "%49s" /* (10) mount source */ ++ "%49s" /* (11) mount options 2 */ + "%*[^\n]", /* some rubbish at the end */ +- &path, +- &options, +- &fstype, +- &device, +- &options2)) != 5) { ++ path, ++ options, ++ fstype, ++ device, ++ options2)) != 5) { + + if (k == EOF) + break; +@@ -1613,22 +1620,12 @@ + r = k; + + clean_up: +- free(device); +- free(path); +- free(options); +- free(options2); +- free(fstype); + free(d); + free(p); + free(o); + } + + finish: +- free(device); +- free(path); +- free(options); +- free(options2); +- free(fstype); + free(d); + free(p); + free(o); +Index: git/src/umount.c +=================================================================== +--- git.orig/src/umount.c 2012-01-25 21:27:23.000000000 -0800 ++++ git/src/umount.c 2012-01-25 21:59:43.901031505 -0800 +@@ -60,7 +60,9 @@ + + static int mount_points_list_get(MountPoint **head) { + FILE *proc_self_mountinfo; +- char *path, *p; ++ char *p; ++ char path[50]; ++ + unsigned int i; + int r; + +@@ -72,17 +74,17 @@ + for (i = 1;; i++) { + int k; + MountPoint *m; +- char *root; ++ char root[50]; + bool skip_ro; + +- path = p = NULL; ++ p = NULL; + + if ((k = fscanf(proc_self_mountinfo, + "%*s " /* (1) mount id */ + "%*s " /* (2) parent id */ + "%*s " /* (3) major:minor */ +- "%ms " /* (4) root */ +- "%ms " /* (5) mount point */ ++ "%49s " /* (4) root */ ++ "%49s " /* (5) mount point */ + "%*s" /* (6) mount options */ + "%*[^-]" /* (7) optional fields */ + "- " /* (8) separator */ +@@ -90,24 +92,21 @@ + "%*s" /* (10) mount source */ + "%*s" /* (11) mount options 2 */ + "%*[^\n]", /* some rubbish at the end */ +- &root, +- &path)) != 2) { ++ root, ++ path)) != 2) { + if (k == EOF) + break; + + log_warning("Failed to parse /proc/self/mountinfo:%u.", i); + +- free(path); + continue; + } + + /* If we encounter a bind mount, don't try to remount + * the source dir too early */ + skip_ro = !streq(root, "/"); +- free(root); + + p = cunescape(path); +- free(path); + + if (!p) { + r = -ENOMEM; +@@ -152,28 +151,28 @@ + + for (i = 2;; i++) { + MountPoint *swap; +- char *dev = NULL, *d; ++ char *d; ++ char dev[50]; ++ + int k; + + if ((k = fscanf(proc_swaps, +- "%ms " /* device/file */ ++ "%50s " /* device/file */ + "%*s " /* type of swap */ + "%*s " /* swap size */ + "%*s " /* used */ + "%*s\n", /* priority */ +- &dev)) != 1) { ++ dev)) != 1) { + + if (k == EOF) + break; + + log_warning("Failed to parse /proc/swaps:%u.", i); + +- free(dev); + continue; + } + + if (endswith(dev, "(deleted)")) { +- free(dev); + continue; + } + diff --git a/meta-oe/recipes-core/systemd/systemd/paper-over-mkostemp.patch b/meta-oe/recipes-core/systemd/systemd/paper-over-mkostemp.patch new file mode 100644 index 0000000000..ca10440a8d --- /dev/null +++ b/meta-oe/recipes-core/systemd/systemd/paper-over-mkostemp.patch @@ -0,0 +1,19 @@ +uclibc does not have mkostemp() so we redefine it to use mkstemp() + +Signed-off-by: Khem Raj <raj.khem@gmail.com> + +Index: git/src/macro.h +=================================================================== +--- git.orig/src/macro.h 2011-06-30 10:33:53.000000000 -0700 ++++ git/src/macro.h 2011-06-30 15:07:28.285270006 -0700 +@@ -27,6 +27,10 @@ + #include <sys/uio.h> + #include <inttypes.h> + ++#ifdef __UCLIBC__ ++/* uclibc does not implement mkostemp GNU extention */ ++#define mkostemp(x,y) mkstemp(x) ++#endif + #define _printf_attr_(a,b) __attribute__ ((format (printf, a, b))) + #define _sentinel_ __attribute__ ((sentinel)) + #define _noreturn_ __attribute__((noreturn)) diff --git a/meta-oe/recipes-core/systemd/systemd_git.bb b/meta-oe/recipes-core/systemd/systemd_git.bb new file mode 100644 index 0000000000..fd10aa721b --- /dev/null +++ b/meta-oe/recipes-core/systemd/systemd_git.bb @@ -0,0 +1,161 @@ +DESCRIPTION = "Systemd a init replacement" +HOMEPAGE = "http://www.freedesktop.org/wiki/Software/systemd" +LICENSE = "GPLv2+" +LIC_FILES_CHKSUM = "file://LICENSE;md5=751419260aa954499f7abaabaa882bbe" + +DEPENDS = "xz kmod docbook-sgml-dtd-4.1-native intltool-native gperf-native acl readline udev dbus libcap libcgroup tcp-wrappers" +DEPENDS += "${@base_contains('DISTRO_FEATURES', 'pam', 'libpam', '', d)}" + +DEFAULT_PREFERENCE = "2" + +SERIAL_CONSOLE ?= "115200 /dev/ttyS0" + +SECTION = "base/shell" + +inherit gitpkgv +PKGV = "v${GITPKGVTAG}" + +PV = "git" +PR = "r28" + +inherit useradd pkgconfig autotools vala perlnative + +SRCREV = "3eff4208ffecedd778fec260f0d4b18e94dab443" + +SRC_URI = "git://anongit.freedesktop.org/systemd/systemd;protocol=git \ + ${UCLIBCPATCHES} \ + file://var-run.conf \ + " +UCLIBCPATCHES = "" +UCLIBCPATCHES_libc-uclibc = "file://paper-over-mkostemp.patch \ + file://format-replace-m-uclibc.patch \ + " + +LDFLAGS_libc-uclibc_append = " -lrt" + +S = "${WORKDIR}/git" + +SYSTEMDDISTRO ?= "debian" +SYSTEMDDISTRO_angstrom = "angstrom" + +# The gtk+ tools should get built as a separate recipe e.g. systemd-tools +EXTRA_OECONF = " --with-distro=${SYSTEMDDISTRO} \ + --with-rootprefix=${base_prefix} \ + --with-rootlibdir=${base_libdir} \ + ${@base_contains('DISTRO_FEATURES', 'pam', '--enable-pam', '--disable-pam', d)} \ + --disable-gtk \ + --enable-xz \ + --disable-manpages \ + --disable-coredump \ + " + +# There's no docbook-xsl-native, so for the xsltproc check to false +do_configure_prepend() { + sed -i /xsltproc/d configure.ac + + # we only have /home/root, not /root + sed -i -e 's:=/root:=/home/root:g' units/*.service* +} + +do_install() { + autotools_do_install + # provided by a seperate recipe + rm ${D}${systemd_unitdir}/system/serial-getty* -f + + # provide support for initramfs + ln -s ${systemd_unitdir}/systemd ${D}/init + + # create dir for journal + install -d ${D}${localstatedir}/log/journal + + # create machine-id + # 20:12 < mezcalero> koen: you have three options: a) run systemd-machine-id-setup at install time, b) have / read-only and an empty file there (for stateless) and c) boot with / writable + touch ${D}${sysconfdir}/machine-id + + install -m 0644 ${WORKDIR}/var-run.conf ${D}${sysconfdir}/tmpfiles.d/ +} + +python populate_packages_prepend (){ + systemdlibdir = d.getVar("base_libdir", True) + do_split_packages(d, systemdlibdir, '^lib(.*)\.so\.*', 'lib%s', 'Systemd %s library', extra_depends='', allow_links=True) +} + +PACKAGES =+ "${PN}-gui ${PN}-vconsole-setup ${PN}-initramfs ${PN}-analyze" + +USERADD_PACKAGES = "${PN}" +GROUPADD_PARAM_${PN} = "-r lock" + +FILES_${PN}-analyze = "${bindir}/systemd-analyze" +RDEPENDS_${PN}-analyze = "python-dbus" +RRECOMMENDS_${PN}-analyze = "python-pycairo" + +FILES_${PN}-initramfs = "/init" +RDEPENDS_${PN}-initramfs = "${PN}" + +FILES_${PN}-gui = "${bindir}/systemadm" + +FILES_${PN}-vconsole-setup = "${systemd_unitdir}/systemd-vconsole-setup \ + ${systemd_unitdir}/system/systemd-vconsole-setup.service \ + ${systemd_unitdir}/system/sysinit.target.wants/systemd-vconsole-setup.service" + +RRECOMMENDS_${PN}-vconsole-setup = "kbd kbd-consolefonts" + +FILES_${PN} = " ${base_bindir}/* \ + ${datadir}/dbus-1/services \ + ${datadir}/dbus-1/system-services \ + ${datadir}/polkit-1 \ + ${datadir}/${PN} \ + ${sysconfdir} \ + ${systemd_unitdir}/* \ + ${systemd_unitdir}/system/* \ + ${base_libdir}/udev/rules.d \ + ${base_libdir}/security/*.so \ + /cgroup \ + ${bindir}/systemd* \ + ${libdir}/tmpfiles.d/*.conf \ + ${libdir}/systemd \ + ${libdir}/binfmt.d \ + ${libdir}/modules-load.d \ + ${libdir}/sysctl.d \ + ${localstatedir} \ + ${libexecdir} \ + " + +FILES_${PN}-dbg += "${systemd_unitdir}/.debug ${systemd_unitdir}/*/.debug ${base_libdir}/security/.debug/" +FILES_${PN}-dev += "${base_libdir}/security/*.la ${datadir}/dbus-1/interfaces/" + +RDEPENDS_${PN} += "dbus-systemd udev-systemd" + +# kbd -> loadkeys,setfont +# systemd calls 'modprobe -sab --', which busybox doesn't support due to lack +# of blacklist support, so use proper modprobe from module-init-tools +# And pull in the kernel modules mentioned in INSTALL +# swapon -p is also not supported by busybox +# busybox mount is broken +RRECOMMENDS_${PN} += "systemd-serialgetty \ + util-linux-agetty \ + util-linux-swaponoff \ + util-linux-fsck e2fsprogs-e2fsck \ + module-init-tools \ + util-linux-mount util-linux-umount \ + kernel-module-autofs4 kernel-module-unix kernel-module-ipv6 \ +" + +# TODO: +# u-a for runlevel and telinit + +pkg_postinst_systemd () { +update-alternatives --install ${base_sbindir}/init init ${systemd_unitdir}/systemd 300 +update-alternatives --install ${base_sbindir}/halt halt ${base_bindir}/systemctl 300 +update-alternatives --install ${base_sbindir}/reboot reboot ${base_bindir}/systemctl 300 +update-alternatives --install ${base_sbindir}/shutdown shutdown ${base_bindir}/systemctl 300 +update-alternatives --install ${base_sbindir}/poweroff poweroff ${base_bindir}/systemctl 300 +} + +pkg_prerm_systemd () { +update-alternatives --remove init ${systemd_unitdir}/systemd +update-alternatives --remove halt ${base_bindir}/systemctl +update-alternatives --remove reboot ${base_bindir}/systemctl +update-alternatives --remove shutdown ${base_bindir}/systemctl +update-alternatives --remove poweroff ${base_bindir}/systemctl +} |