aboutsummaryrefslogtreecommitdiff
path: root/aclocal.m4
blob: 15353f2c954500c1650f582336429f2b6bf00e5a (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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
#=========================================================================
# Local Autoconf Macros
#=========================================================================
# This file contains the macros for the Modular C++ Build System and
# additional autoconf macros which developers can use in their
# configure.ac scripts. Please read the documentation in
# 'mcppbs-doc.txt' for more details on how the Modular C++ Build System
# works. The documenation for each macro should include information
# about the author, date, and copyright.

#-------------------------------------------------------------------------
# MCPPBS_PROG_INSTALL
#-------------------------------------------------------------------------
# This macro will add an --enable-stow command line option to the
# configure script. When enabled, this macro will first check to see if
# the stow program is available and if so it will set the $stow shell
# variable to the binary name and the $enable_stow shell variable to
# "yes". These variables can be used in a makefile to conditionally use
# stow for installation. 
#
# This macro uses two environment variables to help setup default stow
# locations. The $STOW_PREFIX is used for stowing native built packages.
# The packages are staged in $STOW_PREFIX/pkgs and then symlinks are
# created from within $STOW_PREFIX into the pkgs subdirectory. If you
# only do native builds then this is all you need to set. If you don't
# set $STOW_PREFIX then the default is just the normal default prefix
# which is almost always /usr/local.
#
# For non-native builds we probably want to install the packages in a
# different location which includes the host architecture name as part
# of the prefix. For these kind of builds, we can specify the $STOW_ROOT
# environment variable and the effective prefix will be
# $STOW_ROOT/${host_alias} where ${host_alias} is specified on the
# configure command line with "--host".
#
# Here is an example setup:
#
#  STOW_ROOT="$HOME/install"
#  STOW_ARCH="i386-macosx10.4"
#  STOW_PREFIX="${STOW_ROOT}/${STOW_ARCH}"
#

AC_DEFUN([MCPPBS_PROG_INSTALL],
[

  # Configure command line option

  AC_ARG_ENABLE(stow,
    AS_HELP_STRING(--enable-stow,[Enable stow-based install]),
      [enable_stow="yes"],[enable_stow="no"])

  AC_SUBST([enable_stow])
   
  # Environment variables

  AC_ARG_VAR([STOW_ROOT],   [Root for non-native stow-based installs])
  AC_ARG_VAR([STOW_PREFIX], [Prefix for stow-based installs])

  # Check for install script

  AC_PROG_INSTALL

  # Deterimine if native build and set prefix appropriately
  
  AS_IF([ test ${enable_stow} = "yes" ],
  [
    AC_CHECK_PROGS([stow],[stow],[no])  
    AS_IF([ test ${stow} = "no" ],
    [
      AC_MSG_ERROR([Cannot use --enable-stow since stow is not available])
    ])

    # Check if native or non-native build

    AS_IF([ test "${build}" = "${host}" ],
    [

      # build == host so this is a native build. Make sure --prefix not
      # set and $STOW_PREFIX is set, then set prefix=$STOW_PREFIX.

      AS_IF([ test "${prefix}" = "NONE" && test -n "${STOW_PREFIX}" ],
      [
        prefix="${STOW_PREFIX}"
        AC_MSG_NOTICE([Using \$STOW_PREFIX from environment])
        AC_MSG_NOTICE([prefix=${prefix}])
      ])

    ],[

      # build != host so this is a non-native build. Make sure --prefix
      # not set and $STOW_ROOT is set, then set
      # prefix=$STOW_ROOT/${host_alias}.

      AS_IF([ test "${prefix}" = "NONE" && test -n "${STOW_ROOT}" ],
      [
        prefix="${STOW_ROOT}/${host_alias}"
        AC_MSG_NOTICE([Using \$STOW_ROOT from environment])
        AC_MSG_NOTICE([prefix=${prefix}])
      ])

    ])
      
  ])

])

#-------------------------------------------------------------------------
# MCPPBS_PROG_RUN
# -------------------------------------------------------------------------
# If we are doing a non-native build then we look for an isa simulator
# to use for running tests. We set the RUN substitution variable to be
# empty for native builds or to the name of the isa simulator for
# non-native builds. Thus a makefile can run compiled programs
# regardless if we are doing a native or non-native build like this:
# 
#  $(RUN) $(RUNFLAGS) ./test-program
#

AC_DEFUN([MCPPBS_PROG_RUN],
[
  AS_IF([ test "${build}" != "${host}" ],
  [
    AC_CHECK_TOOLS([RUN],[isa-run run],[no])
    AS_IF([ test ${RUN} = "no" ],
    [
      AC_MSG_ERROR([Cannot find simulator for target ${target_alias}])
    ])
  ],[
    RUN=""
  ])
  AC_SUBST([RUN])
  AC_SUBST([RUNFLAGS])
])

#-------------------------------------------------------------------------
# MCPPBS_SUBPROJECTS([ sproj1, sproj2, ... ])
#-------------------------------------------------------------------------
# The developer should call this macro with a list of the subprojects
# which make up this project. One should order the list such that any
# given subproject only depends on subprojects listed before it. The
# subproject names can also include an * suffix which indicates that
# this is an optional subproject. Optional subprojects are only included
# as part of the project build if enabled on the configure command line
# with a --enable-<subproject> flag. The user can also specify that all
# optional subprojects should be included in the build with the
# --enable-optional-subprojects flag.
#
# Subproject names can also include a ** suffix which indicates that it
# is an optional subproject, but there is a group with the same name.
# Thus the --enable-<sproj> command line option will enable not just the
# subproject sproj but all of the subprojects which are in the group.
# There is no error checking to make sure that if you use the ** suffix
# you actually define a group so be careful.
#
# Both required and optional subprojects should have a 'subproject.ac'
# file. The script's filename should be the abbreivated subproject name
# (assuming the subproject name is sproj then we would use 'sproj.ac')
# The MCPPBS_SUBPROJECTS macro includes the 'subproject.ac' files for
# enabled subprojects. Whitespace and newlines are allowed within the
# list.
#
# Author : Christopher Batten
# Date   : September 10, 2008

AC_DEFUN([MCPPBS_SUBPROJECTS],
[

  # Add command line argument to enable all optional subprojects 

  AC_ARG_ENABLE(optional-subprojects,
    AS_HELP_STRING([--enable-optional-subprojects],
      [Enable all optional subprojects]))

  # Loop through the subprojects given in the macro argument

  m4_foreach([MCPPBS_SPROJ],[$1],
  [
  
    # Determine if this is a required or an optional subproject

    m4_define([MCPPBS_IS_REQ],
      m4_bmatch(MCPPBS_SPROJ,[\*+],[false],[true]))

    # Determine if there is a group with the same name

    m4_define([MCPPBS_IS_GROUP],
      m4_bmatch(MCPPBS_SPROJ,[\*\*],[true],[false]))

    # Create variations of the subproject name suitable for use as a CPP
    # enabled define, a shell enabled variable, and a shell function

    m4_define([MCPPBS_SPROJ_NORM],
      m4_normalize(m4_bpatsubsts(MCPPBS_SPROJ,[*],[])))

    m4_define([MCPPBS_SPROJ_DEFINE],
      m4_toupper(m4_bpatsubst(MCPPBS_SPROJ_NORM[]_ENABLED,[-],[_])))

    m4_define([MCPPBS_SPROJ_FUNC],
      m4_bpatsubst(_mpbp_[]MCPPBS_SPROJ_NORM[]_configure,[-],[_]))

    m4_define([MCPPBS_SPROJ_UNDERSCORES],
      m4_bpatsubsts(MCPPBS_SPROJ,[-],[_]))

    m4_define([MCPPBS_SPROJ_SHVAR],
      m4_bpatsubst(enable_[]MCPPBS_SPROJ_NORM[]_sproj,[-],[_]))
    
    # Add subproject to our running list

    subprojects="$subprojects MCPPBS_SPROJ_NORM"

    # Process the subproject appropriately. If enabled add it to the
    # $enabled_subprojects running shell variable, set a
    # SUBPROJECT_ENABLED C define, and include the appropriate
    # 'subproject.ac'.

    m4_if(MCPPBS_IS_REQ,[true],
    [
      AC_MSG_NOTICE([configuring default subproject : MCPPBS_SPROJ_NORM])
      AC_CONFIG_FILES(MCPPBS_SPROJ_NORM[].mk:MCPPBS_SPROJ_NORM[]/MCPPBS_SPROJ_NORM[].mk.in)
      MCPPBS_SPROJ_SHVAR="yes"
      subprojects_enabled="$subprojects_enabled MCPPBS_SPROJ_NORM"
      AC_DEFINE(MCPPBS_SPROJ_DEFINE,,
        [Define if subproject MCPPBS_SPROJ_NORM is enabled])
      m4_include(MCPPBS_SPROJ_NORM[]/MCPPBS_SPROJ_NORM[].ac) 
    ],[

      # For optional subprojects we capture the 'subproject.ac' as a
      # shell function so that in the MCPPBS_GROUP macro we can just
      # call this shell function instead of reading in 'subproject.ac'
      # again.

      MCPPBS_SPROJ_FUNC ()
      { 
        AC_MSG_NOTICE([configuring optional subproject : MCPPBS_SPROJ_NORM])
        AC_CONFIG_FILES(MCPPBS_SPROJ_NORM[].mk:MCPPBS_SPROJ_NORM[]/MCPPBS_SPROJ_NORM[].mk.in)
        MCPPBS_SPROJ_SHVAR="yes"
        subprojects_enabled="$subprojects_enabled MCPPBS_SPROJ_NORM"
        AC_DEFINE(MCPPBS_SPROJ_DEFINE,,
          [Define if subproject MCPPBS_SPROJ_NORM is enabled])
        m4_include(MCPPBS_SPROJ_NORM[]/MCPPBS_SPROJ_NORM[].ac) 
      };

      # Optional subprojects add --enable-subproject command line
      # options, _if_ the subproject name is not also a group name.

      m4_if(MCPPBS_IS_GROUP,[false],
      [
        AC_ARG_ENABLE(MCPPBS_SPROJ_NORM,
          AS_HELP_STRING(--enable-MCPPBS_SPROJ_NORM,
            [Subproject MCPPBS_SPROJ_NORM]),
          [MCPPBS_SPROJ_SHVAR="yes"],[MCPPBS_SPROJ_SHVAR="no"])

        AS_IF([test "$MCPPBS_SPROJ_SHVAR" = "yes"],
        [
          eval "MCPPBS_SPROJ_FUNC"
        ],[ 
          AC_MSG_NOTICE([processing optional subproject : MCPPBS_SPROJ_NORM])
        ])

     ],[

       # If the subproject name is also a group name then we need to
       # make sure that we set the shell variable for that subproject to
       # no so that the group code knows we haven't run it yet.

       AC_MSG_NOTICE([processing optional subproject : MCPPBS_SPROJ_NORM])
       MCPPBS_SPROJ_SHVAR="no"

     ])

     # Always execute the subproject configure code if we are enabling
     # all subprojects.

     AS_IF([    test "$enable_optional_subprojects" = "yes" \
             && test "$MCPPBS_SPROJ_SHVAR" = "no"  ],
     [
       eval "MCPPBS_SPROJ_FUNC"
     ])

    ])

  ])

  # Output make variables  

  AC_SUBST([subprojects])
  AC_SUBST([subprojects_enabled])

])

#-------------------------------------------------------------------------
# MCPPBS_GROUP( [group-name], [ sproj1, sproj2, ... ] )
#-------------------------------------------------------------------------
# This macro creates a subproject group with the given group-name. When
# a user specifies --enable-<group-name> the listed subprojects will be
# enabled. Groups can have the same name as a subproject and in that
# case whenever a user specifies --enable-<subproject> the subprojects
# listed in the corresponding group will also be enabled. Groups are
# useful for specifying related subprojects which are usually enabled
# together, as well as for specifying that a specific optional
# subproject has dependencies on other optional subprojects.
#
# Author : Christopher Batten
# Date   : September 10, 2008

AC_DEFUN([MCPPBS_GROUP],
[

  m4_define([MCPPBS_GROUP_NORM],
    m4_normalize([$1]))

  m4_define([MCPPBS_GROUP_SHVAR],
    m4_bpatsubst(enable_[]MCPPBS_GROUP_NORM[]_group,[-],[_]))
                
  AC_ARG_ENABLE(MCPPBS_GROUP_NORM,
    AS_HELP_STRING(--enable-MCPPBS_GROUP_NORM,
      [Group MCPPBS_GROUP_NORM: $2]),
    [MCPPBS_GROUP_SHVAR="yes"],[MCPPBS_GROUP_SHVAR="no"])

  AS_IF([test "$MCPPBS_GROUP_SHVAR" = "yes" ],
  [ 
    AC_MSG_NOTICE([configuring optional group : MCPPBS_GROUP_NORM])
  ])

  m4_foreach([MCPPBS_SPROJ],[$2],
  [    

    m4_define([MCPPBS_SPROJ_NORM],
      m4_normalize(MCPPBS_SPROJ))

    m4_define([MCPPBS_SPROJ_SHVAR],
      m4_bpatsubst(enable_[]MCPPBS_SPROJ_NORM[]_sproj,[-],[_]))

    m4_define([MCPPBS_SPROJ_FUNC],
      m4_bpatsubst(_mpbp_[]MCPPBS_SPROJ_NORM[]_configure,[-],[_]))

    AS_IF([    test "$MCPPBS_GROUP_SHVAR" = "yes" \
            && test "$MCPPBS_SPROJ_SHVAR" = "no" ],
    [
      eval "MCPPBS_SPROJ_FUNC"
    ])

  ])

])