acinclude.m4 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. dnl Redefine AC_LANG_PROGRAM with a "-Wstrict-prototypes -Werror"-friendly
  2. dnl version. Patch submitted to bug-autoconf in 2009-09-16.
  3. m4_define([AC_LANG_PROGRAM(C)],
  4. [$1
  5. int
  6. main (void)
  7. {
  8. dnl Do *not* indent the following line: there may be CPP directives.
  9. dnl Don't move the `;' right after for the same reason.
  10. $2
  11. ;
  12. return 0;
  13. }])
  14. dnl Check whether target compiler is working
  15. AC_DEFUN([grub_PROG_TARGET_CC],
  16. [AC_MSG_CHECKING([whether target compiler is working])
  17. AC_CACHE_VAL(grub_cv_prog_target_cc,
  18. [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
  19. asm (".globl start; start:");
  20. int main (void);
  21. ]], [[]])],
  22. [grub_cv_prog_target_cc=yes],
  23. [grub_cv_prog_target_cc=no])
  24. ])
  25. AC_MSG_RESULT([$grub_cv_prog_target_cc])
  26. if test "x$grub_cv_prog_target_cc" = xno; then
  27. AC_MSG_ERROR([cannot compile for the target])
  28. fi
  29. ])
  30. dnl grub_ASM_USCORE checks if C symbols get an underscore after
  31. dnl compiling to assembler.
  32. dnl Written by Pavel Roskin. Based on grub_ASM_EXT_C written by
  33. dnl Erich Boleyn and modified by Yoshinori K. Okuji.
  34. AC_DEFUN([grub_ASM_USCORE],
  35. [AC_REQUIRE([AC_PROG_CC])
  36. AC_REQUIRE([AC_PROG_EGREP])
  37. AC_MSG_CHECKING([if C symbols get an underscore after compilation])
  38. AC_CACHE_VAL(grub_cv_asm_uscore,
  39. [cat > conftest.c <<\EOF
  40. int func (int *);
  41. int
  42. func (int *list)
  43. {
  44. *list = 0;
  45. return *list;
  46. }
  47. EOF
  48. if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -S conftest.c]) && test -s conftest.s; then
  49. true
  50. else
  51. AC_MSG_ERROR([${CC-cc} failed to produce assembly code])
  52. fi
  53. if $EGREP '(^|[^_[:alnum]])_func' conftest.s >/dev/null 2>&1; then
  54. HAVE_ASM_USCORE=1
  55. grub_cv_asm_uscore=yes
  56. else
  57. HAVE_ASM_USCORE=0
  58. grub_cv_asm_uscore=no
  59. fi
  60. rm -f conftest*])
  61. AC_MSG_RESULT([$grub_cv_asm_uscore])
  62. ])
  63. dnl Some versions of `objcopy -O binary' vary their output depending
  64. dnl on the link address.
  65. AC_DEFUN([grub_PROG_OBJCOPY_ABSOLUTE],
  66. [AC_MSG_CHECKING([whether ${OBJCOPY} works for absolute addresses])
  67. AC_CACHE_VAL(grub_cv_prog_objcopy_absolute,
  68. [cat > conftest.c <<\EOF
  69. void cmain (void);
  70. void
  71. cmain (void)
  72. {
  73. *((int *) 0x1000) = 2;
  74. }
  75. EOF
  76. if AC_TRY_EVAL(ac_compile) && test -s conftest.o; then :
  77. else
  78. AC_MSG_ERROR([${CC-cc} cannot compile C source code])
  79. fi
  80. grub_cv_prog_objcopy_absolute=yes
  81. for link_addr in 0x2000 0x8000 0x7C00; do
  82. if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -nostdlib ${TARGET_IMG_LDFLAGS_AC} ${TARGET_IMG_BASE_LDOPT},$link_addr conftest.o -o conftest.exec]); then :
  83. else
  84. AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr])
  85. fi
  86. if AC_TRY_COMMAND([${OBJCOPY-objcopy} --only-section=.text -O binary conftest.exec conftest]); then :
  87. else
  88. AC_MSG_ERROR([${OBJCOPY-objcopy} cannot create binary files])
  89. fi
  90. if test ! -f conftest.old || AC_TRY_COMMAND([cmp -s conftest.old conftest]); then
  91. mv -f conftest conftest.old
  92. else
  93. grub_cv_prog_objcopy_absolute=no
  94. break
  95. fi
  96. done
  97. rm -f conftest*])
  98. AC_MSG_RESULT([$grub_cv_prog_objcopy_absolute])
  99. if test "x$grub_cv_prog_objcopy_absolute" = xno; then
  100. AC_MSG_ERROR([GRUB requires a working absolute objcopy; upgrade your binutils])
  101. fi
  102. ])
  103. dnl Supply --build-id=none to ld if building modules.
  104. dnl This suppresses warnings from ld on some systems
  105. AC_DEFUN([grub_PROG_LD_BUILD_ID_NONE],
  106. [AC_MSG_CHECKING([whether linker accepts --build-id=none])
  107. AC_CACHE_VAL(grub_cv_prog_ld_build_id_none,
  108. [save_LDFLAGS="$LDFLAGS"
  109. LDFLAGS="$LDFLAGS -Wl,--build-id=none"
  110. AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
  111. [grub_cv_prog_ld_build_id_none=yes],
  112. [grub_cv_prog_ld_build_id_none=no])
  113. LDFLAGS="$save_LDFLAGS"
  114. ])
  115. AC_MSG_RESULT([$grub_cv_prog_ld_build_id_none])
  116. if test "x$grub_cv_prog_ld_build_id_none" = xyes; then
  117. TARGET_LDFLAGS="$TARGET_LDFLAGS -Wl,--build-id=none"
  118. fi
  119. ])
  120. dnl Mass confusion!
  121. dnl Older versions of GAS interpret `.code16' to mean ``generate 32-bit
  122. dnl instructions, but implicitly insert addr32 and data32 bytes so
  123. dnl that the code works in real mode''.
  124. dnl
  125. dnl Newer versions of GAS interpret `.code16' to mean ``generate 16-bit
  126. dnl instructions,'' which seems right. This requires the programmer
  127. dnl to explicitly insert addr32 and data32 instructions when they want
  128. dnl them.
  129. dnl
  130. dnl We only support the newer versions, because the old versions cause
  131. dnl major pain, by requiring manual assembly to get 16-bit instructions into
  132. dnl asm files.
  133. AC_DEFUN([grub_I386_ASM_ADDR32],
  134. [AC_REQUIRE([AC_PROG_CC])
  135. AC_REQUIRE([grub_I386_ASM_PREFIX_REQUIREMENT])
  136. AC_MSG_CHECKING([for .code16 addr32 assembler support])
  137. AC_CACHE_VAL(grub_cv_i386_asm_addr32,
  138. [cat > conftest.s.in <<\EOF
  139. .code16
  140. l1: @ADDR32@ movb %al, l1
  141. EOF
  142. if test "x$grub_cv_i386_asm_prefix_requirement" = xyes; then
  143. sed -e s/@ADDR32@/addr32/ < conftest.s.in > conftest.s
  144. else
  145. sed -e s/@ADDR32@/addr32\;/ < conftest.s.in > conftest.s
  146. fi
  147. if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
  148. grub_cv_i386_asm_addr32=yes
  149. else
  150. grub_cv_i386_asm_addr32=no
  151. fi
  152. rm -f conftest*])
  153. AC_MSG_RESULT([$grub_cv_i386_asm_addr32])])
  154. dnl check if our compiler is apple cc
  155. dnl because it requires numerous workarounds
  156. AC_DEFUN([grub_apple_cc],
  157. [AC_REQUIRE([AC_PROG_CC])
  158. AC_MSG_CHECKING([whether our compiler is apple cc])
  159. AC_CACHE_VAL(grub_cv_apple_cc,
  160. [if $CC -v 2>&1 | grep "Apple Inc." > /dev/null; then
  161. grub_cv_apple_cc=yes
  162. else
  163. grub_cv_apple_cc=no
  164. fi
  165. ])
  166. AC_MSG_RESULT([$grub_cv_apple_cc])])
  167. dnl check if our target compiler is apple cc
  168. dnl because it requires numerous workarounds
  169. AC_DEFUN([grub_apple_target_cc],
  170. [AC_REQUIRE([AC_PROG_CC])
  171. AC_MSG_CHECKING([whether our target compiler is apple cc])
  172. AC_CACHE_VAL(grub_cv_apple_target_cc,
  173. [if $CC -v 2>&1 | grep "Apple Inc." > /dev/null; then
  174. grub_cv_apple_target_cc=yes
  175. else
  176. grub_cv_apple_target_cc=no
  177. fi
  178. ])
  179. AC_MSG_RESULT([$grub_cv_apple_target_cc])])
  180. dnl Later versions of GAS requires that addr32 and data32 prefixes
  181. dnl appear in the same lines as the instructions they modify, while
  182. dnl earlier versions requires that they appear in separate lines.
  183. AC_DEFUN([grub_I386_ASM_PREFIX_REQUIREMENT],
  184. [AC_REQUIRE([AC_PROG_CC])
  185. AC_MSG_CHECKING(dnl
  186. [whether addr32 must be in the same line as the instruction])
  187. AC_CACHE_VAL(grub_cv_i386_asm_prefix_requirement,
  188. [cat > conftest.s <<\EOF
  189. .code16
  190. l1: addr32 movb %al, l1
  191. EOF
  192. if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
  193. grub_cv_i386_asm_prefix_requirement=yes
  194. else
  195. grub_cv_i386_asm_prefix_requirement=no
  196. fi
  197. rm -f conftest*])
  198. if test "x$grub_cv_i386_asm_prefix_requirement" = xyes; then
  199. grub_tmp_addr32="addr32"
  200. grub_tmp_data32="data32"
  201. else
  202. grub_tmp_addr32="addr32;"
  203. grub_tmp_data32="data32;"
  204. fi
  205. ADDR32=$grub_tmp_addr32
  206. DATA32=$grub_tmp_data32
  207. AC_MSG_RESULT([$grub_cv_i386_asm_prefix_requirement])])
  208. dnl Check what symbol is defined as a bss start symbol.
  209. dnl Written by Michael Hohmoth and Yoshinori K. Okuji.
  210. AC_DEFUN([grub_CHECK_BSS_START_SYMBOL],
  211. [AC_REQUIRE([AC_PROG_CC])
  212. AC_MSG_CHECKING([if __bss_start is defined by the compiler])
  213. AC_CACHE_VAL(grub_cv_check_uscore_uscore_bss_start_symbol,
  214. [AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
  215. [[asm ("incl __bss_start")]])],
  216. [grub_cv_check_uscore_uscore_bss_start_symbol=yes],
  217. [grub_cv_check_uscore_uscore_bss_start_symbol=no])])
  218. AC_MSG_RESULT([$grub_cv_check_uscore_uscore_bss_start_symbol])
  219. AC_MSG_CHECKING([if edata is defined by the compiler])
  220. AC_CACHE_VAL(grub_cv_check_edata_symbol,
  221. [AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
  222. [[asm ("incl edata")]])],
  223. [grub_cv_check_edata_symbol=yes],
  224. [grub_cv_check_edata_symbol=no])])
  225. AC_MSG_RESULT([$grub_cv_check_edata_symbol])
  226. AC_MSG_CHECKING([if _edata is defined by the compiler])
  227. AC_CACHE_VAL(grub_cv_check_uscore_edata_symbol,
  228. [AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
  229. [[asm ("incl _edata")]])],
  230. [grub_cv_check_uscore_edata_symbol=yes],
  231. [grub_cv_check_uscore_edata_symbol=no])])
  232. AC_MSG_RESULT([$grub_cv_check_uscore_edata_symbol])
  233. if test "x$grub_cv_check_uscore_uscore_bss_start_symbol" = xyes; then
  234. BSS_START_SYMBOL=__bss_start
  235. elif test "x$grub_cv_check_edata_symbol" = xyes; then
  236. BSS_START_SYMBOL=edata
  237. elif test "x$grub_cv_check_uscore_edata_symbol" = xyes; then
  238. BSS_START_SYMBOL=_edata
  239. else
  240. AC_MSG_ERROR([none of __bss_start, edata or _edata is defined])
  241. fi
  242. ])
  243. dnl Check what symbol is defined as an end symbol.
  244. dnl Written by Yoshinori K. Okuji.
  245. AC_DEFUN([grub_CHECK_END_SYMBOL],
  246. [AC_REQUIRE([AC_PROG_CC])
  247. AC_MSG_CHECKING([if end is defined by the compiler])
  248. AC_CACHE_VAL(grub_cv_check_end_symbol,
  249. [AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
  250. [[asm ("incl end")]])],
  251. [grub_cv_check_end_symbol=yes],
  252. [grub_cv_check_end_symbol=no])])
  253. AC_MSG_RESULT([$grub_cv_check_end_symbol])
  254. AC_MSG_CHECKING([if _end is defined by the compiler])
  255. AC_CACHE_VAL(grub_cv_check_uscore_end_symbol,
  256. [AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
  257. [[asm ("incl _end")]])],
  258. [grub_cv_check_uscore_end_symbol=yes],
  259. [grub_cv_check_uscore_end_symbol=no])])
  260. AC_MSG_RESULT([$grub_cv_check_uscore_end_symbol])
  261. if test "x$grub_cv_check_end_symbol" = xyes; then
  262. END_SYMBOL=end
  263. elif test "x$grub_cv_check_uscore_end_symbol" = xyes; then
  264. END_SYMBOL=_end
  265. else
  266. AC_MSG_ERROR([neither end nor _end is defined])
  267. fi
  268. ])
  269. dnl Check if the C compiler generates calls to `__enable_execute_stack()'.
  270. AC_DEFUN([grub_CHECK_ENABLE_EXECUTE_STACK],[
  271. AC_MSG_CHECKING([whether `$CC' generates calls to `__enable_execute_stack()'])
  272. AC_LANG_CONFTEST([[
  273. void f (int (*p) (void));
  274. void g (int i)
  275. {
  276. int nestedfunc (void) { return i; }
  277. f (nestedfunc);
  278. }
  279. ]])
  280. if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -S conftest.c]) && test -s conftest.s; then
  281. true
  282. else
  283. AC_MSG_ERROR([${CC-cc} failed to produce assembly code])
  284. fi
  285. if grep __enable_execute_stack conftest.s >/dev/null 2>&1; then
  286. NEED_ENABLE_EXECUTE_STACK=1
  287. AC_MSG_RESULT([yes])
  288. else
  289. NEED_ENABLE_EXECUTE_STACK=0
  290. AC_MSG_RESULT([no])
  291. fi
  292. rm -f conftest*
  293. ])
  294. dnl Check if the C compiler supports `-fstack-protector'.
  295. AC_DEFUN([grub_CHECK_STACK_PROTECTOR],[
  296. [# Smashing stack protector.
  297. ssp_possible=yes]
  298. AC_MSG_CHECKING([whether `$CC' accepts `-fstack-protector'])
  299. # Is this a reliable test case?
  300. AC_LANG_CONFTEST([[void foo (void) { volatile char a[8]; a[3]; }]])
  301. [# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
  302. # `ac_compile' like this correct, after all?
  303. if eval "$ac_compile -S -fstack-protector -o conftest.s" 2> /dev/null; then]
  304. AC_MSG_RESULT([yes])
  305. [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
  306. rm -f conftest.s
  307. else
  308. ssp_possible=no]
  309. AC_MSG_RESULT([no])
  310. [fi]
  311. ])
  312. dnl Check if the C compiler supports `-mstack-arg-probe' (Cygwin).
  313. AC_DEFUN([grub_CHECK_STACK_ARG_PROBE],[
  314. [# Smashing stack arg probe.
  315. sap_possible=yes]
  316. AC_MSG_CHECKING([whether `$CC' accepts `-mstack-arg-probe'])
  317. AC_LANG_CONFTEST([[void foo (void) { volatile char a[8]; a[3]; }]])
  318. [if eval "$ac_compile -S -mstack-arg-probe -o conftest.s" 2> /dev/null; then]
  319. AC_MSG_RESULT([yes])
  320. [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
  321. rm -f conftest.s
  322. else
  323. sap_possible=no]
  324. AC_MSG_RESULT([no])
  325. [fi]
  326. ])
  327. dnl Check if ln can handle directories properly (mingw).
  328. AC_DEFUN([grub_CHECK_LINK_DIR],[
  329. AC_MSG_CHECKING([whether ln can handle directories properly])
  330. [mkdir testdir 2>/dev/null
  331. case $srcdir in
  332. [\\/$]* | ?:[\\/]* ) reldir=$srcdir/include/grub/util ;;
  333. *) reldir=../$srcdir/include/grub/util ;;
  334. esac
  335. if ln -s $reldir testdir/util 2>/dev/null ; then]
  336. AC_MSG_RESULT([yes])
  337. [link_dir=yes
  338. else
  339. link_dir=no]
  340. AC_MSG_RESULT([no])
  341. [fi
  342. rm -rf testdir]
  343. ])
  344. dnl Check if the C compiler supports `-fPIE'.
  345. AC_DEFUN([grub_CHECK_PIE],[
  346. [# Position independent executable.
  347. pie_possible=yes]
  348. AC_MSG_CHECKING([whether `$CC' has `-fPIE' as default])
  349. # Is this a reliable test case?
  350. AC_LANG_CONFTEST([[
  351. #ifdef __PIE__
  352. int main() {
  353. return 0;
  354. }
  355. #else
  356. #error NO __PIE__ DEFINED
  357. #endif
  358. ]])
  359. [# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
  360. # `ac_compile' like this correct, after all?
  361. if eval "$ac_compile -S -o conftest.s" 2> /dev/null; then]
  362. AC_MSG_RESULT([yes])
  363. [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
  364. rm -f conftest.s
  365. else
  366. pie_possible=no]
  367. AC_MSG_RESULT([no])
  368. [fi]
  369. ])