logo

utils-std

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

configure (4917B)


  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. MSGFMT=BIN
  15. CC=BIN
  16. YACC=BIN
  17. MAKE=BIN
  18. M4=BIN
  19. MANDOC=BIN
  20. GCOV=BIN
  21. CRAM=BIN
  22. REUSE=BIN
  23. CFLAGS=OPTIONS
  24. LDFLAGS=OPTIONS
  25. LDSTATIC=OPTIONS
  26. EXTRA_CFLAGS=OPTIONS
  27. Variables are set in the following order: Default, Environment, Arguments
  28. Dependencies: See the README.md file
  29. END
  30. }
  31. is_ok() {
  32. status="$?"
  33. if test $status -eq 0; then
  34. printf " OK\n"
  35. else
  36. printf " FAIL\n"
  37. fi
  38. return $status
  39. }
  40. or_die() {
  41. is_ok || exit 1
  42. }
  43. gen_targets() {
  44. printf 'EXE = '
  45. printf '%s\n ' cmd/*.c cmd/*.y | grep -v -F ${target_filter} | sed -e 's;\.c$;;' -e 's;\.y$;;' | tr -d '\n'
  46. echo
  47. printf 'MAN1SO = '
  48. printf '%s\n' cmd/*.1.in \
  49. | grep -v -F ${target_filter} \
  50. | sed -e 's;\.in$;;' -e 's;^cmd/;build/cmd/;' \
  51. | tr '\n' ' '
  52. echo
  53. printf 'MAN1 = ${MAN1SO} '
  54. printf '%s\n ' cmd/*.1 | grep -v -F ${target_filter} | tr -d '\n'
  55. echo
  56. }
  57. check_cmd() {
  58. var="$1"
  59. full_cmd="$2"
  60. # shellcheck disable=SC2086
  61. set -- $full_cmd
  62. cmd="$1"
  63. printf 'Checking $%s = %s command existance ...' "$var" "$full_cmd"
  64. command -v "$cmd" >/dev/null ; is_ok
  65. }
  66. check_header() {
  67. header="$1"
  68. set -- $CC -E -x c -
  69. printf 'Checking <%s> header (printf "#include <%s>" | %s) ...' "$header" "$header" "$*"
  70. printf '#include <%s>\n' "$header" | $@ >/dev/null
  71. is_ok
  72. }
  73. check_conftest() {
  74. conftest="$1"
  75. printf 'Checking if conftest %s compiles ...' "$conftest"
  76. ${CC} ${CFLAGS} -Werror=implicit-function-declaration -c -o "${conftest}.bin" "${conftest}" 2>&1
  77. is_ok
  78. rm "${conftest}.bin"
  79. }
  80. check_cflag() {
  81. printf "checking whether compiler accepts %s... " "$@"
  82. ${CC} ${CFLAGS} "$@" -c -o "configure.d/cflag_test.bin" "configure.d/cflag_test.c" 2>&1
  83. is_ok
  84. rm "configure.d/cflag_test.bin"
  85. }
  86. set -o pipefail
  87. ## User configuration
  88. # defaults
  89. PREFIX="${PREFIX:-/usr/local}"
  90. MSGFMT="${MSGFMT:-msgfmt}"
  91. CC="${CC:-cc}"
  92. YACC="${YACC:-yacc}"
  93. MAKE="${MAKE:-make}"
  94. GCOV="${GCOV:-gcov}"
  95. # -DDEBUG: Otherwise assert() does nothing, fine to be removed in production
  96. CFLAGS="${CFLAGS:--g -O2 -DDEBUG}"
  97. M4="${M4:-m4}"
  98. MANDOC="${MANDOC:-mandoc}"
  99. CRAM="${CRAM:-cram}"
  100. REUSE="${REUSE:-reuse}"
  101. # Also allow variables through arguments
  102. for i; do
  103. case "$i" in
  104. -h|--help)
  105. usage
  106. exit 1
  107. ;;
  108. -*)
  109. printf "Unknown argument ‘%s’\n" "${i}"
  110. usage
  111. exit 1
  112. ;;
  113. *=*)
  114. # shellcheck disable=SC2163
  115. export "$i"
  116. shift
  117. ;;
  118. *)
  119. printf "Unknown argument ‘%s’\n" "${i}"
  120. usage
  121. exit 1
  122. ;;
  123. esac
  124. done
  125. # Fallback definitions for dirs, based on $PREFIX
  126. BINDIR="${BINDIR:-${PREFIX}/bin}"
  127. SHELLDIR="${SHELLDIR:-${BINDIR}}"
  128. PERLDIR="${PERLDIR:-${BINDIR}}"
  129. MANDIR="${MANDIR:-${PREFIX}/share/man}"
  130. # Add some extra CFLAGS
  131. CFLAGS="${CFLAGS} ${EXTRA_CFLAGS}"
  132. ## System checks
  133. # commands
  134. check_cmd CC "$CC" || exit 1
  135. check_cmd YACC "$YACC" || exit 1
  136. check_cmd MAKE "$MAKE" || exit 1
  137. check_cmd M4 "$M4" || exit 1
  138. if ! check_cmd GCOV "$GCOV"
  139. then
  140. echo 'Notice: "coverage" target will fail'
  141. GCOV="false"
  142. fi
  143. if ! check_cmd MANDOC "$MANDOC"
  144. then
  145. echo 'Notice: Linting depending on mandoc disabled'
  146. MANDOC="true"
  147. fi
  148. if ! check_cmd CRAM "$CRAM"
  149. then
  150. echo "Notice: cram not found, trying prysk"
  151. CRAM="prysk"
  152. if check_cmd CRAM "$CRAM"
  153. then
  154. :
  155. else
  156. CRAM="false"
  157. echo 'Notice: Testsuite depending on cram/psyk disabled'
  158. fi
  159. fi
  160. if ! check_cmd REUSE "$REUSE"
  161. then
  162. echo 'Notice: Copyright linting depending on reuse disabled'
  163. REUSE="true"
  164. fi
  165. echo
  166. check_cflag -Wwrite-strings && CFLAGS="${CFLAGS} -Wwrite-strings"
  167. if ! check_header mntent.h; then
  168. echo 'Disabling cmd/df'
  169. target_filter="${target_filter} -e cmd/df"
  170. fi
  171. if ! check_header sys/sysmacros.h; then
  172. echo 'Disabling cmd/mknod'
  173. target_filter="${target_filter} -e cmd/mknod"
  174. fi
  175. check_conftest configure.d/splice.c && CFLAGS="${CFLAGS} -DHAS_SPLICE"
  176. if check_conftest configure.d/copy_file_range.c
  177. then
  178. CFLAGS="${CFLAGS} -DHAS_COPY_FILE_RANGE"
  179. fi
  180. if ! check_conftest configure.d/reallocarray.c; then
  181. echo 'Disabling cmd/tr cmd/cut'
  182. target_filter="${target_filter} -e cmd/tr. -e cmd/cut."
  183. fi
  184. check_conftest configure.d/getopt_long.c && CFLAGS="${CFLAGS} -DHAS_GETOPT_LONG"
  185. echo
  186. ## Configuration write
  187. printf 'Writing to config.mk ...'
  188. cat >config.mk <<EOF
  189. # Autogenerated by ./configure
  190. PREFIX = ${PREFIX}
  191. BINDIR = ${BINDIR}
  192. SHELLDIR = ${SHELLDIR}
  193. PERLDIR = ${PERLDIR}
  194. MANDIR = ${MANDIR}
  195. CC = ${CC}
  196. YACC = ${YACC}
  197. MAKE = ${MAKE}
  198. M4 = ${M4}
  199. MANDOC = ${MANDOC}
  200. MSGFMT = ${MSGFMT}
  201. DBG = ${DBG}
  202. GCOV = ${GCOV}
  203. CRAM = ${CRAM}
  204. REUSE = ${REUSE}
  205. CFLAGS = ${CFLAGS}
  206. LDFLAGS = ${LDFLAGS}
  207. LDSTATIC = ${LDSTATIC}
  208. EOF
  209. is_ok
  210. printf 'Adding targets to config.mk ...'
  211. gen_targets >> config.mk ; or_die
  212. echo
  213. echo 'Done, you can now run make'