gnulib-common.m4 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077
  1. # gnulib-common.m4 serial 73
  2. dnl Copyright (C) 2007-2022 Free Software Foundation, Inc.
  3. dnl This file is free software; the Free Software Foundation
  4. dnl gives unlimited permission to copy and/or distribute it,
  5. dnl with or without modifications, as long as this notice is preserved.
  6. AC_PREREQ([2.62])
  7. # gl_COMMON
  8. # is expanded unconditionally through gnulib-tool magic.
  9. AC_DEFUN([gl_COMMON], [
  10. dnl Use AC_REQUIRE here, so that the code is expanded once only.
  11. AC_REQUIRE([gl_00GNULIB])
  12. AC_REQUIRE([gl_COMMON_BODY])
  13. AC_REQUIRE([gl_ZZGNULIB])
  14. ])
  15. AC_DEFUN([gl_COMMON_BODY], [
  16. AH_VERBATIM([_GL_GNUC_PREREQ],
  17. [/* True if the compiler says it groks GNU C version MAJOR.MINOR. */
  18. #if defined __GNUC__ && defined __GNUC_MINOR__
  19. # define _GL_GNUC_PREREQ(major, minor) \
  20. ((major) < __GNUC__ + ((minor) <= __GNUC_MINOR__))
  21. #else
  22. # define _GL_GNUC_PREREQ(major, minor) 0
  23. #endif
  24. ])
  25. AH_VERBATIM([_Noreturn],
  26. [/* The _Noreturn keyword of C11. */
  27. #ifndef _Noreturn
  28. # if (defined __cplusplus \
  29. && ((201103 <= __cplusplus && !(__GNUC__ == 4 && __GNUC_MINOR__ == 7)) \
  30. || (defined _MSC_VER && 1900 <= _MSC_VER)) \
  31. && 0)
  32. /* [[noreturn]] is not practically usable, because with it the syntax
  33. extern _Noreturn void func (...);
  34. would not be valid; such a declaration would only be valid with 'extern'
  35. and '_Noreturn' swapped, or without the 'extern' keyword. However, some
  36. AIX system header files and several gnulib header files use precisely
  37. this syntax with 'extern'. */
  38. # define _Noreturn [[noreturn]]
  39. # elif ((!defined __cplusplus || defined __clang__) \
  40. && (201112 <= (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) \
  41. || (!defined __STRICT_ANSI__ \
  42. && (_GL_GNUC_PREREQ (4, 7) \
  43. || (defined __apple_build_version__ \
  44. ? 6000000 <= __apple_build_version__ \
  45. : 3 < __clang_major__ + (5 <= __clang_minor__))))))
  46. /* _Noreturn works as-is. */
  47. # elif _GL_GNUC_PREREQ (2, 8) || defined __clang__ || 0x5110 <= __SUNPRO_C
  48. # define _Noreturn __attribute__ ((__noreturn__))
  49. # elif 1200 <= (defined _MSC_VER ? _MSC_VER : 0)
  50. # define _Noreturn __declspec (noreturn)
  51. # else
  52. # define _Noreturn
  53. # endif
  54. #endif
  55. ])
  56. AH_VERBATIM([isoc99_inline],
  57. [/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports
  58. the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of
  59. earlier versions), but does not display it by setting __GNUC_STDC_INLINE__.
  60. __APPLE__ && __MACH__ test for Mac OS X.
  61. __APPLE_CC__ tests for the Apple compiler and its version.
  62. __STDC_VERSION__ tests for the C99 mode. */
  63. #if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__
  64. # define __GNUC_STDC_INLINE__ 1
  65. #endif])
  66. AH_VERBATIM([attribute],
  67. [/* Attributes. */
  68. #if (defined __has_attribute \
  69. && (!defined __clang_minor__ \
  70. || (defined __apple_build_version__ \
  71. ? 6000000 <= __apple_build_version__ \
  72. : 3 < __clang_major__ + (5 <= __clang_minor__))))
  73. # define _GL_HAS_ATTRIBUTE(attr) __has_attribute (__##attr##__)
  74. #else
  75. # define _GL_HAS_ATTRIBUTE(attr) _GL_ATTR_##attr
  76. # define _GL_ATTR_alloc_size _GL_GNUC_PREREQ (4, 3)
  77. # define _GL_ATTR_always_inline _GL_GNUC_PREREQ (3, 2)
  78. # define _GL_ATTR_artificial _GL_GNUC_PREREQ (4, 3)
  79. # define _GL_ATTR_cold _GL_GNUC_PREREQ (4, 3)
  80. # define _GL_ATTR_const _GL_GNUC_PREREQ (2, 95)
  81. # define _GL_ATTR_deprecated _GL_GNUC_PREREQ (3, 1)
  82. # define _GL_ATTR_diagnose_if 0
  83. # define _GL_ATTR_error _GL_GNUC_PREREQ (4, 3)
  84. # define _GL_ATTR_externally_visible _GL_GNUC_PREREQ (4, 1)
  85. # define _GL_ATTR_fallthrough _GL_GNUC_PREREQ (7, 0)
  86. # define _GL_ATTR_format _GL_GNUC_PREREQ (2, 7)
  87. # define _GL_ATTR_leaf _GL_GNUC_PREREQ (4, 6)
  88. # define _GL_ATTR_malloc _GL_GNUC_PREREQ (3, 0)
  89. # ifdef _ICC
  90. # define _GL_ATTR_may_alias 0
  91. # else
  92. # define _GL_ATTR_may_alias _GL_GNUC_PREREQ (3, 3)
  93. # endif
  94. # define _GL_ATTR_noinline _GL_GNUC_PREREQ (3, 1)
  95. # define _GL_ATTR_nonnull _GL_GNUC_PREREQ (3, 3)
  96. # define _GL_ATTR_nonstring _GL_GNUC_PREREQ (8, 0)
  97. # define _GL_ATTR_nothrow _GL_GNUC_PREREQ (3, 3)
  98. # define _GL_ATTR_packed _GL_GNUC_PREREQ (2, 7)
  99. # define _GL_ATTR_pure _GL_GNUC_PREREQ (2, 96)
  100. # define _GL_ATTR_returns_nonnull _GL_GNUC_PREREQ (4, 9)
  101. # define _GL_ATTR_sentinel _GL_GNUC_PREREQ (4, 0)
  102. # define _GL_ATTR_unused _GL_GNUC_PREREQ (2, 7)
  103. # define _GL_ATTR_warn_unused_result _GL_GNUC_PREREQ (3, 4)
  104. #endif
  105. #ifdef __has_c_attribute
  106. # if ((defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) <= 201710 \
  107. && _GL_GNUC_PREREQ (4, 6))
  108. # pragma GCC diagnostic ignored "-Wpedantic"
  109. # endif
  110. # define _GL_HAS_C_ATTRIBUTE(attr) __has_c_attribute (__##attr##__)
  111. #else
  112. # define _GL_HAS_C_ATTRIBUTE(attr) 0
  113. #endif
  114. ]dnl There is no _GL_ATTRIBUTE_ALIGNED; use stdalign's _Alignas instead.
  115. [
  116. /* _GL_ATTRIBUTE_ALLOC_SIZE ((N)) declares that the Nth argument of the function
  117. is the size of the returned memory block.
  118. _GL_ATTRIBUTE_ALLOC_SIZE ((M, N)) declares that the Mth argument multiplied
  119. by the Nth argument of the function is the size of the returned memory block.
  120. */
  121. /* Applies to: function, pointer to function, function types. */
  122. #if _GL_HAS_ATTRIBUTE (alloc_size)
  123. # define _GL_ATTRIBUTE_ALLOC_SIZE(args) __attribute__ ((__alloc_size__ args))
  124. #else
  125. # define _GL_ATTRIBUTE_ALLOC_SIZE(args)
  126. #endif
  127. /* _GL_ATTRIBUTE_ALWAYS_INLINE tells that the compiler should always inline the
  128. function and report an error if it cannot do so. */
  129. /* Applies to: function. */
  130. #if _GL_HAS_ATTRIBUTE (always_inline)
  131. # define _GL_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((__always_inline__))
  132. #else
  133. # define _GL_ATTRIBUTE_ALWAYS_INLINE
  134. #endif
  135. /* _GL_ATTRIBUTE_ARTIFICIAL declares that the function is not important to show
  136. in stack traces when debugging. The compiler should omit the function from
  137. stack traces. */
  138. /* Applies to: function. */
  139. #if _GL_HAS_ATTRIBUTE (artificial)
  140. # define _GL_ATTRIBUTE_ARTIFICIAL __attribute__ ((__artificial__))
  141. #else
  142. # define _GL_ATTRIBUTE_ARTIFICIAL
  143. #endif
  144. /* _GL_ATTRIBUTE_COLD declares that the function is rarely executed. */
  145. /* Applies to: functions. */
  146. /* Avoid __attribute__ ((cold)) on MinGW; see thread starting at
  147. <https://lists.gnu.org/r/emacs-devel/2019-04/msg01152.html>.
  148. Also, Oracle Studio 12.6 requires 'cold' not '__cold__'. */
  149. #if _GL_HAS_ATTRIBUTE (cold) && !defined __MINGW32__
  150. # ifndef __SUNPRO_C
  151. # define _GL_ATTRIBUTE_COLD __attribute__ ((__cold__))
  152. # else
  153. # define _GL_ATTRIBUTE_COLD __attribute__ ((cold))
  154. # endif
  155. #else
  156. # define _GL_ATTRIBUTE_COLD
  157. #endif
  158. /* _GL_ATTRIBUTE_CONST declares that it is OK for a compiler to omit duplicate
  159. calls to the function with the same arguments.
  160. This attribute is safe for a function that neither depends on nor affects
  161. observable state, and always returns exactly once - e.g., does not loop
  162. forever, and does not call longjmp.
  163. (This attribute is stricter than _GL_ATTRIBUTE_PURE.) */
  164. /* Applies to: functions. */
  165. #if _GL_HAS_ATTRIBUTE (const)
  166. # define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
  167. #else
  168. # define _GL_ATTRIBUTE_CONST
  169. #endif
  170. /* _GL_ATTRIBUTE_DEALLOC (F, I) declares that the function returns pointers
  171. that can be freed by passing them as the Ith argument to the
  172. function F.
  173. _GL_ATTRIBUTE_DEALLOC_FREE declares that the function returns pointers that
  174. can be freed via 'free'; it can be used only after declaring 'free'. */
  175. /* Applies to: functions. Cannot be used on inline functions. */
  176. #if _GL_GNUC_PREREQ (11, 0)
  177. # define _GL_ATTRIBUTE_DEALLOC(f, i) __attribute__ ((__malloc__ (f, i)))
  178. #else
  179. # define _GL_ATTRIBUTE_DEALLOC(f, i)
  180. #endif
  181. /* If gnulib's <string.h> or <wchar.h> has already defined this macro, continue
  182. to use this earlier definition, since <stdlib.h> may not have been included
  183. yet. */
  184. #ifndef _GL_ATTRIBUTE_DEALLOC_FREE
  185. # define _GL_ATTRIBUTE_DEALLOC_FREE _GL_ATTRIBUTE_DEALLOC (free, 1)
  186. #endif
  187. /* _GL_ATTRIBUTE_DEPRECATED: Declares that an entity is deprecated.
  188. The compiler may warn if the entity is used. */
  189. /* Applies to:
  190. - function, variable,
  191. - struct, union, struct/union member,
  192. - enumeration, enumeration item,
  193. - typedef,
  194. in C++ also: namespace, class, template specialization. */
  195. #if _GL_HAS_C_ATTRIBUTE (deprecated)
  196. # define _GL_ATTRIBUTE_DEPRECATED [[__deprecated__]]
  197. #elif _GL_HAS_ATTRIBUTE (deprecated)
  198. # define _GL_ATTRIBUTE_DEPRECATED __attribute__ ((__deprecated__))
  199. #else
  200. # define _GL_ATTRIBUTE_DEPRECATED
  201. #endif
  202. /* _GL_ATTRIBUTE_ERROR(msg) requests an error if a function is called and
  203. the function call is not optimized away.
  204. _GL_ATTRIBUTE_WARNING(msg) requests a warning if a function is called and
  205. the function call is not optimized away. */
  206. /* Applies to: functions. */
  207. #if _GL_HAS_ATTRIBUTE (error)
  208. # define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__error__ (msg)))
  209. # define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__warning__ (msg)))
  210. #elif _GL_HAS_ATTRIBUTE (diagnose_if)
  211. # define _GL_ATTRIBUTE_ERROR(msg) __attribute__ ((__diagnose_if__ (1, msg, "error")))
  212. # define _GL_ATTRIBUTE_WARNING(msg) __attribute__ ((__diagnose_if__ (1, msg, "warning")))
  213. #else
  214. # define _GL_ATTRIBUTE_ERROR(msg)
  215. # define _GL_ATTRIBUTE_WARNING(msg)
  216. #endif
  217. /* _GL_ATTRIBUTE_EXTERNALLY_VISIBLE declares that the entity should remain
  218. visible to debuggers etc., even with '-fwhole-program'. */
  219. /* Applies to: functions, variables. */
  220. #if _GL_HAS_ATTRIBUTE (externally_visible)
  221. # define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE __attribute__ ((externally_visible))
  222. #else
  223. # define _GL_ATTRIBUTE_EXTERNALLY_VISIBLE
  224. #endif
  225. /* _GL_ATTRIBUTE_FALLTHROUGH declares that it is not a programming mistake if
  226. the control flow falls through to the immediately following 'case' or
  227. 'default' label. The compiler should not warn in this case. */
  228. /* Applies to: Empty statement (;), inside a 'switch' statement. */
  229. /* Always expands to something. */
  230. #if _GL_HAS_C_ATTRIBUTE (fallthrough)
  231. # define _GL_ATTRIBUTE_FALLTHROUGH [[__fallthrough__]]
  232. #elif _GL_HAS_ATTRIBUTE (fallthrough)
  233. # define _GL_ATTRIBUTE_FALLTHROUGH __attribute__ ((__fallthrough__))
  234. #else
  235. # define _GL_ATTRIBUTE_FALLTHROUGH ((void) 0)
  236. #endif
  237. /* _GL_ATTRIBUTE_FORMAT ((ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK))
  238. declares that the STRING-INDEXth function argument is a format string of
  239. style ARCHETYPE, which is one of:
  240. printf, gnu_printf
  241. scanf, gnu_scanf,
  242. strftime, gnu_strftime,
  243. strfmon,
  244. or the same thing prefixed and suffixed with '__'.
  245. If FIRST-TO-CHECK is not 0, arguments starting at FIRST-TO_CHECK
  246. are suitable for the format string. */
  247. /* Applies to: functions. */
  248. #if _GL_HAS_ATTRIBUTE (format)
  249. # define _GL_ATTRIBUTE_FORMAT(spec) __attribute__ ((__format__ spec))
  250. #else
  251. # define _GL_ATTRIBUTE_FORMAT(spec)
  252. #endif
  253. /* _GL_ATTRIBUTE_LEAF declares that if the function is called from some other
  254. compilation unit, it executes code from that unit only by return or by
  255. exception handling. This declaration lets the compiler optimize that unit
  256. more aggressively. */
  257. /* Applies to: functions. */
  258. #if _GL_HAS_ATTRIBUTE (leaf)
  259. # define _GL_ATTRIBUTE_LEAF __attribute__ ((__leaf__))
  260. #else
  261. # define _GL_ATTRIBUTE_LEAF
  262. #endif
  263. /* _GL_ATTRIBUTE_MALLOC declares that the function returns a pointer to freshly
  264. allocated memory. */
  265. /* Applies to: functions. */
  266. #if _GL_HAS_ATTRIBUTE (malloc)
  267. # define _GL_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
  268. #else
  269. # define _GL_ATTRIBUTE_MALLOC
  270. #endif
  271. /* _GL_ATTRIBUTE_MAY_ALIAS declares that pointers to the type may point to the
  272. same storage as pointers to other types. Thus this declaration disables
  273. strict aliasing optimization. */
  274. /* Applies to: types. */
  275. /* Oracle Studio 12.6 mishandles may_alias despite __has_attribute OK. */
  276. #if _GL_HAS_ATTRIBUTE (may_alias) && !defined __SUNPRO_C
  277. # define _GL_ATTRIBUTE_MAY_ALIAS __attribute__ ((__may_alias__))
  278. #else
  279. # define _GL_ATTRIBUTE_MAY_ALIAS
  280. #endif
  281. /* _GL_ATTRIBUTE_MAYBE_UNUSED declares that it is not a programming mistake if
  282. the entity is not used. The compiler should not warn if the entity is not
  283. used. */
  284. /* Applies to:
  285. - function, variable,
  286. - struct, union, struct/union member,
  287. - enumeration, enumeration item,
  288. - typedef,
  289. in C++ also: class. */
  290. /* In C++ and C2x, this is spelled [[__maybe_unused__]].
  291. GCC's syntax is __attribute__ ((__unused__)).
  292. clang supports both syntaxes. */
  293. #if _GL_HAS_C_ATTRIBUTE (maybe_unused)
  294. # define _GL_ATTRIBUTE_MAYBE_UNUSED [[__maybe_unused__]]
  295. #else
  296. # define _GL_ATTRIBUTE_MAYBE_UNUSED _GL_ATTRIBUTE_UNUSED
  297. #endif
  298. /* Alternative spelling of this macro, for convenience and for
  299. compatibility with glibc/include/libc-symbols.h. */
  300. #define _GL_UNUSED _GL_ATTRIBUTE_MAYBE_UNUSED
  301. /* Earlier spellings of this macro. */
  302. #define _UNUSED_PARAMETER_ _GL_ATTRIBUTE_MAYBE_UNUSED
  303. /* _GL_ATTRIBUTE_NODISCARD declares that the caller of the function should not
  304. discard the return value. The compiler may warn if the caller does not use
  305. the return value, unless the caller uses something like ignore_value. */
  306. /* Applies to: function, enumeration, class. */
  307. #if _GL_HAS_C_ATTRIBUTE (nodiscard)
  308. # define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]]
  309. #elif _GL_HAS_ATTRIBUTE (warn_unused_result)
  310. # define _GL_ATTRIBUTE_NODISCARD __attribute__ ((__warn_unused_result__))
  311. #else
  312. # define _GL_ATTRIBUTE_NODISCARD
  313. #endif
  314. /* _GL_ATTRIBUTE_NOINLINE tells that the compiler should not inline the
  315. function. */
  316. /* Applies to: functions. */
  317. #if _GL_HAS_ATTRIBUTE (noinline)
  318. # define _GL_ATTRIBUTE_NOINLINE __attribute__ ((__noinline__))
  319. #else
  320. # define _GL_ATTRIBUTE_NOINLINE
  321. #endif
  322. /* _GL_ATTRIBUTE_NONNULL ((N1, N2,...)) declares that the arguments N1, N2,...
  323. must not be NULL.
  324. _GL_ATTRIBUTE_NONNULL () declares that all pointer arguments must not be
  325. null. */
  326. /* Applies to: functions. */
  327. #if _GL_HAS_ATTRIBUTE (nonnull)
  328. # define _GL_ATTRIBUTE_NONNULL(args) __attribute__ ((__nonnull__ args))
  329. #else
  330. # define _GL_ATTRIBUTE_NONNULL(args)
  331. #endif
  332. /* _GL_ATTRIBUTE_NONSTRING declares that the contents of a character array is
  333. not meant to be NUL-terminated. */
  334. /* Applies to: struct/union members and variables that are arrays of element
  335. type '[[un]signed] char'. */
  336. #if _GL_HAS_ATTRIBUTE (nonstring)
  337. # define _GL_ATTRIBUTE_NONSTRING __attribute__ ((__nonstring__))
  338. #else
  339. # define _GL_ATTRIBUTE_NONSTRING
  340. #endif
  341. /* There is no _GL_ATTRIBUTE_NORETURN; use _Noreturn instead. */
  342. /* _GL_ATTRIBUTE_NOTHROW declares that the function does not throw exceptions.
  343. */
  344. /* Applies to: functions. */
  345. #if _GL_HAS_ATTRIBUTE (nothrow) && !defined __cplusplus
  346. # define _GL_ATTRIBUTE_NOTHROW __attribute__ ((__nothrow__))
  347. #else
  348. # define _GL_ATTRIBUTE_NOTHROW
  349. #endif
  350. /* _GL_ATTRIBUTE_PACKED declares:
  351. For struct members: The member has the smallest possible alignment.
  352. For struct, union, class: All members have the smallest possible alignment,
  353. minimizing the memory required. */
  354. /* Applies to: struct members, struct, union,
  355. in C++ also: class. */
  356. #if _GL_HAS_ATTRIBUTE (packed)
  357. # define _GL_ATTRIBUTE_PACKED __attribute__ ((__packed__))
  358. #else
  359. # define _GL_ATTRIBUTE_PACKED
  360. #endif
  361. /* _GL_ATTRIBUTE_PURE declares that It is OK for a compiler to omit duplicate
  362. calls to the function with the same arguments if observable state is not
  363. changed between calls.
  364. This attribute is safe for a function that does not affect
  365. observable state, and always returns exactly once.
  366. (This attribute is looser than _GL_ATTRIBUTE_CONST.) */
  367. /* Applies to: functions. */
  368. #if _GL_HAS_ATTRIBUTE (pure)
  369. # define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
  370. #else
  371. # define _GL_ATTRIBUTE_PURE
  372. #endif
  373. /* _GL_ATTRIBUTE_RETURNS_NONNULL declares that the function's return value is
  374. a non-NULL pointer. */
  375. /* Applies to: functions. */
  376. #if _GL_HAS_ATTRIBUTE (returns_nonnull)
  377. # define _GL_ATTRIBUTE_RETURNS_NONNULL __attribute__ ((__returns_nonnull__))
  378. #else
  379. # define _GL_ATTRIBUTE_RETURNS_NONNULL
  380. #endif
  381. /* _GL_ATTRIBUTE_SENTINEL(pos) declares that the variadic function expects a
  382. trailing NULL argument.
  383. _GL_ATTRIBUTE_SENTINEL () - The last argument is NULL (requires C99).
  384. _GL_ATTRIBUTE_SENTINEL ((N)) - The (N+1)st argument from the end is NULL. */
  385. /* Applies to: functions. */
  386. #if _GL_HAS_ATTRIBUTE (sentinel)
  387. # define _GL_ATTRIBUTE_SENTINEL(pos) __attribute__ ((__sentinel__ pos))
  388. #else
  389. # define _GL_ATTRIBUTE_SENTINEL(pos)
  390. #endif
  391. /* A helper macro. Don't use it directly. */
  392. #if _GL_HAS_ATTRIBUTE (unused)
  393. # define _GL_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
  394. #else
  395. # define _GL_ATTRIBUTE_UNUSED
  396. #endif
  397. ]dnl There is no _GL_ATTRIBUTE_VISIBILITY; see m4/visibility.m4 instead.
  398. [
  399. /* _GL_UNUSED_LABEL; declares that it is not a programming mistake if the
  400. immediately preceding label is not used. The compiler should not warn
  401. if the label is not used. */
  402. /* Applies to: label (both in C and C++). */
  403. /* Note that g++ < 4.5 does not support the '__attribute__ ((__unused__)) ;'
  404. syntax. But clang does. */
  405. #if !(defined __cplusplus && !_GL_GNUC_PREREQ (4, 5)) || defined __clang__
  406. # define _GL_UNUSED_LABEL _GL_ATTRIBUTE_UNUSED
  407. #else
  408. # define _GL_UNUSED_LABEL
  409. #endif
  410. ])
  411. AH_VERBATIM([async_safe],
  412. [/* The _GL_ASYNC_SAFE marker should be attached to functions that are
  413. signal handlers (for signals other than SIGABRT, SIGPIPE) or can be
  414. invoked from such signal handlers. Such functions have some restrictions:
  415. * All functions that it calls should be marked _GL_ASYNC_SAFE as well,
  416. or should be listed as async-signal-safe in POSIX
  417. <https://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04>
  418. section 2.4.3. Note that malloc(), sprintf(), and fwrite(), in
  419. particular, are NOT async-signal-safe.
  420. * All memory locations (variables and struct fields) that these functions
  421. access must be marked 'volatile'. This holds for both read and write
  422. accesses. Otherwise the compiler might optimize away stores to and
  423. reads from such locations that occur in the program, depending on its
  424. data flow analysis. For example, when the program contains a loop
  425. that is intended to inspect a variable set from within a signal handler
  426. while (!signal_occurred)
  427. ;
  428. the compiler is allowed to transform this into an endless loop if the
  429. variable 'signal_occurred' is not declared 'volatile'.
  430. Additionally, recall that:
  431. * A signal handler should not modify errno (except if it is a handler
  432. for a fatal signal and ends by raising the same signal again, thus
  433. provoking the termination of the process). If it invokes a function
  434. that may clobber errno, it needs to save and restore the value of
  435. errno. */
  436. #define _GL_ASYNC_SAFE
  437. ])
  438. AH_VERBATIM([micro_optimizations],
  439. [/* _GL_CMP (n1, n2) performs a three-valued comparison on n1 vs. n2, where
  440. n1 and n2 are expressions without side effects, that evaluate to real
  441. numbers (excluding NaN).
  442. It returns
  443. 1 if n1 > n2
  444. 0 if n1 == n2
  445. -1 if n1 < n2
  446. The naïve code (n1 > n2 ? 1 : n1 < n2 ? -1 : 0) produces a conditional
  447. jump with nearly all GCC versions up to GCC 10.
  448. This variant (n1 < n2 ? -1 : n1 > n2) produces a conditional with many
  449. GCC versions up to GCC 9.
  450. The better code (n1 > n2) - (n1 < n2) from Hacker's Delight § 2-9
  451. avoids conditional jumps in all GCC versions >= 3.4. */
  452. #define _GL_CMP(n1, n2) (((n1) > (n2)) - ((n1) < (n2)))
  453. ])
  454. dnl Hint which direction to take regarding cross-compilation guesses:
  455. dnl When a user installs a program on a platform they are not intimately
  456. dnl familiar with, --enable-cross-guesses=conservative is the appropriate
  457. dnl choice. It implements the "If we don't know, assume the worst" principle.
  458. dnl However, when an operating system developer (on a platform which is not
  459. dnl yet known to gnulib) builds packages for their platform, they want to
  460. dnl expose, not hide, possible platform bugs; in this case,
  461. dnl --enable-cross-guesses=risky is the appropriate choice.
  462. dnl Sets the variables
  463. dnl gl_cross_guess_normal (to be used when 'yes' is good and 'no' is bad),
  464. dnl gl_cross_guess_inverted (to be used when 'no' is good and 'yes' is bad).
  465. AC_ARG_ENABLE([cross-guesses],
  466. [AS_HELP_STRING([--enable-cross-guesses={conservative|risky}],
  467. [specify policy for cross-compilation guesses])],
  468. [if test "x$enableval" != xconservative && test "x$enableval" != xrisky; then
  469. AC_MSG_WARN([invalid argument supplied to --enable-cross-guesses])
  470. enableval=conservative
  471. fi
  472. gl_cross_guesses="$enableval"],
  473. [gl_cross_guesses=conservative])
  474. if test $gl_cross_guesses = risky; then
  475. gl_cross_guess_normal="guessing yes"
  476. gl_cross_guess_inverted="guessing no"
  477. else
  478. gl_cross_guess_normal="guessing no"
  479. gl_cross_guess_inverted="guessing yes"
  480. fi
  481. dnl Preparation for running test programs:
  482. dnl Tell glibc to write diagnostics from -D_FORTIFY_SOURCE=2 to stderr, not
  483. dnl to /dev/tty, so they can be redirected to log files. Such diagnostics
  484. dnl arise e.g., in the macros gl_PRINTF_DIRECTIVE_N, gl_SNPRINTF_DIRECTIVE_N.
  485. LIBC_FATAL_STDERR_=1
  486. export LIBC_FATAL_STDERR_
  487. ])
  488. # gl_MODULE_INDICATOR_INIT_VARIABLE([variablename])
  489. # gl_MODULE_INDICATOR_INIT_VARIABLE([variablename], [initialvalue])
  490. # initializes the shell variable that indicates the presence of the given module
  491. # as a C preprocessor expression.
  492. AC_DEFUN([gl_MODULE_INDICATOR_INIT_VARIABLE],
  493. [
  494. GL_MODULE_INDICATOR_PREFIX[]_[$1]=m4_if([$2], , [0], [$2])
  495. AC_SUBST(GL_MODULE_INDICATOR_PREFIX[]_[$1])
  496. ])
  497. # gl_MODULE_INDICATOR_CONDITION
  498. # expands to a C preprocessor expression that evaluates to 1 or 0, depending
  499. # whether a gnulib module that has been requested shall be considered present
  500. # or not.
  501. m4_define([gl_MODULE_INDICATOR_CONDITION], [1])
  502. # gl_MODULE_INDICATOR_SET_VARIABLE([modulename])
  503. # sets the shell variable that indicates the presence of the given module to
  504. # a C preprocessor expression that will evaluate to 1.
  505. AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE],
  506. [
  507. gl_MODULE_INDICATOR_SET_VARIABLE_AUX(
  508. [GL_MODULE_INDICATOR_PREFIX[]_GNULIB_[]m4_translit([[$1]],
  509. [abcdefghijklmnopqrstuvwxyz./-],
  510. [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])],
  511. [gl_MODULE_INDICATOR_CONDITION])
  512. ])
  513. # gl_MODULE_INDICATOR_SET_VARIABLE_AUX([variable])
  514. # modifies the shell variable to include the gl_MODULE_INDICATOR_CONDITION.
  515. # The shell variable's value is a C preprocessor expression that evaluates
  516. # to 0 or 1.
  517. AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX],
  518. [
  519. m4_if(m4_defn([gl_MODULE_INDICATOR_CONDITION]), [1],
  520. [
  521. dnl Simplify the expression VALUE || 1 to 1.
  522. $1=1
  523. ],
  524. [gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([$1],
  525. [gl_MODULE_INDICATOR_CONDITION])])
  526. ])
  527. # gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([variable], [condition])
  528. # modifies the shell variable to include the given condition. The shell
  529. # variable's value is a C preprocessor expression that evaluates to 0 or 1.
  530. AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR],
  531. [
  532. dnl Simplify the expression 1 || CONDITION to 1.
  533. if test "$[]$1" != 1; then
  534. dnl Simplify the expression 0 || CONDITION to CONDITION.
  535. if test "$[]$1" = 0; then
  536. $1=$2
  537. else
  538. $1="($[]$1 || $2)"
  539. fi
  540. fi
  541. ])
  542. # gl_MODULE_INDICATOR([modulename])
  543. # defines a C macro indicating the presence of the given module
  544. # in a location where it can be used.
  545. # | Value | Value |
  546. # | in lib/ | in tests/ |
  547. # --------------------------------------------+---------+-----------+
  548. # Module present among main modules: | 1 | 1 |
  549. # --------------------------------------------+---------+-----------+
  550. # Module present among tests-related modules: | 0 | 1 |
  551. # --------------------------------------------+---------+-----------+
  552. # Module not present at all: | 0 | 0 |
  553. # --------------------------------------------+---------+-----------+
  554. AC_DEFUN([gl_MODULE_INDICATOR],
  555. [
  556. AC_DEFINE_UNQUOTED([GNULIB_]m4_translit([[$1]],
  557. [abcdefghijklmnopqrstuvwxyz./-],
  558. [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]),
  559. [gl_MODULE_INDICATOR_CONDITION],
  560. [Define to a C preprocessor expression that evaluates to 1 or 0,
  561. depending whether the gnulib module $1 shall be considered present.])
  562. ])
  563. # gl_MODULE_INDICATOR_FOR_TESTS([modulename])
  564. # defines a C macro indicating the presence of the given module
  565. # in lib or tests. This is useful to determine whether the module
  566. # should be tested.
  567. # | Value | Value |
  568. # | in lib/ | in tests/ |
  569. # --------------------------------------------+---------+-----------+
  570. # Module present among main modules: | 1 | 1 |
  571. # --------------------------------------------+---------+-----------+
  572. # Module present among tests-related modules: | 1 | 1 |
  573. # --------------------------------------------+---------+-----------+
  574. # Module not present at all: | 0 | 0 |
  575. # --------------------------------------------+---------+-----------+
  576. AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS],
  577. [
  578. AC_DEFINE([GNULIB_TEST_]m4_translit([[$1]],
  579. [abcdefghijklmnopqrstuvwxyz./-],
  580. [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), [1],
  581. [Define to 1 when the gnulib module $1 should be tested.])
  582. ])
  583. # gl_ASSERT_NO_GNULIB_POSIXCHECK
  584. # asserts that there will never be a need to #define GNULIB_POSIXCHECK.
  585. # and thereby enables an optimization of configure and config.h.
  586. # Used by Emacs.
  587. AC_DEFUN([gl_ASSERT_NO_GNULIB_POSIXCHECK],
  588. [
  589. dnl Override gl_WARN_ON_USE_PREPARE.
  590. dnl But hide this definition from 'aclocal'.
  591. AC_DEFUN([gl_W][ARN_ON_USE_PREPARE], [])
  592. ])
  593. # gl_ASSERT_NO_GNULIB_TESTS
  594. # asserts that there will be no gnulib tests in the scope of the configure.ac
  595. # and thereby enables an optimization of config.h.
  596. # Used by Emacs.
  597. AC_DEFUN([gl_ASSERT_NO_GNULIB_TESTS],
  598. [
  599. dnl Override gl_MODULE_INDICATOR_FOR_TESTS.
  600. AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS], [])
  601. ])
  602. # Test whether <features.h> exists.
  603. # Set HAVE_FEATURES_H.
  604. AC_DEFUN([gl_FEATURES_H],
  605. [
  606. AC_CHECK_HEADERS_ONCE([features.h])
  607. if test $ac_cv_header_features_h = yes; then
  608. HAVE_FEATURES_H=1
  609. else
  610. HAVE_FEATURES_H=0
  611. fi
  612. AC_SUBST([HAVE_FEATURES_H])
  613. ])
  614. # gl_PROG_CC_C99
  615. # Modifies the value of the shell variable CC in an attempt to make $CC
  616. # understand ISO C99 source code.
  617. AC_DEFUN([gl_PROG_CC_C99],
  618. [
  619. dnl Just use AC_PROG_CC_C99.
  620. dnl When AC_PROG_CC_C99 and AC_PROG_CC_STDC are used together, the substituted
  621. dnl value of CC will contain the C99 enabling options twice. But this is only
  622. dnl a cosmetic problem.
  623. dnl With Autoconf >= 2.70, use AC_PROG_CC since it implies AC_PROG_CC_C99;
  624. dnl this avoids a "warning: The macro `AC_PROG_CC_C99' is obsolete."
  625. m4_version_prereq([2.70],
  626. [AC_REQUIRE([AC_PROG_CC])],
  627. [AC_REQUIRE([AC_PROG_CC_C99])])
  628. ])
  629. # gl_PROG_AR_RANLIB
  630. # Determines the values for AR, ARFLAGS, RANLIB that fit with the compiler.
  631. # The user can set the variables AR, ARFLAGS, RANLIB if he wants to override
  632. # the values.
  633. AC_DEFUN([gl_PROG_AR_RANLIB],
  634. [
  635. dnl Minix 3 comes with two toolchains: The Amsterdam Compiler Kit compiler
  636. dnl as "cc", and GCC as "gcc". They have different object file formats and
  637. dnl library formats. In particular, the GNU binutils programs ar and ranlib
  638. dnl produce libraries that work only with gcc, not with cc.
  639. AC_REQUIRE([AC_PROG_CC])
  640. dnl The '][' hides this use from 'aclocal'.
  641. AC_BEFORE([$0], [A][M_PROG_AR])
  642. AC_CACHE_CHECK([for Minix Amsterdam compiler], [gl_cv_c_amsterdam_compiler],
  643. [
  644. AC_EGREP_CPP([Amsterdam],
  645. [
  646. #ifdef __ACK__
  647. Amsterdam
  648. #endif
  649. ],
  650. [gl_cv_c_amsterdam_compiler=yes],
  651. [gl_cv_c_amsterdam_compiler=no])
  652. ])
  653. dnl Don't compete with AM_PROG_AR's decision about AR/ARFLAGS if we are not
  654. dnl building with __ACK__.
  655. if test $gl_cv_c_amsterdam_compiler = yes; then
  656. if test -z "$AR"; then
  657. AR='cc -c.a'
  658. fi
  659. if test -z "$ARFLAGS"; then
  660. ARFLAGS='-o'
  661. fi
  662. else
  663. dnl AM_PROG_AR was added in automake v1.11.2. AM_PROG_AR does not AC_SUBST
  664. dnl ARFLAGS variable (it is filed into Makefile.in directly by automake
  665. dnl script on-demand, if not specified by ./configure of course).
  666. dnl Don't AC_REQUIRE the AM_PROG_AR otherwise the code for __ACK__ above
  667. dnl will be ignored. Also, pay attention to call AM_PROG_AR in else block
  668. dnl because AM_PROG_AR is written so it could re-set AR variable even for
  669. dnl __ACK__. It may seem like its easier to avoid calling the macro here,
  670. dnl but we need to AC_SUBST both AR/ARFLAGS (thus those must have some good
  671. dnl default value and automake should usually know them).
  672. dnl
  673. dnl The '][' hides this use from 'aclocal'.
  674. m4_ifdef([A][M_PROG_AR], [A][M_PROG_AR], [:])
  675. fi
  676. dnl In case the code above has not helped with setting AR/ARFLAGS, use
  677. dnl Automake-documented default values for AR and ARFLAGS, but prefer
  678. dnl ${host}-ar over ar (useful for cross-compiling).
  679. AC_CHECK_TOOL([AR], [ar], [ar])
  680. if test -z "$ARFLAGS"; then
  681. ARFLAGS='cr'
  682. fi
  683. AC_SUBST([AR])
  684. AC_SUBST([ARFLAGS])
  685. if test -z "$RANLIB"; then
  686. if test $gl_cv_c_amsterdam_compiler = yes; then
  687. RANLIB=':'
  688. else
  689. dnl Use the ranlib program if it is available.
  690. AC_PROG_RANLIB
  691. fi
  692. fi
  693. AC_SUBST([RANLIB])
  694. ])
  695. # AC_C_RESTRICT
  696. # This definition is copied from post-2.70 Autoconf and overrides the
  697. # AC_C_RESTRICT macro from autoconf 2.60..2.70.
  698. m4_version_prereq([2.70.1], [], [
  699. AC_DEFUN([AC_C_RESTRICT],
  700. [AC_CACHE_CHECK([for C/C++ restrict keyword], [ac_cv_c_restrict],
  701. [ac_cv_c_restrict=no
  702. # Put '__restrict__' first, to avoid problems with glibc and non-GCC; see:
  703. # https://lists.gnu.org/archive/html/bug-autoconf/2016-02/msg00006.html
  704. # Put 'restrict' last, because C++ lacks it.
  705. for ac_kw in __restrict__ __restrict _Restrict restrict; do
  706. AC_COMPILE_IFELSE(
  707. [AC_LANG_PROGRAM(
  708. [[typedef int *int_ptr;
  709. int foo (int_ptr $ac_kw ip) { return ip[0]; }
  710. int bar (int [$ac_kw]); /* Catch GCC bug 14050. */
  711. int bar (int ip[$ac_kw]) { return ip[0]; }
  712. ]],
  713. [[int s[1];
  714. int *$ac_kw t = s;
  715. t[0] = 0;
  716. return foo (t) + bar (t);
  717. ]])],
  718. [ac_cv_c_restrict=$ac_kw])
  719. test "$ac_cv_c_restrict" != no && break
  720. done
  721. ])
  722. AH_VERBATIM([restrict],
  723. [/* Define to the equivalent of the C99 'restrict' keyword, or to
  724. nothing if this is not supported. Do not define if restrict is
  725. supported only directly. */
  726. #undef restrict
  727. /* Work around a bug in older versions of Sun C++, which did not
  728. #define __restrict__ or support _Restrict or __restrict__
  729. even though the corresponding Sun C compiler ended up with
  730. "#define restrict _Restrict" or "#define restrict __restrict__"
  731. in the previous line. This workaround can be removed once
  732. we assume Oracle Developer Studio 12.5 (2016) or later. */
  733. #if defined __SUNPRO_CC && !defined __RESTRICT && !defined __restrict__
  734. # define _Restrict
  735. # define __restrict__
  736. #endif])
  737. case $ac_cv_c_restrict in
  738. restrict) ;;
  739. no) AC_DEFINE([restrict], []) ;;
  740. *) AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;;
  741. esac
  742. ])# AC_C_RESTRICT
  743. ])
  744. # gl_BIGENDIAN
  745. # is like AC_C_BIGENDIAN, except that it can be AC_REQUIREd.
  746. # Note that AC_REQUIRE([AC_C_BIGENDIAN]) does not work reliably because some
  747. # macros invoke AC_C_BIGENDIAN with arguments.
  748. AC_DEFUN([gl_BIGENDIAN],
  749. [
  750. AC_C_BIGENDIAN
  751. ])
  752. # A temporary file descriptor.
  753. # Must be less than 10, because dash 0.5.8 does not support redirections
  754. # with multi-digit file descriptors.
  755. m4_define([GL_TMP_FD], 9)
  756. # gl_SILENT(command)
  757. # executes command, but without the normal configure output.
  758. # This is useful when you want to invoke AC_CACHE_CHECK (or AC_CHECK_FUNC etc.)
  759. # inside another AC_CACHE_CHECK.
  760. AC_DEFUN([gl_SILENT],
  761. [
  762. exec GL_TMP_FD>&AS_MESSAGE_FD AS_MESSAGE_FD>/dev/null
  763. $1
  764. exec AS_MESSAGE_FD>&GL_TMP_FD GL_TMP_FD>&-
  765. ])
  766. # gl_CACHE_VAL_SILENT(cache-id, command-to-set-it)
  767. # is like AC_CACHE_VAL(cache-id, command-to-set-it), except that it does not
  768. # output a spurious "(cached)" mark in the midst of other configure output.
  769. # This macro should be used instead of AC_CACHE_VAL when it is not surrounded
  770. # by an AC_MSG_CHECKING/AC_MSG_RESULT pair.
  771. AC_DEFUN([gl_CACHE_VAL_SILENT],
  772. [
  773. gl_SILENT([
  774. AC_CACHE_VAL([$1], [$2])
  775. ])
  776. ])
  777. # gl_CONDITIONAL(conditional, condition)
  778. # is like AM_CONDITIONAL(conditional, condition), except that it does not
  779. # produce an error
  780. # configure: error: conditional "..." was never defined.
  781. # Usually this means the macro was only invoked conditionally.
  782. # when only invoked conditionally. Instead, in that case, both the _TRUE
  783. # and the _FALSE case are disabled.
  784. AC_DEFUN([gl_CONDITIONAL],
  785. [
  786. pushdef([AC_CONFIG_COMMANDS_PRE], [:])dnl
  787. AM_CONDITIONAL([$1], [$2])
  788. popdef([AC_CONFIG_COMMANDS_PRE])dnl
  789. if test -z "${[$1]_TRUE}" && test -z "${[$1]_FALSE}"; then
  790. [$1]_TRUE='#'
  791. [$1]_FALSE='#'
  792. fi
  793. ])
  794. # gl_CC_ALLOW_WARNINGS
  795. # sets and substitutes a variable GL_CFLAG_ALLOW_WARNINGS, to a $(CC) option
  796. # that reverts a preceding '-Werror' option, if available.
  797. # This is expected to be '-Wno-error' on gcc, clang (except clang/MSVC), xlclang
  798. # and empty otherwise.
  799. AC_DEFUN([gl_CC_ALLOW_WARNINGS],
  800. [
  801. AC_REQUIRE([AC_PROG_CC])
  802. AC_CACHE_CHECK([for C compiler option to allow warnings],
  803. [gl_cv_cc_wallow],
  804. [rm -f conftest*
  805. echo 'int dummy;' > conftest.c
  806. AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -c conftest.c 2>conftest1.err]) >/dev/null
  807. AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -Wno-error -c conftest.c 2>conftest2.err]) >/dev/null
  808. dnl Test the number of error output lines, because AIX xlc accepts the
  809. dnl option '-Wno-error', just to produce a warning
  810. dnl "Option -Wno-error was incorrectly specified. The option will be ignored."
  811. dnl afterwards.
  812. if test $? = 0 && test `wc -l < conftest1.err` = `wc -l < conftest2.err`; then
  813. gl_cv_cc_wallow='-Wno-error'
  814. else
  815. gl_cv_cc_wallow=none
  816. fi
  817. rm -f conftest*
  818. ])
  819. case "$gl_cv_cc_wallow" in
  820. none) GL_CFLAG_ALLOW_WARNINGS='' ;;
  821. *) GL_CFLAG_ALLOW_WARNINGS="$gl_cv_cc_wallow" ;;
  822. esac
  823. AC_SUBST([GL_CFLAG_ALLOW_WARNINGS])
  824. ])
  825. # gl_CXX_ALLOW_WARNINGS
  826. # sets and substitutes a variable GL_CXXFLAG_ALLOW_WARNINGS, to a $(CC) option
  827. # that reverts a preceding '-Werror' option, if available.
  828. AC_DEFUN([gl_CXX_ALLOW_WARNINGS],
  829. [
  830. dnl Requires AC_PROG_CXX or gl_PROG_ANSI_CXX.
  831. if test -n "$CXX" && test "$CXX" != no; then
  832. AC_CACHE_CHECK([for C++ compiler option to allow warnings],
  833. [gl_cv_cxx_wallow],
  834. [rm -f conftest*
  835. echo 'int dummy;' > conftest.cc
  836. AC_TRY_COMMAND([${CXX-c++} $CXXFLAGS $CPPFLAGS -c conftest.cc 2>conftest1.err]) >/dev/null
  837. AC_TRY_COMMAND([${CXX-c++} $CXXFLAGS $CPPFLAGS -Wno-error -c conftest.cc 2>conftest2.err]) >/dev/null
  838. dnl Test the number of error output lines, because AIX xlC accepts the
  839. dnl option '-Wno-error', just to produce a warning
  840. dnl "Option -Wno-error was incorrectly specified. The option will be ignored."
  841. dnl afterwards.
  842. if test $? = 0 && test `wc -l < conftest1.err` = `wc -l < conftest2.err`; then
  843. gl_cv_cxx_wallow='-Wno-error'
  844. else
  845. gl_cv_cxx_wallow=none
  846. fi
  847. rm -f conftest*
  848. ])
  849. case "$gl_cv_cxx_wallow" in
  850. none) GL_CXXFLAG_ALLOW_WARNINGS='' ;;
  851. *) GL_CXXFLAG_ALLOW_WARNINGS="$gl_cv_cxx_wallow" ;;
  852. esac
  853. else
  854. GL_CXXFLAG_ALLOW_WARNINGS=''
  855. fi
  856. AC_SUBST([GL_CXXFLAG_ALLOW_WARNINGS])
  857. ])
  858. # gl_CC_GNULIB_WARNINGS
  859. # sets and substitutes a variable GL_CFLAG_GNULIB_WARNINGS, to a $(CC) option
  860. # set that enables or disables warnings as suitable for the Gnulib coding style.
  861. AC_DEFUN([gl_CC_GNULIB_WARNINGS],
  862. [
  863. AC_REQUIRE([gl_CC_ALLOW_WARNINGS])
  864. dnl Assume that the compiler supports -Wno-* options only if it also supports
  865. dnl -Wno-error.
  866. GL_CFLAG_GNULIB_WARNINGS=''
  867. if test -n "$GL_CFLAG_ALLOW_WARNINGS"; then
  868. dnl Enable these warning options:
  869. dnl
  870. dnl GCC clang
  871. dnl -Wno-cast-qual >= 3 >= 3.9
  872. dnl -Wno-conversion >= 3 >= 3.9
  873. dnl -Wno-float-conversion >= 4.9 >= 3.9
  874. dnl -Wno-float-equal >= 3 >= 3.9
  875. dnl -Wimplicit-fallthrough >= 7 >= 3.9
  876. dnl -Wno-pedantic >= 4.8 >= 3.9
  877. dnl -Wno-sign-compare >= 3 >= 3.9
  878. dnl -Wno-sign-conversion >= 4.3 >= 3.9
  879. dnl -Wno-type-limits >= 4.3 >= 3.9
  880. dnl -Wno-undef >= 3 >= 3.9
  881. dnl -Wno-unsuffixed-float-constants >= 4.5
  882. dnl -Wno-unused-function >= 3 >= 3.9
  883. dnl -Wno-unused-parameter >= 3 >= 3.9
  884. dnl
  885. cat > conftest.c <<\EOF
  886. #if __GNUC__ >= 3 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
  887. -Wno-cast-qual
  888. -Wno-conversion
  889. -Wno-float-equal
  890. -Wno-sign-compare
  891. -Wno-undef
  892. -Wno-unused-function
  893. -Wno-unused-parameter
  894. #endif
  895. #if __GNUC__ + (__GNUC_MINOR__ >= 9) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
  896. -Wno-float-conversion
  897. #endif
  898. #if __GNUC__ >= 7 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
  899. -Wimplicit-fallthrough
  900. #endif
  901. #if __GNUC__ + (__GNUC_MINOR__ >= 8) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
  902. -Wno-pedantic
  903. #endif
  904. #if __GNUC__ + (__GNUC_MINOR__ >= 3) > 4 || (__clang_major__ + (__clang_minor__ >= 9) > 3)
  905. -Wno-sign-conversion
  906. -Wno-type-limits
  907. #endif
  908. #if __GNUC__ + (__GNUC_MINOR__ >= 5) > 4
  909. -Wno-unsuffixed-float-constants
  910. #endif
  911. EOF
  912. gl_command="$CC $CFLAGS $CPPFLAGS -E conftest.c > conftest.out"
  913. if AC_TRY_EVAL([gl_command]); then
  914. gl_options=`grep -v '#' conftest.out`
  915. for word in $gl_options; do
  916. GL_CFLAG_GNULIB_WARNINGS="$GL_CFLAG_GNULIB_WARNINGS $word"
  917. done
  918. fi
  919. rm -f conftest.c conftest.out
  920. fi
  921. AC_SUBST([GL_CFLAG_GNULIB_WARNINGS])
  922. ])
  923. dnl gl_CONDITIONAL_HEADER([foo.h])
  924. dnl takes a shell variable GL_GENERATE_FOO_H (with value true or false) as input
  925. dnl and produces
  926. dnl - an AC_SUBSTed variable FOO_H that is either a file name or empty, based
  927. dnl on whether GL_GENERATE_FOO_H is true or false,
  928. dnl - an Automake conditional GL_GENERATE_FOO_H that evaluates to the value of
  929. dnl the shell variable GL_GENERATE_FOO_H.
  930. AC_DEFUN([gl_CONDITIONAL_HEADER],
  931. [
  932. m4_pushdef([gl_header_name], AS_TR_SH(m4_toupper($1)))
  933. m4_pushdef([gl_generate_var], [GL_GENERATE_]AS_TR_SH(m4_toupper($1)))
  934. m4_pushdef([gl_generate_cond], [GL_GENERATE_]AS_TR_SH(m4_toupper($1)))
  935. case "$gl_generate_var" in
  936. false) gl_header_name='' ;;
  937. true)
  938. dnl It is OK to use a .h file in lib/ from within tests/, but not vice
  939. dnl versa.
  940. if test -z "$gl_header_name"; then
  941. gl_header_name="${gl_source_base_prefix}$1"
  942. fi
  943. ;;
  944. *) echo "*** gl_generate_var is not set correctly" 1>&2; exit 1 ;;
  945. esac
  946. AC_SUBST(gl_header_name)
  947. gl_CONDITIONAL(gl_generate_cond, [$gl_generate_var])
  948. m4_popdef([gl_generate_cond])
  949. m4_popdef([gl_generate_var])
  950. m4_popdef([gl_header_name])
  951. ])
  952. dnl Expands to some code for use in .c programs that, on native Windows, defines
  953. dnl the Microsoft deprecated alias function names to the underscore-prefixed
  954. dnl actual function names. With this macro, these function names are available
  955. dnl without linking with '-loldnames' and without generating warnings.
  956. dnl Usage: Use it after all system header files are included.
  957. dnl #include <...>
  958. dnl #include <...>
  959. dnl ]GL_MDA_DEFINES[
  960. dnl ...
  961. AC_DEFUN([GL_MDA_DEFINES],[
  962. AC_REQUIRE([_GL_MDA_DEFINES])
  963. [$gl_mda_defines]
  964. ])
  965. AC_DEFUN([_GL_MDA_DEFINES],
  966. [gl_mda_defines='
  967. #if defined _WIN32 && !defined __CYGWIN__
  968. #define access _access
  969. #define chdir _chdir
  970. #define chmod _chmod
  971. #define close _close
  972. #define creat _creat
  973. #define dup _dup
  974. #define dup2 _dup2
  975. #define ecvt _ecvt
  976. #define execl _execl
  977. #define execle _execle
  978. #define execlp _execlp
  979. #define execv _execv
  980. #define execve _execve
  981. #define execvp _execvp
  982. #define execvpe _execvpe
  983. #define fcloseall _fcloseall
  984. #define fcvt _fcvt
  985. #define fdopen _fdopen
  986. #define fileno _fileno
  987. #define gcvt _gcvt
  988. #define getcwd _getcwd
  989. #define getpid _getpid
  990. #define getw _getw
  991. #define isatty _isatty
  992. #define j0 _j0
  993. #define j1 _j1
  994. #define jn _jn
  995. #define lfind _lfind
  996. #define lsearch _lsearch
  997. #define lseek _lseek
  998. #define memccpy _memccpy
  999. #define mkdir _mkdir
  1000. #define mktemp _mktemp
  1001. #define open _open
  1002. #define putenv _putenv
  1003. #define putw _putw
  1004. #define read _read
  1005. #define rmdir _rmdir
  1006. #define strdup _strdup
  1007. #define swab _swab
  1008. #define tempnam _tempnam
  1009. #define tzset _tzset
  1010. #define umask _umask
  1011. #define unlink _unlink
  1012. #define utime _utime
  1013. #define wcsdup _wcsdup
  1014. #define write _write
  1015. #define y0 _y0
  1016. #define y1 _y1
  1017. #define yn _yn
  1018. #endif
  1019. '
  1020. ])