aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS.md6
-rw-r--r--README.md13
-rw-r--r--conf.d/meson.build59
-rw-r--r--etc/meson.build44
-rw-r--r--init.d/meson.build100
-rw-r--r--local.d/meson.build7
-rw-r--r--man/meson.build34
-rwxr-xr-xman/meson_man_links.sh20
-rw-r--r--meson.build168
-rw-r--r--meson_options.txt30
-rw-r--r--pkgconfig/meson.build22
-rw-r--r--scripts/meson.build45
-rwxr-xr-xscripts/meson_script_links.sh14
-rw-r--r--sh/meson.build84
-rw-r--r--src/common/meson.build6
-rw-r--r--src/common/version.h.in18
-rw-r--r--src/common/version.in1
-rw-r--r--src/libeinfo/meson.build12
-rw-r--r--src/librc/meson.build33
-rw-r--r--src/meson.build4
-rw-r--r--src/rc/meson.build302
-rw-r--r--support/deptree2dot/meson.build11
-rw-r--r--support/init.d.examples/meson.build30
-rw-r--r--support/meson.build7
-rw-r--r--support/openvpn/meson.build10
-rw-r--r--support/sysvinit/meson.build6
-rw-r--r--sysctl.d/meson.build6
-rwxr-xr-xtools/meson_final.sh13
-rwxr-xr-xtools/meson_runlevels.sh94
29 files changed, 1197 insertions, 2 deletions
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}"