Update to 2.5:
- Added support for pre/post fetch/build hooks so that, for example, rsync can be used to push the results of a successful build to a remote server.
This commit is contained in:
parent
3aab0e8dd5
commit
b54b7e2ded
5 changed files with 272 additions and 11 deletions
|
@ -1,6 +1,6 @@
|
|||
# $NetBSD: Makefile,v 1.23 2012/10/23 19:51:25 asau Exp $
|
||||
# $NetBSD: Makefile,v 1.24 2013/03/08 17:47:25 jmmv Exp $
|
||||
|
||||
DISTNAME= sysbuild-2.4
|
||||
DISTNAME= sysbuild-2.5
|
||||
CATEGORIES= sysutils
|
||||
MASTER_SITES= # empty
|
||||
DISTFILES= # empty
|
||||
|
@ -90,5 +90,6 @@ do-install:
|
|||
.endfor
|
||||
${INSTALL_SCRIPT} ${WRKSRC}/env.sh ${DESTDIR}${PREFIX}/share/sysbuild
|
||||
|
||||
BUILDLINK_API_DEPENDS.shtk+= shtk>=1.1
|
||||
.include "../../devel/shtk/buildlink3.mk"
|
||||
.include "../../mk/bsd.pkg.mk"
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.\" $NetBSD: sysbuild.1,v 1.6 2012/10/13 18:40:33 jmmv Exp $
|
||||
.\" $NetBSD: sysbuild.1,v 1.7 2013/03/08 17:47:26 jmmv Exp $
|
||||
.\" Copyright 2012 Google Inc.
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
|
@ -26,7 +26,7 @@
|
|||
.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
.\" OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
.Dd October 13, 2012
|
||||
.Dd March 8, 2013
|
||||
.Dt SYSBUILD 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
|
@ -95,6 +95,11 @@ Trivially set up periodic
|
|||
.Nx
|
||||
rebuilds by adding a single line to your
|
||||
.Xr crontab 5 .
|
||||
.It
|
||||
Hooks to plug other components into the build procedure.
|
||||
For example: use
|
||||
.Xr rsync 1
|
||||
to push the results of a successful build to a file server.
|
||||
.El
|
||||
.Pp
|
||||
As you can see in the
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.\" $NetBSD: sysbuild.conf.5,v 1.1 2012/10/13 18:40:33 jmmv Exp $
|
||||
.\" $NetBSD: sysbuild.conf.5,v 1.2 2013/03/08 17:47:26 jmmv Exp $
|
||||
.\" Copyright 2012 Google Inc.
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
|
@ -26,7 +26,7 @@
|
|||
.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
.\" OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
.Dd October 13, 2012
|
||||
.Dd March 8, 2013
|
||||
.Dt SYSBUILD.CONF 5
|
||||
.Os
|
||||
.Sh NAME
|
||||
|
@ -35,10 +35,11 @@
|
|||
.Sh DESCRIPTION
|
||||
Configuration files for
|
||||
.Xr sysbuild 1
|
||||
are plain shell scripts that define a set of recognized variables.
|
||||
.Pp
|
||||
As scripts, they can perform any magic they desire to deduce the value of
|
||||
the configuration variables.
|
||||
are plain shell scripts that define a set of recognized variables and can
|
||||
optionally fill in a set of hooks provided as shell functions.
|
||||
.Ss Configuration variables
|
||||
As scripts, configuration files can perform any magic they desire to deduce
|
||||
the value of configuration variables.
|
||||
For example, the default configuration file shipped with
|
||||
.Xr sysbuild 1
|
||||
automatically deduces the value of the
|
||||
|
@ -157,5 +158,35 @@ semantics, is not the same as setting this to 1).
|
|||
.Pp
|
||||
Default: not defined.
|
||||
.El
|
||||
.Ss Hooks
|
||||
Hooks are user-provided routines invoked at particular points during the
|
||||
build process.
|
||||
These are defined as shell functions and have access to the configuration
|
||||
variables in the file.
|
||||
Hooks must return a success error code and they cannot contain unprotected
|
||||
shell commands.
|
||||
In other words, they are run under a shell configured with
|
||||
.Sq set -e .
|
||||
.Pp
|
||||
The following hooks can be defined:
|
||||
.Bl -tag -width post_build_hookXX
|
||||
.It Fn pre_build_hook
|
||||
Function executed before invoking
|
||||
.Nm build.sh
|
||||
for any of the provided build targets and platforms.
|
||||
.It Fn post_build_hook
|
||||
Function executed at the end of all build operations.
|
||||
In other words: if the system is being built for multiple machine targets,
|
||||
this hook will only be run once.
|
||||
.It Fn pre_fetch_hook
|
||||
Function executed at the beginning of the
|
||||
.Sq fetch
|
||||
command before any operations are performed.
|
||||
This cannot assume that the source directories exist yet.
|
||||
.It Fn post_fetch_hook
|
||||
Function executed right after all source trees have been updated by the
|
||||
.Sq fetch
|
||||
command.
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr sysbuild 1
|
||||
|
|
|
@ -51,7 +51,7 @@ SYSBUILD_CONFIG_VARS="BUILD_ROOT BUILD_TARGETS CVSROOT CVSTAG INCREMENTAL_BUILD
|
|||
: ${SYSBUILD_SHAREDIR="@SYSBUILD_SHAREDIR@"}
|
||||
|
||||
|
||||
# Sets defaults for configuration variables that need a value.
|
||||
# Sets defaults for configuration variables and hooks that need to exist.
|
||||
#
|
||||
# This function should be before the configuration file has been loaded. This
|
||||
# means that the user can undefine a required configuration variable, but we let
|
||||
|
@ -66,6 +66,11 @@ sysbuild_set_defaults() {
|
|||
shtk_config_set RELEASEDIR "${HOME}/sysbuild/release"
|
||||
shtk_config_set SRCDIR "${HOME}/sysbuild/src"
|
||||
shtk_config_set UPDATE_SOURCES "true"
|
||||
|
||||
pre_build_hook() { true; }
|
||||
post_build_hook() { true; }
|
||||
pre_fetch_hook() { true; }
|
||||
post_fetch_hook() { true; }
|
||||
}
|
||||
|
||||
|
||||
|
@ -195,9 +200,11 @@ sysbuild_build() {
|
|||
sysbuild_fetch
|
||||
fi
|
||||
|
||||
shtk_config_run_hook pre_build_hook
|
||||
for machine in ${machines}; do
|
||||
do_one_build "${machine}"
|
||||
done
|
||||
shtk_config_run_hook post_build_hook
|
||||
}
|
||||
|
||||
|
||||
|
@ -268,6 +275,8 @@ EOF
|
|||
sysbuild_fetch() {
|
||||
[ ${#} -eq 0 ] || shtk_cli_usage_error "fetch does not take any arguments"
|
||||
|
||||
shtk_config_run_hook pre_fetch_hook
|
||||
|
||||
local cvsroot="$(shtk_config_get CVSROOT)"
|
||||
|
||||
shtk_cli_info "Updating base source tree"
|
||||
|
@ -279,6 +288,8 @@ sysbuild_fetch() {
|
|||
shtk_cvs_fetch "${cvsroot}" xsrc \
|
||||
"$(shtk_config_get_default CVSTAG '')" "$(shtk_config_get XSRCDIR)"
|
||||
fi
|
||||
|
||||
shtk_config_run_hook post_fetch_hook
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -508,6 +508,117 @@ EOF
|
|||
}
|
||||
|
||||
|
||||
atf_test_case build__hooks__ok
|
||||
build__hooks__ok_body() {
|
||||
create_mock_cvsroot "${MOCK_CVSROOT}"
|
||||
|
||||
create_mock_binary cvs yes
|
||||
PATH="$(pwd):${PATH}"
|
||||
|
||||
cat >test.conf <<EOF
|
||||
CVSROOT="${MOCK_CVSROOT}"
|
||||
MACHINES="one two" # Build hooks are only supposed to be called once.
|
||||
SRCDIR="$(pwd)/checkout/src"
|
||||
|
||||
pre_fetch_hook() {
|
||||
echo "Hook before fetch: \${SRCDIR}"
|
||||
}
|
||||
|
||||
post_fetch_hook() {
|
||||
echo "Hook after fetch"
|
||||
}
|
||||
|
||||
pre_build_hook() {
|
||||
echo "Hook before build: \${MACHINES}"
|
||||
}
|
||||
|
||||
post_build_hook() {
|
||||
echo "Hook after build"
|
||||
}
|
||||
EOF
|
||||
|
||||
atf_check -o save:stdout -e save:stderr sysbuild -c test.conf build
|
||||
grep 'Command: build.sh' commands.log || atf_fail "build.sh not run"
|
||||
|
||||
cat >exp_order <<EOF
|
||||
Hook before fetch: $(pwd)/checkout/src
|
||||
Hook after fetch
|
||||
Hook before build: one two
|
||||
Hook after build
|
||||
EOF
|
||||
atf_check -o file:exp_order grep '^Hook' stdout
|
||||
}
|
||||
|
||||
|
||||
atf_test_case build__hooks__pre_fail
|
||||
build__hooks__pre_fail_body() {
|
||||
create_mock_cvsroot "${MOCK_CVSROOT}"
|
||||
cat >test.conf <<EOF
|
||||
CVSROOT="${MOCK_CVSROOT}"
|
||||
SRCDIR="$(pwd)/checkout/src"
|
||||
|
||||
pre_fetch_hook() {
|
||||
echo "Hook before fetch"
|
||||
}
|
||||
|
||||
post_fetch_hook() {
|
||||
echo "Hook after fetch"
|
||||
}
|
||||
|
||||
pre_build_hook() {
|
||||
echo "Hook before build"
|
||||
false
|
||||
}
|
||||
|
||||
post_build_hook() {
|
||||
echo "Hook after build"
|
||||
}
|
||||
EOF
|
||||
|
||||
atf_check -s exit:1 -o save:stdout -e save:stderr \
|
||||
sysbuild -c test.conf build
|
||||
if grep 'Command: build.sh' commands.log; then
|
||||
atf_fail "build.sh should not have been run"
|
||||
fi
|
||||
|
||||
cat >exp_order <<EOF
|
||||
Hook before fetch
|
||||
Hook after fetch
|
||||
Hook before build
|
||||
EOF
|
||||
atf_check -o file:exp_order grep '^Hook' stdout
|
||||
}
|
||||
|
||||
|
||||
atf_test_case build__hooks__post_fail
|
||||
build__hooks__post_fail_body() {
|
||||
create_mock_cvsroot "${MOCK_CVSROOT}"
|
||||
cat >test.conf <<EOF
|
||||
CVSROOT="${MOCK_CVSROOT}"
|
||||
SRCDIR="$(pwd)/checkout/src"
|
||||
|
||||
pre_build_hook() {
|
||||
echo "Hook before build"
|
||||
}
|
||||
|
||||
post_build_hook() {
|
||||
echo "Hook after build"
|
||||
false
|
||||
}
|
||||
EOF
|
||||
|
||||
atf_check -s exit:1 -o save:stdout -e save:stderr \
|
||||
sysbuild -c test.conf build
|
||||
grep 'Command: build.sh' commands.log || atf_fail "build.sh not run"
|
||||
|
||||
cat >exp_order <<EOF
|
||||
Hook before build
|
||||
Hook after build
|
||||
EOF
|
||||
atf_check -o file:exp_order grep '^Hook' stdout
|
||||
}
|
||||
|
||||
|
||||
atf_test_case config__builtins
|
||||
config__builtins_body() {
|
||||
cat >expout <<EOF
|
||||
|
@ -853,6 +964,102 @@ EOF
|
|||
}
|
||||
|
||||
|
||||
atf_test_case fetch__hooks__ok
|
||||
fetch__hooks__ok_body() {
|
||||
create_mock_cvsroot "${MOCK_CVSROOT}"
|
||||
cat >test.conf <<EOF
|
||||
CVSROOT="${MOCK_CVSROOT}"
|
||||
SRCDIR="$(pwd)/checkout/src"
|
||||
XSRCDIR="$(pwd)/checkout/xsrc"
|
||||
|
||||
pre_fetch_hook() {
|
||||
echo "Hook before fetch: \${CVSROOT}"
|
||||
test ! -d "${SRCDIR}"
|
||||
}
|
||||
|
||||
post_fetch_hook() {
|
||||
test -d "${SRCDIR}"
|
||||
echo "Hook after fetch"
|
||||
}
|
||||
EOF
|
||||
|
||||
atf_check -o save:stdout -e ignore sysbuild -c test.conf fetch
|
||||
test -f checkout/src/file-in-src || atf_fail "src not checked out"
|
||||
test -f checkout/xsrc/file-in-xsrc || atf_fail "xsrc not checked out"
|
||||
|
||||
cat >exp_order <<EOF
|
||||
Hook before fetch: ${MOCK_CVSROOT}
|
||||
Hook after fetch
|
||||
EOF
|
||||
atf_check -o file:exp_order grep '^Hook' stdout
|
||||
}
|
||||
|
||||
|
||||
atf_test_case fetch__hooks__pre_fail
|
||||
fetch__hooks__pre_fail_body() {
|
||||
create_mock_cvsroot "${MOCK_CVSROOT}"
|
||||
cat >test.conf <<EOF
|
||||
CVSROOT="${MOCK_CVSROOT}"
|
||||
SRCDIR="$(pwd)/checkout/src"
|
||||
XSRCDIR="$(pwd)/checkout/xsrc"
|
||||
|
||||
pre_fetch_hook() {
|
||||
echo "Hook before fetch"
|
||||
false
|
||||
}
|
||||
|
||||
post_fetch_hook() {
|
||||
echo "Hook after fetch"
|
||||
}
|
||||
EOF
|
||||
|
||||
atf_check -s exit:1 -o save:stdout -e save:stderr \
|
||||
sysbuild -c test.conf fetch
|
||||
grep 'pre_fetch_hook returned an error' stderr || \
|
||||
atf_fail "pre_fetch_hook didn't seem to fail"
|
||||
test ! -f checkout/src/file-in-src || atf_fail "src checked out"
|
||||
test ! -f checkout/xsrc/file-in-xsrc || atf_fail "xsrc checked out"
|
||||
|
||||
cat >exp_order <<EOF
|
||||
Hook before fetch
|
||||
EOF
|
||||
atf_check -o file:exp_order grep '^Hook' stdout
|
||||
}
|
||||
|
||||
|
||||
atf_test_case fetch__hooks__post_fail
|
||||
fetch__hooks__post_fail_body() {
|
||||
create_mock_cvsroot "${MOCK_CVSROOT}"
|
||||
cat >test.conf <<EOF
|
||||
CVSROOT="${MOCK_CVSROOT}"
|
||||
SRCDIR="$(pwd)/checkout/src"
|
||||
XSRCDIR="$(pwd)/checkout/xsrc"
|
||||
|
||||
pre_fetch_hook() {
|
||||
echo "Hook before fetch"
|
||||
}
|
||||
|
||||
post_fetch_hook() {
|
||||
echo "Hook after fetch"
|
||||
false
|
||||
}
|
||||
EOF
|
||||
|
||||
atf_check -s exit:1 -o save:stdout -e save:stderr \
|
||||
sysbuild -c test.conf fetch
|
||||
test -f checkout/src/file-in-src || atf_fail "src not checked out"
|
||||
test -f checkout/xsrc/file-in-xsrc || atf_fail "xsrc not checked out"
|
||||
grep 'post_fetch_hook returned an error' stderr || \
|
||||
atf_fail "post_fetch_hook didn't seem to fail"
|
||||
|
||||
cat >exp_order <<EOF
|
||||
Hook before fetch
|
||||
Hook after fetch
|
||||
EOF
|
||||
atf_check -o file:exp_order grep '^Hook' stdout
|
||||
}
|
||||
|
||||
|
||||
atf_test_case fetch__too_many_args
|
||||
fetch__too_many_args_body() {
|
||||
cat >experr <<EOF
|
||||
|
@ -904,6 +1111,9 @@ atf_init_test_cases() {
|
|||
atf_add_test_case build__mkvars
|
||||
atf_add_test_case build__with_x11
|
||||
atf_add_test_case build__some_args
|
||||
atf_add_test_case build__hooks__ok
|
||||
atf_add_test_case build__hooks__pre_fail
|
||||
atf_add_test_case build__hooks__post_fail
|
||||
|
||||
atf_add_test_case config__builtins
|
||||
atf_add_test_case config__path__components
|
||||
|
@ -925,6 +1135,9 @@ atf_init_test_cases() {
|
|||
atf_add_test_case fetch__checkout__src_and_xsrc
|
||||
atf_add_test_case fetch__update__src_only
|
||||
atf_add_test_case fetch__update__src_and_xsrc
|
||||
atf_add_test_case fetch__hooks__ok
|
||||
atf_add_test_case fetch__hooks__pre_fail
|
||||
atf_add_test_case fetch__hooks__post_fail
|
||||
atf_add_test_case fetch__too_many_args
|
||||
|
||||
atf_add_test_case no_command
|
||||
|
|
Loading…
Reference in a new issue