logo

utils-std

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

configure (6325B)


  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. CC="${CC:-${CROSS_COMPILE}cc}"
  101. AR="${AR:-${CROSS_COMPILE}ar}"
  102. YACC="${YACC:-yacc}"
  103. MAKE="${MAKE:-make}"
  104. GCOV="${GCOV:-${CROSS_COMPILE}gcov}"
  105. CFLAGS="${CFLAGS:--g -O2}"
  106. M4="${M4:-m4}"
  107. MANDOC="${MANDOC:-mandoc}"
  108. CRAM="${CRAM:-cram}"
  109. # Also allow variables through arguments
  110. for i; do
  111. case "$i" in
  112. -h|--help)
  113. usage
  114. exit 1
  115. ;;
  116. -*)
  117. printf "Unknown argument ‘%s’\n" "${i}"
  118. usage
  119. exit 1
  120. ;;
  121. *=*)
  122. # shellcheck disable=SC2163
  123. export "$i"
  124. shift
  125. ;;
  126. *)
  127. printf "Unknown argument ‘%s’\n" "${i}"
  128. usage
  129. exit 1
  130. ;;
  131. esac
  132. done
  133. printf 'Writing skeleton to config.h ...'
  134. cat >config.h <<EOF
  135. /* Autogenerated by ./configure */
  136. #ifndef UTILS_STD_CONFIG_H
  137. #define UTILS_STD_CONFIG_H
  138. EOF
  139. is_ok
  140. # Fallback definitions for dirs, based on $PREFIX
  141. BINDIR="${BINDIR:-${PREFIX}/bin}"
  142. SHELLDIR="${SHELLDIR:-${BINDIR}}"
  143. PERLDIR="${PERLDIR:-${BINDIR}}"
  144. MANDIR="${MANDIR:-${PREFIX}/share/man}"
  145. # Add some extra CFLAGS
  146. CFLAGS="${CFLAGS} ${EXTRA_CFLAGS}"
  147. # Otherwise assert() can end up doing nothing, don't remove
  148. CFLAGS="${CFLAGS} -DDEBUG -UNDEBUG"
  149. ## System checks
  150. # commands
  151. check_cmd CC "$CC" || exit 1
  152. check_cmd AR "$AR" || exit 1
  153. check_cmd YACC "$YACC" || exit 1
  154. check_cmd MAKE "$MAKE" || exit 1
  155. check_cmd M4 "$M4" || exit 1
  156. if ! check_cmd GCOV "$GCOV"
  157. then
  158. echo 'Notice: "coverage" target will fail'
  159. GCOV="false"
  160. fi
  161. if ! check_cmd MANDOC "$MANDOC"
  162. then
  163. echo 'Notice: Linting depending on mandoc disabled'
  164. MANDOC="true"
  165. fi
  166. if ! check_cmd CRAM "$CRAM"
  167. then
  168. echo "Notice: cram not found, trying prysk"
  169. CRAM="prysk"
  170. if check_cmd CRAM "$CRAM"
  171. then
  172. :
  173. else
  174. CRAM="false"
  175. echo 'Notice: Testsuite depending on cram/psyk disabled'
  176. fi
  177. fi
  178. echo
  179. check_cflag "-Werror=implicit-function-declaration" && CFLAGS_CHECK="${CFLAGS_CHECK} -Werror=implicit-function-declaration"
  180. # clang: -Werror=format-extra-args -Werror=format-insufficient-args
  181. for f in -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wvla -Werror=format-extra-args -Werror=format-insufficient-args
  182. do
  183. check_cflag "$f" && CFLAGS="${CFLAGS} $f"
  184. done
  185. echo
  186. if ! check_header mntent.h; then
  187. echo 'Disabling cmd/df'
  188. target_filter="${target_filter} -e cmd/df"
  189. fi
  190. if ! check_header sys/sysmacros.h; then
  191. echo 'Disabling cmd/mknod'
  192. target_filter="${target_filter} -e cmd/mknod"
  193. fi
  194. # As seen missing in Haiku beta5 <https://dev.haiku-os.org/ticket/16257>
  195. check_header wordexp.h && cpp_define HAS_WORDEXP
  196. check_conftest configure.d/sendfile_linux.c && cpp_define HAS_SENDFILE
  197. check_conftest configure.d/copy_file_range.c && cpp_define HAS_COPY_FILE_RANGE
  198. if ! check_conftest configure.d/reallocarray.c; then
  199. echo 'Disabling cmd/df cmd/tr cmd/cut cmd/join'
  200. target_filter="${target_filter} -e cmd/df. -e cmd/tr. -e cmd/cut. -e cmd/join."
  201. fi
  202. check_conftest configure.d/getopt_long.c && cpp_define HAS_GETOPT_LONG
  203. check_conftest configure.d/syncfs.c && cpp_define HAS_SYNCFS
  204. if ! check_conftest configure.d/fgetln.c; then
  205. echo 'Disabling cmd/join'
  206. target_filter="${target_filter} -e cmd/join."
  207. fi
  208. check_conftest configure.d/mkstemps.c && cpp_define HAS_MKSTEMPS
  209. check_conftest configure.d/mkdtemps.c && cpp_define HAS_MKDTEMPS
  210. if ! check_conftest configure.d/o_path.c; then
  211. echo 'Disabling cmd/ln'
  212. target_filter="${target_filter} -e cmd/ln."
  213. fi
  214. # OpenBSD lacks posix_fadvise
  215. check_conftest configure.d/posix_fadvise.c || cpp_define 'posix_fadvise(fd, off, len, adv) 0'
  216. rm -f configure.d/*.bin
  217. echo
  218. ## Configuration write
  219. printf 'Writing to config.mk ...'
  220. cat >config.mk <<EOF
  221. # Autogenerated by ./configure
  222. PREFIX = ${PREFIX}
  223. BINDIR = ${BINDIR}
  224. SHELLDIR = ${SHELLDIR}
  225. PERLDIR = ${PERLDIR}
  226. MANDIR = ${MANDIR}
  227. CC = ${CC}
  228. AR = ${AR}
  229. YACC = ${YACC}
  230. MAKE = ${MAKE}
  231. M4 = ${M4}
  232. MANDOC = ${MANDOC}
  233. MSGFMT = ${MSGFMT}
  234. DBG = ${DBG}
  235. GCOV = ${GCOV}
  236. CRAM = ${CRAM}
  237. CFLAGS = ${CFLAGS}
  238. ARFLAGS = ${ARFLAGS}
  239. LDFLAGS = ${LDFLAGS}
  240. LDSTATIC = ${LDSTATIC}
  241. EOF
  242. is_ok
  243. printf 'Adding targets to config.mk ...'
  244. gen_targets >> config.mk ; or_die
  245. # Must close header guard
  246. echo '#endif // UTILS_STD_CONFIG_H' >> config.h
  247. echo
  248. echo 'Done, you can now run make'