logo

utils-std

Collection of commonly available Unix tools git clone https://anongit.hacktivis.me/git/utils-std.git/

configure (6384B)


  1. #!/bin/sh
  2. # SPDX-FileCopyrightText: 2017 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
  3. # SPDX-License-Identifier: MPL-2.0
  4. target_filter='-e cmd/expr.tab'
  5. usage() {
  6. cat <<END
  7. Usage: [variables] configure [variables]
  8. Variables:
  9. PREFIX=DIR
  10. BINDIR=DIR
  11. SHELLDIR=DIR
  12. PERLDIR=DIR
  13. MANDIR=DIR
  14. CROSS_COMPILE=TRIPLE
  15. MSGFMT=BIN
  16. AR=BIN
  17. CC=BIN
  18. YACC=BIN
  19. MAKE=BIN
  20. M4=BIN
  21. MANDOC=BIN
  22. GCOV=BIN
  23. CRAM=BIN
  24. CFLAGS=OPTIONS
  25. ARFLAGS=OPTIONS
  26. LDFLAGS=OPTIONS
  27. LDSTATIC=OPTIONS
  28. EXTRA_CFLAGS=OPTIONS
  29. Variables are set in the following order: Default, Environment, Arguments
  30. Dependencies: See the README.md file
  31. END
  32. }
  33. is_ok() {
  34. status="$?"
  35. if test $status -eq 0; then
  36. printf " OK\n"
  37. else
  38. printf " FAIL\n"
  39. fi
  40. return $status
  41. }
  42. or_die() {
  43. is_ok || exit 1
  44. }
  45. gen_targets() {
  46. printf 'EXE = '
  47. printf '%s\n ' cmd/*.c cmd/*.y | grep -v -F ${target_filter} | sed -e 's;\.c$;;' -e 's;\.y$;;' | tr -d '\n'
  48. echo
  49. printf 'MAN1SO = '
  50. printf '%s\n' cmd/*.1.in \
  51. | grep -v -F ${target_filter} \
  52. | sed -e 's;\.in$;;' -e 's;^cmd/;build/cmd/;' \
  53. | tr '\n' ' '
  54. echo
  55. printf 'MAN1 = ${MAN1SO} '
  56. printf '%s\n ' cmd/*.1 | grep -v -F ${target_filter} | tr -d '\n'
  57. echo
  58. printf 'LIBUTILS_C = '
  59. echo libutils/*.c
  60. echo
  61. printf 'LIBUTILS_H = '
  62. echo libutils/*.h
  63. echo
  64. }
  65. cpp_define() {
  66. printf '#define %s\n' "$*" >> config.h
  67. }
  68. check_cmd() {
  69. var="$1"
  70. full_cmd="$2"
  71. # shellcheck disable=SC2086
  72. set -- $full_cmd
  73. cmd="$1"
  74. printf 'Checking $%s = %s command existence ...' "$var" "$full_cmd"
  75. command -v "$cmd" >/dev/null ; is_ok
  76. }
  77. check_header() {
  78. header="$1"
  79. set -- $CC -E -x c -
  80. printf 'Checking <%s> header (printf "#include <%s>" | %s) ...' "$header" "$header" "$*"
  81. printf '#include <%s>\n' "$header" | $@ >/dev/null
  82. is_ok
  83. }
  84. check_conftest() {
  85. conftest="$1"
  86. printf 'Checking if conftest %s compiles ...' "$conftest"
  87. ${CC} ${CFLAGS} ${CFLAGS_CHECK} -o "${conftest}.bin" "${conftest}" ${LDFLAGS} ${LDSTATIC} 2>&1
  88. is_ok
  89. }
  90. check_cflag() {
  91. printf "checking whether compiler accepts %s... " "$@"
  92. ${CC} ${CFLAGS} ${CFLAGS_CHECK} "$@" -c -o "configure.d/cflag_test.bin" "configure.d/cflag_test.c" 2>&1
  93. is_ok
  94. }
  95. set -o pipefail
  96. ## User configuration
  97. # defaults
  98. PREFIX="${PREFIX:-/usr/local}"
  99. MSGFMT="${MSGFMT:-msgfmt}"
  100. YACC="${YACC:-yacc}"
  101. MAKE="${MAKE:-make}"
  102. CFLAGS="${CFLAGS:--g -O2}"
  103. M4="${M4:-m4}"
  104. MANDOC="${MANDOC:-mandoc}"
  105. CRAM="${CRAM:-cram}"
  106. # Also allow variables through arguments
  107. for i; do
  108. case "$i" in
  109. -h|--help)
  110. usage
  111. exit 1
  112. ;;
  113. -*)
  114. printf "Unknown argument ‘%s’\n" "${i}"
  115. usage
  116. exit 1
  117. ;;
  118. *=*)
  119. # shellcheck disable=SC2163
  120. export "$i"
  121. shift
  122. ;;
  123. *)
  124. printf "Unknown argument ‘%s’\n" "${i}"
  125. usage
  126. exit 1
  127. ;;
  128. esac
  129. done
  130. printf 'Writing skeleton to config.h ...'
  131. cat >config.h <<EOF
  132. /* Autogenerated by ./configure */
  133. #ifndef UTILS_STD_CONFIG_H
  134. #define UTILS_STD_CONFIG_H
  135. EOF
  136. is_ok
  137. # Fallback toolchain definitions, based on $CROSS_COMPILE
  138. CC="${CC:-${CROSS_COMPILE}cc}"
  139. AR="${AR:-${CROSS_COMPILE}ar}"
  140. GCOV="${GCOV:-${CROSS_COMPILE}gcov}"
  141. # Fallback definitions for dirs, based on $PREFIX
  142. BINDIR="${BINDIR:-${PREFIX}/bin}"
  143. SHELLDIR="${SHELLDIR:-${BINDIR}}"
  144. PERLDIR="${PERLDIR:-${BINDIR}}"
  145. MANDIR="${MANDIR:-${PREFIX}/share/man}"
  146. # Add some extra CFLAGS
  147. CFLAGS="${CFLAGS} ${EXTRA_CFLAGS}"
  148. # Otherwise assert() can end up doing nothing, don't remove
  149. CFLAGS="${CFLAGS} -DDEBUG -UNDEBUG"
  150. ## System checks
  151. # commands
  152. check_cmd CC "$CC" || exit 1
  153. check_cmd AR "$AR" || exit 1
  154. check_cmd YACC "$YACC" || exit 1
  155. check_cmd MAKE "$MAKE" || exit 1
  156. check_cmd M4 "$M4" || exit 1
  157. if ! check_cmd GCOV "$GCOV"
  158. then
  159. echo 'Notice: "coverage" target will fail'
  160. GCOV="false"
  161. fi
  162. if ! check_cmd MANDOC "$MANDOC"
  163. then
  164. echo 'Notice: Linting depending on mandoc disabled'
  165. MANDOC="true"
  166. fi
  167. if ! check_cmd CRAM "$CRAM"
  168. then
  169. echo "Notice: cram not found, trying prysk"
  170. CRAM="prysk"
  171. if check_cmd CRAM "$CRAM"
  172. then
  173. :
  174. else
  175. CRAM="false"
  176. echo 'Notice: Testsuite depending on cram/psyk disabled'
  177. fi
  178. fi
  179. echo
  180. check_cflag "-Werror=implicit-function-declaration" && CFLAGS_CHECK="${CFLAGS_CHECK} -Werror=implicit-function-declaration"
  181. # clang: -Werror=format-extra-args -Werror=format-insufficient-args
  182. for f in -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wvla -Werror=format-extra-args -Werror=format-insufficient-args
  183. do
  184. check_cflag "$f" && CFLAGS="${CFLAGS} $f"
  185. done
  186. echo
  187. if ! check_header mntent.h; then
  188. echo 'Disabling cmd/df'
  189. target_filter="${target_filter} -e cmd/df"
  190. fi
  191. if ! check_header sys/sysmacros.h; then
  192. echo 'Disabling cmd/mknod'
  193. target_filter="${target_filter} -e cmd/mknod"
  194. fi
  195. # As seen missing in Haiku beta5 <https://dev.haiku-os.org/ticket/16257>
  196. check_header wordexp.h && cpp_define HAS_WORDEXP
  197. check_conftest configure.d/sendfile_linux.c && cpp_define HAS_SENDFILE
  198. check_conftest configure.d/copy_file_range.c && cpp_define HAS_COPY_FILE_RANGE
  199. if ! check_conftest configure.d/reallocarray.c; then
  200. echo 'Disabling cmd/df cmd/tr cmd/cut cmd/join'
  201. target_filter="${target_filter} -e cmd/df. -e cmd/tr. -e cmd/cut. -e cmd/join."
  202. fi
  203. check_conftest configure.d/getopt_long.c && cpp_define HAS_GETOPT_LONG
  204. check_conftest configure.d/syncfs.c && cpp_define HAS_SYNCFS
  205. if ! check_conftest configure.d/fgetln.c; then
  206. echo 'Disabling cmd/join'
  207. target_filter="${target_filter} -e cmd/join."
  208. fi
  209. check_conftest configure.d/mkstemps.c && cpp_define HAS_MKSTEMPS
  210. check_conftest configure.d/mkdtemps.c && cpp_define HAS_MKDTEMPS
  211. if ! check_conftest configure.d/o_path.c; then
  212. echo 'Disabling cmd/ln'
  213. target_filter="${target_filter} -e cmd/ln."
  214. fi
  215. # OpenBSD lacks posix_fadvise
  216. check_conftest configure.d/posix_fadvise.c || cpp_define 'posix_fadvise(fd, off, len, adv) 0'
  217. rm -f configure.d/*.bin
  218. echo
  219. ## Configuration write
  220. printf 'Writing to config.mk ...'
  221. cat >config.mk <<EOF
  222. # Autogenerated by ./configure
  223. PREFIX = ${PREFIX}
  224. BINDIR = ${BINDIR}
  225. SHELLDIR = ${SHELLDIR}
  226. PERLDIR = ${PERLDIR}
  227. MANDIR = ${MANDIR}
  228. CC = ${CC}
  229. AR = ${AR}
  230. YACC = ${YACC}
  231. MAKE = ${MAKE}
  232. M4 = ${M4}
  233. MANDOC = ${MANDOC}
  234. MSGFMT = ${MSGFMT}
  235. DBG = ${DBG}
  236. GCOV = ${GCOV}
  237. CRAM = ${CRAM}
  238. CFLAGS = ${CFLAGS}
  239. ARFLAGS = ${ARFLAGS}
  240. LDFLAGS = ${LDFLAGS}
  241. LDSTATIC = ${LDSTATIC}
  242. EOF
  243. is_ok
  244. printf 'Adding targets to config.mk ...'
  245. gen_targets >> config.mk ; or_die
  246. # Must close header guard
  247. echo '#endif // UTILS_STD_CONFIG_H' >> config.h
  248. echo
  249. echo 'Done, you can now run make'