Home | History | Annotate | Download | only in m4
      1 #---------------------------------------------------------------------------
      2 #
      3 # xc-am-iface.m4
      4 #
      5 # Copyright (c) 2013 Daniel Stenberg <daniel (a] haxx.se>
      6 #
      7 # Permission to use, copy, modify, and distribute this software for any
      8 # purpose with or without fee is hereby granted, provided that the above
      9 # copyright notice and this permission notice appear in all copies.
     10 #
     11 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     12 # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     13 # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     14 # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     15 # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     16 # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     17 # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     18 #
     19 #---------------------------------------------------------------------------
     20 
     21 # serial 1
     22 
     23 
     24 dnl _XC_AUTOMAKE_BODY
     25 dnl -------------------------------------------------
     26 dnl Private macro.
     27 dnl
     28 dnl This macro performs embedding of automake initialization
     29 dnl code into configure script. When automake version 1.14 or
     30 dnl newer is used at configure script generation time, this
     31 dnl results in 'subdir-objects' automake option being used.
     32 dnl When using automake versions older than 1.14 this option
     33 dnl is not used when generating configure script.
     34 dnl
     35 dnl Existence of automake _AM_PROG_CC_C_O m4 private macro
     36 dnl is used to differentiate automake version 1.14 from older
     37 dnl ones which lack this macro.
     38 
     39 m4_define([_XC_AUTOMAKE_BODY],
     40 [dnl
     41 ## --------------------------------------- ##
     42 ##  Start of automake initialization code  ##
     43 ## --------------------------------------- ##
     44 m4_ifdef([_AM_PROG_CC_C_O],
     45 [
     46 AM_INIT_AUTOMAKE([subdir-objects])
     47 ],[
     48 AM_INIT_AUTOMAKE
     49 ])dnl
     50 ## ------------------------------------- ##
     51 ##  End of automake initialization code  ##
     52 ## ------------------------------------- ##
     53 dnl
     54 m4_define([$0], [])[]dnl
     55 ])
     56 
     57 
     58 dnl XC_AUTOMAKE
     59 dnl -------------------------------------------------
     60 dnl Public macro.
     61 dnl
     62 dnl This macro embeds automake machinery into configure
     63 dnl script regardless of automake version used in order
     64 dnl to generate configure script.
     65 dnl
     66 dnl When using automake version 1.14 or newer, automake
     67 dnl initialization option 'subdir-objects' is used to
     68 dnl generate the configure script, otherwise this option
     69 dnl is not used.
     70 
     71 AC_DEFUN([XC_AUTOMAKE],
     72 [dnl
     73 AC_PREREQ([2.50])dnl
     74 dnl
     75 AC_BEFORE([$0],[AM_INIT_AUTOMAKE])dnl
     76 dnl
     77 _XC_AUTOMAKE_BODY
     78 dnl
     79 m4_ifdef([AM_INIT_AUTOMAKE],
     80   [m4_undefine([AM_INIT_AUTOMAKE])])dnl
     81 dnl
     82 m4_define([$0], [])[]dnl
     83 ])
     84 
     85 
     86 dnl _XC_AMEND_DISTCLEAN_BODY ([LIST-OF-SUBDIRS])
     87 dnl -------------------------------------------------
     88 dnl Private macro.
     89 dnl
     90 dnl This macro performs shell code embedding into
     91 dnl configure script in order to modify distclean
     92 dnl and maintainer-clean targets of makefiles which
     93 dnl are located in given list of subdirs.
     94 dnl
     95 dnl See XC_AMEND_DISTCLEAN comments for details.
     96 
     97 m4_define([_XC_AMEND_DISTCLEAN_BODY],
     98 [dnl
     99 ## ---------------------------------- ##
    100 ##  Start of distclean amending code  ##
    101 ## ---------------------------------- ##
    102 
    103 for xc_subdir in [$1]
    104 do
    105 
    106 if test ! -f "$xc_subdir/Makefile"; then
    107   echo "$xc_msg_err $xc_subdir/Makefile file not found. $xc_msg_abrt" >&2
    108   exit 1
    109 fi
    110 
    111 # Fetch dependency tracking file list from Makefile include lines.
    112 
    113 xc_inc_lines=`grep '^include .*(DEPDIR)' "$xc_subdir/Makefile" 2>/dev/null`
    114 xc_cnt_words=`echo "$xc_inc_lines" | wc -w | tr -d "$xc_space$xc_tab"`
    115 
    116 # --disable-dependency-tracking might have been used, consequently
    117 # there is nothing to amend without a dependency tracking file list.
    118 
    119 if test $xc_cnt_words -gt 0; then
    120 
    121 AC_MSG_NOTICE([amending $xc_subdir/Makefile])
    122 
    123 # Build Makefile specific patch hunk.
    124 
    125 xc_p="$xc_subdir/xc_patch.tmp"
    126 
    127 xc_rm_depfiles=`echo "$xc_inc_lines" \
    128   | $SED 's%include%	-rm -f%' 2>/dev/null`
    129 
    130 xc_dep_subdirs=`echo "$xc_inc_lines" \
    131   | $SED 's%include[[ ]][[ ]]*%%' 2>/dev/null \
    132   | $SED 's%(DEPDIR)/.*%(DEPDIR)%' 2>/dev/null \
    133   | sort | uniq`
    134 
    135 echo "$xc_rm_depfiles" >$xc_p
    136 
    137 for xc_dep_dir in $xc_dep_subdirs; do
    138   echo "${xc_tab}@xm_dep_cnt=\`ls $xc_dep_dir | wc -l 2>/dev/null\`; \\"            >>$xc_p
    139   echo "${xc_tab}if test \$\$xm_dep_cnt -eq 0 && test -d $xc_dep_dir; then \\"      >>$xc_p
    140   echo "${xc_tab}  rm -rf $xc_dep_dir; \\"                                          >>$xc_p
    141   echo "${xc_tab}fi"                                                                >>$xc_p
    142 done
    143 
    144 # Build Makefile patching sed scripts.
    145 
    146 xc_s1="$xc_subdir/xc_script_1.tmp"
    147 xc_s2="$xc_subdir/xc_script_2.tmp"
    148 xc_s3="$xc_subdir/xc_script_3.tmp"
    149 
    150 cat >$xc_s1 <<\_EOT
    151 /^distclean[[ ]]*:/,/^[[^	]][[^	]]*:/{
    152   s/^.*(DEPDIR)/___xc_depdir_line___/
    153 }
    154 /^maintainer-clean[[ ]]*:/,/^[[^	]][[^	]]*:/{
    155   s/^.*(DEPDIR)/___xc_depdir_line___/
    156 }
    157 _EOT
    158 
    159 cat >$xc_s2 <<\_EOT
    160 /___xc_depdir_line___$/{
    161   N
    162   /___xc_depdir_line___$/D
    163 }
    164 _EOT
    165 
    166 cat >$xc_s3 <<_EOT
    167 /^___xc_depdir_line___/{
    168   r $xc_p
    169   d
    170 }
    171 _EOT
    172 
    173 # Apply patch to Makefile and cleanup.
    174 
    175 $SED -f "$xc_s1" "$xc_subdir/Makefile"      >"$xc_subdir/Makefile.tmp1"
    176 $SED -f "$xc_s2" "$xc_subdir/Makefile.tmp1" >"$xc_subdir/Makefile.tmp2"
    177 $SED -f "$xc_s3" "$xc_subdir/Makefile.tmp2" >"$xc_subdir/Makefile.tmp3"
    178 
    179 if test -f "$xc_subdir/Makefile.tmp3"; then
    180   mv -f "$xc_subdir/Makefile.tmp3" "$xc_subdir/Makefile"
    181 fi
    182 
    183 test -f "$xc_subdir/Makefile.tmp1" && rm -f "$xc_subdir/Makefile.tmp1"
    184 test -f "$xc_subdir/Makefile.tmp2" && rm -f "$xc_subdir/Makefile.tmp2"
    185 test -f "$xc_subdir/Makefile.tmp3" && rm -f "$xc_subdir/Makefile.tmp3"
    186 
    187 test -f "$xc_p"  && rm -f "$xc_p"
    188 test -f "$xc_s1" && rm -f "$xc_s1"
    189 test -f "$xc_s2" && rm -f "$xc_s2"
    190 test -f "$xc_s3" && rm -f "$xc_s3"
    191 
    192 fi
    193 
    194 done
    195 
    196 ## -------------------------------- ##
    197 ##  End of distclean amending code  ##
    198 ## -------------------------------- ##
    199 dnl
    200 m4_define([$0], [])[]dnl
    201 ])
    202 
    203 
    204 dnl XC_AMEND_DISTCLEAN ([LIST-OF-SUBDIRS])
    205 dnl -------------------------------------------------
    206 dnl Public macro.
    207 dnl
    208 dnl This macro embeds shell code into configure script
    209 dnl that amends, at configure runtime, the distclean
    210 dnl and maintainer-clean targets of Makefiles located
    211 dnl in all subdirs given in the mandatory white-space
    212 dnl separated list argument.
    213 dnl
    214 dnl Embedding only takes place when using automake 1.14
    215 dnl or newer, otherwise amending code is not included
    216 dnl in generated configure script.
    217 dnl
    218 dnl distclean and maintainer-clean targets are modified
    219 dnl to avoid unconditional removal of dependency subdirs
    220 dnl which triggers distclean and maintainer-clean errors
    221 dnl when using automake 'subdir-objects' option along
    222 dnl with per-target objects and source files existing in
    223 dnl multiple subdirs used for different build targets.
    224 dnl
    225 dnl New behavior first removes each dependency tracking
    226 dnl file independently, and only removes each dependency
    227 dnl subdir when it finds out that it no longer holds any
    228 dnl dependency tracking file.
    229 dnl
    230 dnl When configure option --disable-dependency-tracking
    231 dnl is used no amending takes place given that there are
    232 dnl no dependency tracking files.
    233 
    234 AC_DEFUN([XC_AMEND_DISTCLEAN],
    235 [dnl
    236 AC_PREREQ([2.50])dnl
    237 dnl
    238 m4_ifdef([_AC_OUTPUT_MAIN_LOOP],
    239   [m4_provide_if([_AC_OUTPUT_MAIN_LOOP], [],
    240     [m4_fatal([call to AC_OUTPUT needed before $0])])])dnl
    241 dnl
    242 m4_if([$#], [1], [], [m4_fatal([$0: wrong number of arguments])])dnl
    243 m4_if([$1], [], [m4_fatal([$0: missing argument])])dnl
    244 dnl
    245 AC_REQUIRE([XC_CONFIGURE_PREAMBLE])dnl
    246 dnl
    247 m4_ifdef([_AM_PROG_CC_C_O],
    248 [
    249 _XC_AMEND_DISTCLEAN_BODY([$1])
    250 ])dnl
    251 m4_define([$0], [])[]dnl
    252 ])
    253 
    254