diff --git a/NEWS.md b/NEWS.md index cd56bbca..a6fd1be1 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,6 +4,12 @@ OpenRC NEWS This file will contain a list of notable changes for each release. Note the information in this file is in reverse order. +## OpenRC 0.44 + +This version is the first to use a meson-based build system. +I will keep the makefiles for the 0.44 branch, but meson will be the +only build system supported in the future. + ## OpenRC 0.43 This version changes the behavior of the checkpath helper to address diff --git a/README.md b/README.md index a0754421..7393424b 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,16 @@ OpenRC README OpenRC is a dependency-based init system that works with the system-provided init program, normally `/sbin/init`. -## Installation +## building and installing + +OpenRC uses the [meson](http://mesonbuild.com) build system, so use the +usual methods for this build system to build and install. + +The old build system is still available for the 0.44.x branch, but it +will be removed for the next release. The previous documentation is +below. + +## Installation (historical) OpenRC requires GNU make. @@ -13,7 +22,7 @@ executed using this command: `make install` -## Configuration +## Configuration (historical) You may wish to configure the installation by passing one or more of the below arguments to the make command diff --git a/conf.d/meson.build b/conf.d/meson.build new file mode 100644 index 00000000..ddb056a4 --- /dev/null +++ b/conf.d/meson.build @@ -0,0 +1,59 @@ +conf_d_dir = get_option('sysconfdir') / 'conf.d' + +conf_common = [ + 'bootmisc', + 'fsck', + 'hostname', + 'localmount', + 'netmount', + 'swap', + 'urandom', + ] + +conf_net = [ + 'network', + 'staticroute', + ] + +conf_FreeBSD = [ + 'ipfw', + 'modules', + 'moused', + 'powerd', + 'rarpd', + 'savecore', + 'syscons', + ] + +conf_Linux = [ + 'agetty', + 'consolefont', + 'devfs', + 'dmesg', + 'hwclock', + 'keymaps', + 'killprocs', + 'modules', + 'mtab', + 'net-online', + ] + +conf_NetBSD = [ + 'moused', + 'rarpd', + 'savecore', + ] + +conf_data = conf_common +if get_option('newnet') + conf_data = conf_data + conf_net +endif +if os == 'FreeBSD' + conf_data = conf_data + conf_FreeBSD +elif os == 'Linux' + conf_data = conf_data + conf_Linux +elif os == 'NetBSD' + conf_data = conf_data + conf_NetBSD +endif + +install_data(conf_data, install_dir : conf_d_dir) diff --git a/etc/meson.build b/etc/meson.build new file mode 100644 index 00000000..fb736ac8 --- /dev/null +++ b/etc/meson.build @@ -0,0 +1,44 @@ +etc_conf_data = configuration_data() +if os == 'FreeBSD' + etc_conf_data.set('TERM', 'cons25') +elif os == 'Linux' + etc_conf_data.set('TERM', 'wsvt25') +endif + +etc_conf_common = [ + 'rc.conf', + ] + +etc_bin_FreeBSD = [ + 'rc.devd', + ] + +etc_conf_FreeBSD = [ + 'devd.conf', + ] + +etc_bin_NetBSD = [ + 'rc.in', + 'rc.shutdown.in', + ] + +install_data(etc_conf_common, + install_dir : get_option('sysconfdir')) + + if os == 'FreeBSD' + install_data(etc_bin_FreeBSD, + install_dir : get_option('sysconfdir'), + install_mode: 'rwxr-xr-x') + install_data(etc_conf_FreeBSD, + install_dir : get_option('sysconfdir')) +endif + +if os == 'FreeBSD' or os == 'NetBSD' + foreach file : etc_bin_NetBSD + configure_file(input : file, + output : '@BASENAME@', + configuration : etc_conf_data, + install_dir: get_option('sysconfdir'), + install_mode: 'rwxr-xr-x') + endforeach +endif diff --git a/init.d/meson.build b/init.d/meson.build new file mode 100644 index 00000000..9976710c --- /dev/null +++ b/init.d/meson.build @@ -0,0 +1,100 @@ +init_d_dir = get_option('sysconfdir') / 'init.d' + +init_common = [ + 'bootmisc.in', + 'fsck.in', + 'hostname.in', + 'local.in', + 'localmount.in', + 'loopback.in', + 'netmount.in', + 'osclock.in', + 'root.in', + 'savecache.in', + 'swap.in', + 'swclock.in', + 'sysctl.in', + 'runsvdir.in', + 'urandom.in', + 's6-svscan.in', + ] + +if get_option('newnet') + init_common = init_common + [ + 'network.in', + 'staticroute.in', + ] +endif + +init_Linux = [ + 'agetty.in', + 'binfmt.in', + 'cgroups.in', + 'consolefont.in', + 'devfs.in', + 'dmesg.in', + 'hwclock.in', + 'keymaps.in', + 'killprocs.in', + 'modules.in', + 'mount-ro.in', + 'mtab.in', + 'numlock.in', + 'procfs.in', + 'net-online.in', + 'save-keymaps.in', + 'save-termencoding.in', + 'sysfs.in', + 'termencoding.in', + ] + +init_BSD = [ + 'hostid.in', + 'moused.in', + 'newsyslog.in', + 'pf.in', + 'rarpd.in', + 'rc-enabled.in', + 'rpcbind.in', + 'savecore.in', + 'syslogd.in', + ] + +init_FreeBSD = [ + 'adjkerntz.in', + 'devd .in', + 'dumpon.in', + 'encswap.in', + 'ipfw.in', + 'modules.in', + 'mixer.in', + 'nscd.in', + 'powerd.in', + 'syscons.in', + ] + +init_NetBSD = [ + 'devdb.in', + 'swap-blk.in', + 'ttys.in', + 'wscons.in', + ] + +init_data = init_common +if os == 'Dragonfly' + init_data = init_data + init_BSD +elif os == 'FreeBSD' or os == 'Gnu-kFreeBSD' + init_data = init_data + init_BSD + init_FreeBSD +elif os == 'Linux' + init_data = init_data + init_Linux +elif os == 'NetBSD' + init_data = init_data + init_BSD + init_NetBSD + endif + +foreach init_d_file : init_data + configure_file(input : init_d_file, + output : '@BASENAME@', + configuration : init_d_conf_data, + install_dir: init_d_dir, + install_mode: 'rwxr-xr-x') +endforeach diff --git a/local.d/meson.build b/local.d/meson.build new file mode 100644 index 00000000..fecb341a --- /dev/null +++ b/local.d/meson.build @@ -0,0 +1,7 @@ +local_d_dir = get_option('sysconfdir') / 'local.d' + +local_data = [ + 'README' + ] + +install_data(local_data, install_dir : local_d_dir) diff --git a/man/meson.build b/man/meson.build new file mode 100644 index 00000000..37617ca6 --- /dev/null +++ b/man/meson.build @@ -0,0 +1,34 @@ +man3 = [ + 'einfo.3', + 'rc_config.3', + 'rc_deptree.3', + 'rc_find_pids.3', + 'rc_plugin_hook.3', + 'rc_runlevel.3', + 'rc_service.3', + 'rc_stringlist.3', + ] + +man8 = [ + 'openrc.8', + 'openrc-run.8', + 'rc-service.8', + 'rc-status.8', + 'rc-update.8', + 'start-stop-daemon.8', + 'supervise-daemon.8', + ] + +if os == 'Linux' + man8 = man8 + [ + 'rc-sstat.8', + 'openrc-init.8', + 'openrc-shutdown.8', + ] +endif + +install_data(man3, + install_dir : get_option('mandir') / 'man3') +install_data(man8, + install_dir : get_option('mandir') / 'man8') +meson.add_install_script('meson_man_links.sh', get_option('mandir'), man3 + man8) diff --git a/man/meson_man_links.sh b/man/meson_man_links.sh new file mode 100755 index 00000000..17c21a99 --- /dev/null +++ b/man/meson_man_links.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +get_links() { + sed -e 's/ ,//g' \ + -e '/^\.Sh NAME$/,/\.Sh/ s/\.Nm //p' \ + -n ${MESON_SOURCE_ROOT}/man/${1} +} + +MANDIR="$1" +shift +for man in $@; do + prefix=${man%%.*} + suffix=${man#*.} + links=$(get_links ${man}) + for link in ${links}; do + if [ "${link}" != "${prefix}" ]; then + ln -sf ${man} ${MESON_INSTALL_DESTDIR_PREFIX}/${MANDIR}/man${suffix}/${link}.${suffix} + fi + done +done diff --git a/meson.build b/meson.build new file mode 100644 index 00000000..378e18d0 --- /dev/null +++ b/meson.build @@ -0,0 +1,168 @@ +project('OpenRC', 'c', + version : '0.42', + license: 'BSD-2', + default_options : [ + 'c_std=c99', + 'prefix=/usr', + 'warning_level=3', + ], + meson_version : '>=0.49.0') + +cc = meson.get_compiler('c') + +audit_dep = dependency('audit', required : get_option('audit')) +if audit_dep.found() + cc_audit_flags = '-DHAVE_AUDIT' + else + cc_audit_flags = [] + endif + +if get_option('branding') != '' + cc_branding_flags = '-DBRANDING=' + get_option('branding') +else + cc_branding_flags = [] +endif + +libname = get_option('libdir').split('/')[-1] + +option_local_prefix = get_option('local_prefix') +if option_local_prefix == '' + local_prefix = get_option('prefix') / 'usr' / 'local' +else + local_prefix = option_local_prefix +endif + +option_os = get_option('os') +if option_os == '' + uname = find_program('uname') + r = run_command(uname, '-s') + os = r.stdout().strip() + os = '-'.join(os.split('/')) +else + os = option_os +endif + +pam = get_option('pam') +if pam + libpam = cc.find_library('pam') + libpam_misc = cc.find_library('pam_misc') + cc_pam_flags = '-DHAVE_PAM' +else + libpam = [] + libpam_misc = [] + cc_pam_flags = [] +endif + +option_pkg_prefix = get_option('pkg_prefix') +if option_pkg_prefix == '' + if os == 'Dragonfly' or os == 'FreeBSD' + pkg_prefix = '/usr/local' + elif os == 'GNU' or os == 'GNU-kFreeBSD' or os == 'Linux' + pkg_prefix = '/usr' + elif os == 'NetBSD' + pkg_prefix = '/usr/pkg' + endif +else + pkg_prefix = option_pkg_prefix +endif + +root_prefix = get_option('root_prefix') +if root_prefix == '' + root_prefix = '/' +endif +bindir = root_prefix / get_option('bindir') +libdir = root_prefix / get_option('libdir') +libexecdir = root_prefix / get_option('libexecdir') +rc_libexecdir = libexecdir / 'rc' +sbindir = root_prefix / get_option('sbindir') + +selinux_dep = dependency('libselinux', required : get_option('selinux')) +if selinux_dep.found() + cc_selinux_flags = '-DHAVE_SELINUX' + else + cc_selinux_flags = [] +endif + +termcap = get_option('termcap') +if termcap != '' + termcap_dep = dependency(termcap) + termcap_flags = '-DHAVE_TERMCAP' + else + termcap_dep = [] + termcap_flags = [] +endif + +if get_option('buildtype').startswith('debug') + cc_debug_flags = ['-DRC_DEBUG'] +else + cc_debug_flags = [] +endif + +if os == 'Linux' or os == 'GNU-kFreeBSD' + cc_os_flags = ['-D_DEFAULT_SOURCE'] +elif os == 'FreeBSD' + cc_os_flags = ['-D_BSD_SOURCE'] +elif os == 'GNU' + cc_os_flags = ['-D_DEFAULT_SOURCE', '-DMAXPATHLEN=4096', '-DPATH_MAX=4096'] + endif + +# Try and use some good cc flags if we're building from git. We don't use +# -pedantic as it will warn about our perfectly valid use of %m in our logger. +# We should be using -Wredundant-decls, but our library hidden proto stuff gives +# loads of warnings. I don't fully understand it (the hidden proto, not the +# warning) so we just silence the warning. +cc_warning_flags_test = [ + '-Wcast-align', + '-Wcast-qual', + '-Wdeclaration-after-statement', + '-Wformat=2', + '-Winline', + '-Wmissing-declarations', + '-Wmissing-format-attribute', + '-Wmissing-noreturn', + '-Wmissing-prototypes', + '-Wnested-externs', + '-Wpointer-arith', + '-Wsequence-point', + '-Wshadow', + '-Wwrite-strings', + '-Werror=implicit-function-declaration', + ] +cc_warning_flags = cc.get_supported_arguments(cc_warning_flags_test) +cc_flags = [cc_debug_flags, cc_os_flags, cc_warning_flags] +add_project_arguments(cc_flags, language : 'c') + +incdir = include_directories('src/includes') +einfo_incdir = include_directories('src/libeinfo') +rc_incdir = include_directories('src/librc') + +init_d_conf_data = configuration_data() +init_d_conf_data.set('SBINDIR', sbindir) +init_d_conf_data.set('PKG_PREFIX', pkg_prefix) +init_d_conf_data.set('SYSCONFDIR', get_option('sysconfdir')) + +dl_dep = cc.find_library('dl', required: false) +util_dep = cc.find_library('util', required: false) + +subdir('conf.d') +subdir('etc') +subdir('init.d') +subdir('local.d') +subdir('man') +if get_option('pkgconfig') +subdir('pkgconfig') + endif +subdir('scripts') +subdir('sh') +subdir('src') +subdir('support') +subdir('sysctl.d') + +meson.add_install_script('tools/meson_runlevels.sh', + os, + get_option('newnet') ? 'yes' : 'no', + rc_libexecdir, + get_option('sysconfdir')) +meson.add_install_script('tools/meson_final.sh', + rc_libexecdir, + os) diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 00000000..5fbafac9 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,30 @@ +option('audit', type : 'feature', value : 'auto', + description : 'enable libaudit support') +option('branding', type : 'string', + description : 'Add branding to OpenRC') +option('local_prefix', type : 'string', value : '/usr/local', + description : 'default location of user maintained packages') +option('newnet', type : 'boolean', + description : 'build and install our networking scripts') +option('os', type : 'combo', + choices : + [ '', 'DragonFly', 'FreeBSD', 'GNU', 'GNU-kFreeBSD', 'Linux', 'NetBSD' ], + description : 'Operating System (autodetected if not specified)') +option('pam', type : 'boolean', + description : 'enable PAM support') +option('pkg_prefix', type : 'string', + description : 'default location where packages are installed') +option('pkgconfig', type : 'boolean', + description : 'build PKGConfig files') +option('root_prefix', type : 'string', + description : 'default path of root directory') +option('selinux', type : 'feature', value : 'auto', + description : 'enable SELinux support') +option('shell', type : 'string', value : '/bin/sh', + description : 'Default posix compatible shell') +option('sysvinit', type : 'boolean', value : false, + description : 'enable SysVinit compatibility (linux only)') +option('termcap', type : 'combo', + choices : + [ '', 'ncurses', 'termcap' ], + description : 'the termcap library to use') diff --git a/pkgconfig/meson.build b/pkgconfig/meson.build new file mode 100644 index 00000000..e3d44fa6 --- /dev/null +++ b/pkgconfig/meson.build @@ -0,0 +1,22 @@ +pkgconfig_dir = get_option('libdir') / 'pkgconfig' + +pkgconfig_conf_data = configuration_data() +if root_prefix != '/' + pkgconfig_conf_data.set('PREFIX', root_prefix) +else + pkgconfig_conf_data.set('PREFIX', '') +endif +pkgconfig_conf_data.set('LIB', get_option('libdir')) +pkgconfig_conf_data.set('VERSION', meson.project_version()) + +pkgconfig_files = [ + 'einfo.pc.in', + 'openrc.pc.in', + ] + +foreach file : pkgconfig_files + configure_file(input : file, + output : '@BASENAME@', + configuration : pkgconfig_conf_data, + install_dir : pkgconfig_dir) +endforeach diff --git a/scripts/meson.build b/scripts/meson.build new file mode 100644 index 00000000..0885a013 --- /dev/null +++ b/scripts/meson.build @@ -0,0 +1,45 @@ +script_conf_data = configuration_data() +script_conf_data.set('SBINDIR', sbindir) + +script_dir = rc_libexecdir / 'bin' + +scripts_internal = [ + 'on_ac_power', + ] + +scripts_Linux = [ + 'rc-sstat.in', + ] + +scripts_sysvinit = [ + 'halt', + 'poweroff', + 'shutdown', + 'reboot', + ] + +install_data(scripts_internal, + install_dir : script_dir, + install_mode: 'rwxr-xr-x') + +if os == 'Linux' + foreach file : scripts_Linux + configure_file(input : file, + output : '@BASENAME@', + configuration : script_conf_data, + install_dir: script_dir, + install_mode: 'rwxr-xr-x') + endforeach + if get_option('sysvinit') + foreach file : scripts_sysvinit + configure_file(input : file, + output : '@BASENAME@', + configuration : script_conf_data, + install_dir: script_dir, + install_mode: 'rwxr-xr-x') + endforeach + endif +endif + +meson.add_install_script('meson_script_links.sh', rc_libexecdir, + sbindir) diff --git a/scripts/meson_script_links.sh b/scripts/meson_script_links.sh new file mode 100755 index 00000000..dcb8f1d5 --- /dev/null +++ b/scripts/meson_script_links.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +set -e +set -u + +rc_libexecdir="$1" +sbindir="$2" +binaries=" halt poweroff rc-sstat reboot shutdown" +for f in $binaries; do + if [ -x "${DESTDIR}${rc_libexecdir}/bin/${f}" ]; then + ln -snf "${DESTDIR}${rc_libexecdir}/bin/${f}" \ + "${DESTDIR}${sbindir}/${f}" + fi +done diff --git a/sh/meson.build b/sh/meson.build new file mode 100644 index 00000000..33b128b1 --- /dev/null +++ b/sh/meson.build @@ -0,0 +1,84 @@ +sh_conf_data = configuration_data() +if root_prefix == '/' + sh_conf_data.set('PREFIX', '') + else + sh_conf_data.set('PREFIX', root_prefix) +endif +sh_conf_data.set('BINDIR', bindir) +sh_conf_data.set('LIBEXECDIR', rc_libexecdir) +sh_conf_data.set('LOCAL_PREFIX', local_prefix) +sh_conf_data.set('PKG_PREFIX', pkg_prefix) +sh_conf_data.set('SBINDIR', sbindir) +sh_conf_data.set('SHELL', get_option('shell')) +sh_conf_data.set('SYSCONFDIR', get_option('sysconfdir')) + +sh_dir = rc_libexecdir / 'sh' + +sh = [ + 'rc-functions.sh', + 'rc-mount.sh', + 'runit.sh', + 's6.sh', + 'start-stop-daemon.sh', + 'supervise-daemon.sh', + ] + +sh_config = [ + 'functions.sh.in', + ] + +scripts_config = [ + 'gendepends.sh.in', + 'openrc-run.sh.in', + ] + +if os == 'Linux' + sh += [ + 'rc-cgroup.sh', + ] + scripts_config += [ + 'binfmt.sh.in', + 'cgroup-release-agent.sh.in', + ] + scripts_config_os = [ + ['init-early.sh.Linux.in', 'init-early.sh'], + ['init.sh.Linux.in', 'init.sh'], + ] +elif os == 'GNU' + scripts_config_os = [ + ['init.sh.GNU.in', 'init.sh'], + ] +elif os == 'Gnu-KFreeBSD' + scripts_config_os = [ + ['init.sh.GNU-kFreeBSD.in', 'init.sh'], + ] +else + scripts_config_os = [ + ['init.sh.BSD.in', 'init.sh'], + ] +endif + +install_data(sh, + install_dir : sh_dir) +foreach file : sh_config + configure_file(input : file, + output : '@BASENAME@', + configuration : sh_conf_data, + install_dir : sh_dir) +endforeach + +foreach file : scripts_config + configure_file(input : file, + output : '@BASENAME@', + configuration : sh_conf_data, + install_dir : sh_dir, + install_mode : 'rwxr-xr-x') +endforeach + +foreach file : scripts_config_os + configure_file(input : file.get(0), + output : file.get(1), + configuration : sh_conf_data, + install_dir : sh_dir, + install_mode : 'rwxr-xr-x') +endforeach diff --git a/src/common/meson.build b/src/common/meson.build new file mode 100644 index 00000000..2e421658 --- /dev/null +++ b/src/common/meson.build @@ -0,0 +1,6 @@ +version_h = vcs_tag( + input : 'version.h.in', + output : 'version.h') +version_f = vcs_tag( + input : 'version.in', + output : 'version') diff --git a/src/common/version.h.in b/src/common/version.h.in new file mode 100644 index 00000000..59d648d3 --- /dev/null +++ b/src/common/version.h.in @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2007-2015 The OpenRC Authors. + * See the Authors file at the top-level directory of this distribution and + * https://github.com/OpenRC/openrc/blob/master/AUTHORS + * + * This file is part of OpenRC. It is subject to the license terms in + * the LICENSE file found in the top-level directory of this + * distribution and at https://github.com/OpenRC/openrc/blob/master/LICENSE + * This file may not be copied, modified, propagated, or distributed + * except according to the terms contained in the LICENSE file. + */ + +#ifndef _VERSION_H_ +#define _VERSION_H_ + +#define VERSION "@VCS_TAG@" + +#endif diff --git a/src/common/version.in b/src/common/version.in new file mode 100644 index 00000000..42179405 --- /dev/null +++ b/src/common/version.in @@ -0,0 +1 @@ +@VCS_TAG@ diff --git a/src/libeinfo/meson.build b/src/libeinfo/meson.build new file mode 100644 index 00000000..16e82978 --- /dev/null +++ b/src/libeinfo/meson.build @@ -0,0 +1,12 @@ +libeinfo_version = '1' + +libeinfo = library('einfo', ['libeinfo.c'], + c_args : termcap_flags, + include_directories : incdir, + dependencies : termcap_dep, + link_depends : 'einfo.map', + version : libeinfo_version, + install : true, + install_dir : libdir) + +install_headers('einfo.h') diff --git a/src/librc/meson.build b/src/librc/meson.build new file mode 100644 index 00000000..4e560483 --- /dev/null +++ b/src/librc/meson.build @@ -0,0 +1,33 @@ +rc_h_conf_data = configuration_data() +if root_prefix == '/' + rc_h_conf_data.set('PREFIX', '') + else + rc_h_conf_data.set('PREFIX', root_prefix) + endif +rc_h_conf_data.set('LIB', libname) +rc_h_conf_data.set('LIBEXECDIR', rc_libexecdir) +rc_h_conf_data.set('LOCAL_PREFIX', local_prefix) +rc_h_conf_data.set('PKG_PREFIX', pkg_prefix) +rc_h_conf_data.set('SYSCONFDIR', get_option('sysconfdir')) + +librc_version = '1' + +librc_sources = [ + 'librc.c', + 'librc-daemon.c', + 'librc-depend.c', + 'librc-misc.c', + 'librc-stringlist.c', + ] + +rc_h = configure_file(input : 'rc.h.in', output : 'rc.h', + configuration : rc_h_conf_data) + +librc = library('rc', librc_sources, + include_directories : [incdir, einfo_incdir], + link_depends : 'rc.map', + version : librc_version, + install : true, + install_dir : libdir) + +install_headers(rc_h) diff --git a/src/meson.build b/src/meson.build new file mode 100644 index 00000000..d7390f54 --- /dev/null +++ b/src/meson.build @@ -0,0 +1,4 @@ +subdir('common') +subdir('libeinfo') +subdir('librc') +subdir('rc') diff --git a/src/rc/meson.build b/src/rc/meson.build new file mode 100644 index 00000000..97fb84e8 --- /dev/null +++ b/src/rc/meson.build @@ -0,0 +1,302 @@ +rc_misc_c = files([ + 'rc-misc.c', + ]) + +rc_plugin_c = ([ + 'rc-plugin.c', + ]) + +rc_schedules_c = files([ + 'rc-schedules.c', + ]) + +usage_c = files([ + '_usage.c', + ]) + +if get_option('selinux').enabled() + rc_selinux_c = files([ + 'rc-selinux.c', + ]) +else + rc_selinux_c = [] +endif + +rc_wtmp_c = files([ + 'rc-wtmp.c', + ]) + +rc_bindir = rc_libexecdir / 'bin' +rc_sbindir = rc_libexecdir / 'sbin' + +executable('rc-status', + ['rc-status.c', rc_misc_c, usage_c, version_h], + c_args : cc_branding_flags, + link_with: [libeinfo, librc], + dependencies: [util_dep], + include_directories: [incdir, einfo_incdir, rc_incdir], + install: true, + install_dir: bindir) + +executable('openrc', + ['rc.c', 'rc-logger.c', rc_misc_c, rc_plugin_c, usage_c, + version_h], + c_args : cc_branding_flags, + link_with: [libeinfo, librc], + dependencies: [dl_dep, util_dep], + include_directories: [incdir, einfo_incdir, rc_incdir], + install: true, + install_dir: sbindir) + +executable('openrc-run', + ['openrc-run.c', rc_misc_c, rc_plugin_c, usage_c, + rc_selinux_c, version_h], + c_args : [cc_audit_flags, cc_branding_flags, cc_pam_flags, cc_selinux_flags], + link_with: [libeinfo, librc], + dependencies: [dl_dep, libpam, selinux_dep, util_dep], + include_directories: [incdir, einfo_incdir, rc_incdir], + install: true, + install_dir: sbindir) + +executable('rc', + ['rc.c', 'rc-logger.c', rc_misc_c, rc_plugin_c, usage_c, version_h], + c_args : cc_branding_flags, + link_with: [libeinfo, librc], + dependencies: [dl_dep, util_dep], + include_directories: [incdir, einfo_incdir, rc_incdir], + install: true, + install_dir: sbindir) + +executable('rc-service', + ['rc-service.c', rc_misc_c, usage_c, version_h], + c_args : cc_branding_flags, + link_with: [libeinfo, librc], + include_directories: [incdir, einfo_incdir, rc_incdir], + install: true, + install_dir: sbindir) + +executable('rc-update', + ['rc-update.c', rc_misc_c, usage_c, version_h], + c_args : cc_branding_flags, + link_with: [libeinfo, librc], + include_directories: [incdir, einfo_incdir, rc_incdir], + install: true, + install_dir: sbindir) + +executable('runscript', + ['openrc-run.c', rc_misc_c, usage_c, 'rc-plugin.c', + rc_selinux_c, version_h], + c_args : [cc_audit_flags, cc_branding_flags, cc_pam_flags, cc_selinux_flags], + link_with: [libeinfo, librc], + dependencies: [dl_dep, libpam, util_dep, selinux_dep], + include_directories: [incdir, einfo_incdir, rc_incdir], + install: true, + install_dir: sbindir) + +executable('start-stop-daemon', + ['start-stop-daemon.c', 'rc-pipes.c', rc_misc_c, rc_schedules_c, + rc_selinux_c, usage_c, version_h], + c_args : [cc_audit_flags, cc_branding_flags, cc_pam_flags, cc_selinux_flags], + link_with: [libeinfo, librc], + dependencies: [dl_dep, libpam, util_dep, selinux_dep], + include_directories: [incdir, einfo_incdir, rc_incdir], + install: true, + install_dir: sbindir) + +executable('supervise-daemon', + ['supervise-daemon.c', rc_misc_c, rc_plugin_c, rc_schedules_c, + usage_c, version_h], + c_args : [cc_branding_flags, cc_pam_flags, cc_selinux_flags], + link_with: [libeinfo, librc], + dependencies: [dl_dep, libpam, util_dep, selinux_dep], + include_directories: [incdir, einfo_incdir, rc_incdir], + install: true, + install_dir: sbindir) + +if os == 'Linux' + executable('openrc-init', + ['openrc-init.c', rc_plugin_c, rc_wtmp_c, version_h], + include_directories: [incdir, einfo_incdir, rc_incdir], + link_with: [libeinfo, librc], + dependencies: [dl_dep], + install: true, + install_dir: sbindir) + + executable('openrc-shutdown', + ['openrc-shutdown.c', 'broadcast.c', 'rc-sysvinit.c', rc_misc_c, + usage_c, rc_wtmp_c, version_h], + c_args : cc_branding_flags, + include_directories: [incdir, einfo_incdir, rc_incdir], + link_with: [libeinfo, librc], + install: true, + install_dir: sbindir) +endif + +einfo_execs = [ + 'einfon', + 'einfo', + 'ewarnn', + 'ewarn', + 'eerrorn', + 'eerror', + 'ebegin', + 'eend', + 'ewend', + 'eindent', + 'eoutdent', + 'esyslog', + 'eval_ecolors', + 'ewaitfile', + 'veinfo', + 'vewarn', + 'vebegin', + 'veend', + 'vewend', + 'veindent', + 'veoutdent', + ] + +foreach exec: einfo_execs + executable(exec, + ['do_e.c', rc_misc_c, version_h], + include_directories: [incdir, einfo_incdir, rc_incdir], + link_with: [libeinfo, librc], + install: true, + install_dir: rc_bindir) +endforeach + +executable('checkpath', + ['checkpath.c', rc_misc_c, usage_c, rc_selinux_c, + version_h], + c_args : [cc_audit_flags, cc_branding_flags, cc_pam_flags, cc_selinux_flags], + include_directories: [incdir, einfo_incdir, rc_incdir], + link_with: [libeinfo, librc], + dependencies: [libpam, selinux_dep], + install: true, + install_dir: rc_bindir) + +executable('fstabinfo', + ['fstabinfo.c', rc_misc_c, usage_c, version_h], + c_args : cc_branding_flags, + include_directories: [incdir, einfo_incdir, rc_incdir], + link_with: [libeinfo, librc], + install: true, + install_dir: rc_bindir) + +executable('mountinfo', + ['mountinfo.c', rc_misc_c, usage_c, version_h], + c_args : cc_branding_flags, + include_directories: [incdir, einfo_incdir, rc_incdir], + link_with: [libeinfo, librc], + install: true, + install_dir: rc_bindir) + +executable('rc-depend', + ['rc-depend.c', rc_misc_c, usage_c, version_h], + c_args : cc_branding_flags, + include_directories: [incdir, einfo_incdir, rc_incdir], + link_with: [libeinfo, librc], + install: true, + install_dir: rc_bindir) + +executable('is_newer_than', + ['is_newer_than.c', rc_misc_c, version_h], + include_directories: [incdir, einfo_incdir, rc_incdir], + link_with: [libeinfo, librc], + install: true, + install_dir: rc_bindir) + +executable('is_older_than', + ['is_older_than.c', rc_misc_c, version_h], + include_directories: [incdir, einfo_incdir, rc_incdir], + link_with: [libeinfo, librc], + install: true, + install_dir: rc_bindir) + +service_execs = [ + 'service_starting', + 'service_started', + 'service_stopping', + 'service_stopped', + 'service_inactive', + 'service_wasinactive', + 'service_hotplugged', + 'service_started_daemon', + 'service_crashed', + ] + +foreach exec : service_execs + executable(exec, + ['do_service.c', rc_misc_c, version_h], + include_directories: [incdir, einfo_incdir, rc_incdir], + link_with: [libeinfo, librc], + install: true, + install_dir: rc_bindir) +endforeach + +value_execs = [ + 'service_get_value', + 'service_set_value', + 'get_options', + 'save_options', + ] + +foreach exec : value_execs + executable(exec, + ['do_value.c', rc_misc_c, version_h], + include_directories: [incdir, einfo_incdir, rc_incdir], + link_with: [libeinfo, librc], + install: true, + install_dir: rc_bindir) +endforeach + +if os == 'Linux' + executable('kill_all', + ['kill_all.c', usage_c, version_h], + c_args : cc_branding_flags, + include_directories: [incdir, einfo_incdir, rc_incdir], + link_with: [libeinfo,librc], + install: true, + install_dir: rc_bindir) + endif + +executable('shell_var', + ['shell_var.c'], + install: true, + install_dir: rc_bindir) + +mark_service_execs = [ + 'mark_service_starting', + 'mark_service_started', + 'mark_service_stopping', + 'mark_service_stopped', + 'mark_service_inactive', + 'mark_service_wasinactive', + 'mark_service_hotplugged', + 'mark_service_failed', + 'mark_service_crashed', + ] + +foreach exec : mark_service_execs + executable(exec, + ['do_mark_service.c', rc_misc_c, version_h], + include_directories: [incdir, einfo_incdir, rc_incdir], + link_with: [libeinfo,librc], + install: true, + install_dir: rc_sbindir) +endforeach + +executable('rc-abort', + 'rc-abort.c', + include_directories: [einfo_incdir], + link_with: [libeinfo], + install: true, + install_dir: rc_sbindir) + +executable('swclock', + ['swclock.c', rc_misc_c, usage_c, version_h], + c_args : cc_branding_flags, + include_directories: [incdir, einfo_incdir, rc_incdir], + link_with: [libeinfo,librc], + install: true, + install_dir: rc_sbindir) diff --git a/support/deptree2dot/meson.build b/support/deptree2dot/meson.build new file mode 100644 index 00000000..4c870c61 --- /dev/null +++ b/support/deptree2dot/meson.build @@ -0,0 +1,11 @@ +deptree2dot_dir = support_dir / 'deptree2dot' + +deptree2dot_bin = ['deptree2dot'] +deptree2dot_data = ['README.md'] + +install_data(deptree2dot_bin, + install_dir : deptree2dot_dir, + install_mode : 'rwxr-xr-x') + +install_data(deptree2dot_data, + install_dir : deptree2dot_dir) diff --git a/support/init.d.examples/meson.build b/support/init.d.examples/meson.build new file mode 100644 index 00000000..0866e1ef --- /dev/null +++ b/support/init.d.examples/meson.build @@ -0,0 +1,30 @@ +init_d_examples_dir = support_dir / 'init.d.examples' + +init_d_examples = [ + 'avahi-dnsconfd.in', + 'avahid.in', + 'dhcpcd.in', + 'dbus.in', + 'hald.in', + 'named.in', + 'ntpd.in', + 'openvpn.in', + 'polkitd.in', + 'sshd.in', + 'wpa_supplicant.in', + ] + +init_d_examples_data = [ + 'README.md', + ] + +foreach init_d_example: init_d_examples + configure_file(input : init_d_example, + output : '@BASENAME@', + configuration : init_d_conf_data, + install_dir : init_d_examples_dir, + install_mode : 'rwxr-xr-x') +endforeach + +install_data(init_d_examples_data, + install_dir : init_d_examples_dir) diff --git a/support/meson.build b/support/meson.build new file mode 100644 index 00000000..f1b7b7e1 --- /dev/null +++ b/support/meson.build @@ -0,0 +1,7 @@ +support_dir = get_option('datadir') / meson.project_name().to_lower() +support_dir = support_dir / 'support' + +subdir('deptree2dot') +subdir('init.d.examples') +subdir('openvpn') +subdir('sysvinit') diff --git a/support/openvpn/meson.build b/support/openvpn/meson.build new file mode 100644 index 00000000..43cdc1ab --- /dev/null +++ b/support/openvpn/meson.build @@ -0,0 +1,10 @@ +openvpn_dir = support_dir / 'openvpn' + +openvpn_bin = ['down.sh', 'up.sh'] +openvpn_data = ['README.md'] + +install_data(openvpn_bin, + install_dir : openvpn_dir, + install_mode : 'rwxr-xr-x') +install_data(openvpn_data, + install_dir : openvpn_dir) diff --git a/support/sysvinit/meson.build b/support/sysvinit/meson.build new file mode 100644 index 00000000..62be8785 --- /dev/null +++ b/support/sysvinit/meson.build @@ -0,0 +1,6 @@ +sysvinit_dir = support_dir / 'sysvinit' + +sysvinit_data = ['halt.sh', 'inittab', 'README.md'] + +install_data(sysvinit_data, + install_dir : sysvinit_dir) diff --git a/sysctl.d/meson.build b/sysctl.d/meson.build new file mode 100644 index 00000000..db4c0e9f --- /dev/null +++ b/sysctl.d/meson.build @@ -0,0 +1,6 @@ +sysctl_data = [ + 'README', + ] + +sysctldir = get_option('sysconfdir') / 'sysctl.d' +install_data(sysctl_data, install_dir : sysctldir) diff --git a/tools/meson_final.sh b/tools/meson_final.sh new file mode 100755 index 00000000..4941c8da --- /dev/null +++ b/tools/meson_final.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +set -e +set -u + +rc_libexecdir="$1" +os="$2" + +if [ ${os} != Linux ]; then + install -d "${DESTDIR}/${rc_libexecdir}"/init.d +fi +install -d "${DESTDIR}/${rc_libexecdir}"/tmp +install "${MESON_BUILD_ROOT}/src/version/version" "${DESTDIR}/${rc_libexecdir}" diff --git a/tools/meson_runlevels.sh b/tools/meson_runlevels.sh new file mode 100755 index 00000000..7cf068a9 --- /dev/null +++ b/tools/meson_runlevels.sh @@ -0,0 +1,94 @@ +#!/bin/sh + +set -e +set -u + +os="$1" +net="$2" +rc_libexecdir="$3" +sysconfdir="$4" + +init_d_dir="${sysconfdir}/init.d" +leveldir="${sysconfdir}/runlevels" +sysinitdir="${leveldir}/sysinit" +bootdir="${leveldir}/boot" +defaultdir="${leveldir}/default" +nonetworkdir="${leveldir}/nonetwork" +shutdowndir="${leveldir}/shutdown" + +sysinit= +case "${os}" in + Linux) + sysinit="${sysinit} cgroups devfs dmesg sysfs" + ;; +esac + +boot="bootmisc fsck hostname localmount loopback root swap sysctl urandom" +if [ "${net}" = yes ]; then + boot="${boot} network staticroute" +fi +boot_BSD="hostid newsyslog savecore syslogd" + +case "${os}" in + DragonFly) + boot="${boot} ${boot_BSD}" + ;; + FreeBSD|GNU-kFreeBSD) + boot="${boot} ${boot_BSD} adjkerntz dumpon modules syscons" + ;; + Linux) + boot="${boot} binfmt hwclock keymaps modules mtab procfs + save-keymaps save-termencoding termencoding" + ;; + NetBSD) + boot="${boot} ${boot_BSD} devdb swap-blk tys wscons" + ;; +esac + +default="local netmount" + +nonetwork="local" + +shutdown="savecache" +case "${os}" in + Linux) + shutdown="${shutdown} killprocs mount-ro" + ;; +esac + +if ! test -d "${DESTDIR}${sysinitdir}"; then + install -d "${DESTDIR}${sysinitdir}" + for x in ${sysinit}; do + ln -snf "${init_d_dir}/$x" "${DESTDIR}${sysinitdir}/$x" + done +fi + +if ! test -d "${DESTDIR}${bootdir}"; then + install -d "${DESTDIR}${bootdir}" + for x in ${boot}; do + ln -snf "${init_d_dir}/$x" "${DESTDIR}${bootdir}/$x" + done +fi + +if ! test -d "${DESTDIR}${defaultdir}"; then + install -d "${DESTDIR}${defaultdir}" + for x in ${default}; do + ln -snf "${init_d_dir}/$x" "${DESTDIR}${defaultdir}/$x" + done +fi + +if ! test -d "${DESTDIR}${nonetworkdir}"; then + install -d "${DESTDIR}${nonetworkdir}" + for x in ${nonetwork}; do + ln -snf "${init_d_dir}/$x" "${DESTDIR}${nonetworkdir}/$x" + done +fi + +if ! test -d "${DESTDIR}${shutdowndir}"; then + install -d "${DESTDIR}${shutdowndir}" + for x in ${shutdown}; do + ln -snf "${init_d_dir}/$x" "${DESTDIR}${shutdowndir}/$x" + done +fi + +ln -snf "${rc_libexecdir}"/sh/functions.sh "${DESTDIR}/${init_d_dir}"