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