compile 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. #! /bin/sh
  2. # Wrapper for compilers which do not understand '-c -o'.
  3. scriptversion=2012-03-05.13; # UTC
  4. # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009, 2010, 2012 Free
  5. # Software Foundation, Inc.
  6. # Written by Tom Tromey <tromey@cygnus.com>.
  7. #
  8. # This program is free software; you can redistribute it and/or modify
  9. # it under the terms of the GNU General Public License as published by
  10. # the Free Software Foundation; either version 2, or (at your option)
  11. # any later version.
  12. #
  13. # This program is distributed in the hope that it will be useful,
  14. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. # GNU General Public License for more details.
  17. #
  18. # You should have received a copy of the GNU General Public License
  19. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  20. # As a special exception to the GNU General Public License, if you
  21. # distribute this file as part of a program that contains a
  22. # configuration script generated by Autoconf, you may include it under
  23. # the same distribution terms that you use for the rest of that program.
  24. # This file is maintained in Automake, please report
  25. # bugs to <bug-automake@gnu.org> or send patches to
  26. # <automake-patches@gnu.org>.
  27. nl='
  28. '
  29. # We need space, tab and new line, in precisely that order. Quoting is
  30. # there to prevent tools from complaining about whitespace usage.
  31. IFS=" "" $nl"
  32. file_conv=
  33. # func_file_conv build_file lazy
  34. # Convert a $build file to $host form and store it in $file
  35. # Currently only supports Windows hosts. If the determined conversion
  36. # type is listed in (the comma separated) LAZY, no conversion will
  37. # take place.
  38. func_file_conv ()
  39. {
  40. file=$1
  41. case $file in
  42. / | /[!/]*) # absolute file, and not a UNC file
  43. if test -z "$file_conv"; then
  44. # lazily determine how to convert abs files
  45. case `uname -s` in
  46. MINGW*)
  47. file_conv=mingw
  48. ;;
  49. CYGWIN*)
  50. file_conv=cygwin
  51. ;;
  52. *)
  53. file_conv=wine
  54. ;;
  55. esac
  56. fi
  57. case $file_conv/,$2, in
  58. *,$file_conv,*)
  59. ;;
  60. mingw/*)
  61. file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
  62. ;;
  63. cygwin/*)
  64. file=`cygpath -m "$file" || echo "$file"`
  65. ;;
  66. wine/*)
  67. file=`winepath -w "$file" || echo "$file"`
  68. ;;
  69. esac
  70. ;;
  71. esac
  72. }
  73. # func_cl_dashL linkdir
  74. # Make cl look for libraries in LINKDIR
  75. func_cl_dashL ()
  76. {
  77. func_file_conv "$1"
  78. if test -z "$lib_path"; then
  79. lib_path=$file
  80. else
  81. lib_path="$lib_path;$file"
  82. fi
  83. linker_opts="$linker_opts -LIBPATH:$file"
  84. }
  85. # func_cl_dashl library
  86. # Do a library search-path lookup for cl
  87. func_cl_dashl ()
  88. {
  89. lib=$1
  90. found=no
  91. save_IFS=$IFS
  92. IFS=';'
  93. for dir in $lib_path $LIB
  94. do
  95. IFS=$save_IFS
  96. if $shared && test -f "$dir/$lib.dll.lib"; then
  97. found=yes
  98. lib=$dir/$lib.dll.lib
  99. break
  100. fi
  101. if test -f "$dir/$lib.lib"; then
  102. found=yes
  103. lib=$dir/$lib.lib
  104. break
  105. fi
  106. done
  107. IFS=$save_IFS
  108. if test "$found" != yes; then
  109. lib=$lib.lib
  110. fi
  111. }
  112. # func_cl_wrapper cl arg...
  113. # Adjust compile command to suit cl
  114. func_cl_wrapper ()
  115. {
  116. # Assume a capable shell
  117. lib_path=
  118. shared=:
  119. linker_opts=
  120. for arg
  121. do
  122. if test -n "$eat"; then
  123. eat=
  124. else
  125. case $1 in
  126. -o)
  127. # configure might choose to run compile as 'compile cc -o foo foo.c'.
  128. eat=1
  129. case $2 in
  130. *.o | *.[oO][bB][jJ])
  131. func_file_conv "$2"
  132. set x "$@" -Fo"$file"
  133. shift
  134. ;;
  135. *)
  136. func_file_conv "$2"
  137. set x "$@" -Fe"$file"
  138. shift
  139. ;;
  140. esac
  141. ;;
  142. -I)
  143. eat=1
  144. func_file_conv "$2" mingw
  145. set x "$@" -I"$file"
  146. shift
  147. ;;
  148. -I*)
  149. func_file_conv "${1#-I}" mingw
  150. set x "$@" -I"$file"
  151. shift
  152. ;;
  153. -l)
  154. eat=1
  155. func_cl_dashl "$2"
  156. set x "$@" "$lib"
  157. shift
  158. ;;
  159. -l*)
  160. func_cl_dashl "${1#-l}"
  161. set x "$@" "$lib"
  162. shift
  163. ;;
  164. -L)
  165. eat=1
  166. func_cl_dashL "$2"
  167. ;;
  168. -L*)
  169. func_cl_dashL "${1#-L}"
  170. ;;
  171. -static)
  172. shared=false
  173. ;;
  174. -Wl,*)
  175. arg=${1#-Wl,}
  176. save_ifs="$IFS"; IFS=','
  177. for flag in $arg; do
  178. IFS="$save_ifs"
  179. linker_opts="$linker_opts $flag"
  180. done
  181. IFS="$save_ifs"
  182. ;;
  183. -Xlinker)
  184. eat=1
  185. linker_opts="$linker_opts $2"
  186. ;;
  187. -*)
  188. set x "$@" "$1"
  189. shift
  190. ;;
  191. *.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
  192. func_file_conv "$1"
  193. set x "$@" -Tp"$file"
  194. shift
  195. ;;
  196. *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
  197. func_file_conv "$1" mingw
  198. set x "$@" "$file"
  199. shift
  200. ;;
  201. *)
  202. set x "$@" "$1"
  203. shift
  204. ;;
  205. esac
  206. fi
  207. shift
  208. done
  209. if test -n "$linker_opts"; then
  210. linker_opts="-link$linker_opts"
  211. fi
  212. exec "$@" $linker_opts
  213. exit 1
  214. }
  215. eat=
  216. case $1 in
  217. '')
  218. echo "$0: No command. Try '$0 --help' for more information." 1>&2
  219. exit 1;
  220. ;;
  221. -h | --h*)
  222. cat <<\EOF
  223. Usage: compile [--help] [--version] PROGRAM [ARGS]
  224. Wrapper for compilers which do not understand '-c -o'.
  225. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
  226. arguments, and rename the output as expected.
  227. If you are trying to build a whole package this is not the
  228. right script to run: please start by reading the file 'INSTALL'.
  229. Report bugs to <bug-automake@gnu.org>.
  230. EOF
  231. exit $?
  232. ;;
  233. -v | --v*)
  234. echo "compile $scriptversion"
  235. exit $?
  236. ;;
  237. cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
  238. func_cl_wrapper "$@" # Doesn't return...
  239. ;;
  240. esac
  241. ofile=
  242. cfile=
  243. for arg
  244. do
  245. if test -n "$eat"; then
  246. eat=
  247. else
  248. case $1 in
  249. -o)
  250. # configure might choose to run compile as 'compile cc -o foo foo.c'.
  251. # So we strip '-o arg' only if arg is an object.
  252. eat=1
  253. case $2 in
  254. *.o | *.obj)
  255. ofile=$2
  256. ;;
  257. *)
  258. set x "$@" -o "$2"
  259. shift
  260. ;;
  261. esac
  262. ;;
  263. *.c)
  264. cfile=$1
  265. set x "$@" "$1"
  266. shift
  267. ;;
  268. *)
  269. set x "$@" "$1"
  270. shift
  271. ;;
  272. esac
  273. fi
  274. shift
  275. done
  276. if test -z "$ofile" || test -z "$cfile"; then
  277. # If no '-o' option was seen then we might have been invoked from a
  278. # pattern rule where we don't need one. That is ok -- this is a
  279. # normal compilation that the losing compiler can handle. If no
  280. # '.c' file was seen then we are probably linking. That is also
  281. # ok.
  282. exec "$@"
  283. fi
  284. # Name of file we expect compiler to create.
  285. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
  286. # Create the lock directory.
  287. # Note: use '[/\\:.-]' here to ensure that we don't use the same name
  288. # that we are using for the .o file. Also, base the name on the expected
  289. # object file name, since that is what matters with a parallel build.
  290. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
  291. while true; do
  292. if mkdir "$lockdir" >/dev/null 2>&1; then
  293. break
  294. fi
  295. sleep 1
  296. done
  297. # FIXME: race condition here if user kills between mkdir and trap.
  298. trap "rmdir '$lockdir'; exit 1" 1 2 15
  299. # Run the compile.
  300. "$@"
  301. ret=$?
  302. if test -f "$cofile"; then
  303. test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
  304. elif test -f "${cofile}bj"; then
  305. test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
  306. fi
  307. rmdir "$lockdir"
  308. exit $ret
  309. # Local Variables:
  310. # mode: shell-script
  311. # sh-indentation: 2
  312. # eval: (add-hook 'write-file-hooks 'time-stamp)
  313. # time-stamp-start: "scriptversion="
  314. # time-stamp-format: "%:y-%02m-%02d.%02H"
  315. # time-stamp-time-zone: "UTC"
  316. # time-stamp-end: "; # UTC"
  317. # End: