summaryrefslogtreecommitdiff
path: root/m4/eds-installed-tests.m4
blob: 82490ecbded062776e9be4ea738e52f34a3e8549 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# How to use the installed tests m4
#
#   Place EDS_INSTALLED_TESTS somewhere in configure.ac
#
#   Writing your Makefile.am
#   ~~~~~~~~~~~~~~~~~~~~~~~~
#
#   Build your local unit tests in the normal way, we only
#   depend on your correctly building tests under noinst_PROGRAMS:
#
#       noinst_PROGRAMS=list of unit tests
#
#   Normally you will go ahead an assign the TESTS and TESTS_ENVIRONMENT variables
#   so that your unit tests run at `make check' time, we recommend this
#   but it's not a requirement for this macro to work.
#
#   Somewhere in your Makefile.am in this test directory, you need to declare
#   the following variables:
#
#       INSTALLED_TESTS=list of tests to install
#       INSTALLED_TESTS_TYPE=session
#       INSTALLED_TESTS_ENVIRONMENT="SOME_OPTION=foo OTHER_OPTION=bar"
#
#   First the list of tests which should be installed, followed by
#   the type of test they should be configured as. The type can
#   be 'session' or 'session-exclusive'
#
#   More information about valid types can be found here:
#      https://wiki.gnome.org/GnomeGoals/InstalledTests
#
#   The last variable is optional, but can be useful to configure
#   your test program to run in the installed environment as opposed
#   to the normal `make check' run.
#
#   Finally, place this somewhere in your Makefile.am
#
#       @EDS_INSTALLED_TESTS_RULE@
#
#   And that's it, now your unit tests will be installed along with
#   a .test metadata file into $(pkglibexecdir) if --enable-installed-tests
#   is passed to your configure script, and will be run automatically
#   by the continuous integration servers.
#
#   FIXME: Change the above link to point to real documentation, not
#   a gnome goal page which might disappear at some point.
#
# BUGS: This macro hooks into install-exec-am and install-data-am
# which are internals of Automake. This is because Automake doesnt
# consider the regular install-exec-local / install-exec-hook or
# data install components unless variables have been setup for them
# in advance.
#
# This doesnt seem to present a problem, but it is depending on
# internals of Automake instead of clear documented API.

# Place this in configure.ac to enable
# the installed tests option.
AC_DEFUN([EDS_INSTALLED_TESTS], [
AC_PREREQ([2.50])dnl
AC_REQUIRE([AM_NLS])dnl

  AC_PROG_INSTALL
  AC_PROG_MKDIR_P
  AC_PROG_LIBTOOL

  AC_ARG_ENABLE(installed-tests,
		[AC_HELP_STRING([--enable-installed-tests],
				[enable installed unit tests [default=no]])],,
  		[enable_installed_tests="no"])

  AM_CONDITIONAL([EDS_INSTALLED_TESTS_ENABLED],[test "x$enable_installed_tests" = "xyes"])
  AC_SUBST([EDS_INSTALLED_TESTS_ENABLED], [$enable_installed_tests])

  # Define the rule for makefiles
  EDS_INSTALLED_TESTS_RULE='

ifeq ($(EDS_INSTALLED_TESTS_ENABLED),yes)

install-exec-am: installed-tests-exec-hook
install-data-am: installed-tests-data-hook

META_DIRECTORY=${DESTDIR}/${datadir}/installed-tests/${PACKAGE}
EXEC_DIRECTORY=${DESTDIR}/${pkglibexecdir}/installed-tests

FINAL_TEST_ENVIRONMENT=
ifneq ($(INSTALLED_TESTS_ENVIRONMENT),)
      FINAL_TEST_ENVIRONMENT="env $(INSTALLED_TESTS_ENVIRONMENT)"
endif

installed-tests-exec-hook:
	@$(MKDIR_P) $(EXEC_DIRECTORY);
	@for test in $(INSTALLED_TESTS); do						\
	    $(LIBTOOL) --mode=install $(INSTALL) --mode=755 $$test $(EXEC_DIRECTORY);	\
	done

installed-tests-data-hook:
	@$(MKDIR_P) $(META_DIRECTORY);
	@for test in $(INSTALLED_TESTS); do							\
	    echo "Installing $$test.test to $(META_DIRECTORY)";					\
	    echo m4_escape([[Test]]) > $(META_DIRECTORY)/$$test.test;				\
	    echo "Exec=$(FINAL_TEST_ENVIRONMENT) $(pkglibexecdir)/installed-tests/$$test"	\
	                                           >> $(META_DIRECTORY)/$$test.test;		\
	    echo "Type=$(INSTALLED_TESTS_TYPE)" >> $(META_DIRECTORY)/$$test.test;		\
	done
endif
'

  # substitute @EDS_INSTALLED_TESTS_RULE@ in Makefiles
  AC_SUBST([EDS_INSTALLED_TESTS_RULE])
  m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([EDS_INSTALLED_TESTS_RULE])])
])