logo

utils-std

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

configure (5821B)


  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. for f in -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wvla
  181. do
  182. check_cflag "$f" && CFLAGS="${CFLAGS} $f"
  183. done
  184. echo
  185. if ! check_header mntent.h; then
  186. echo 'Disabling cmd/df'
  187. target_filter="${target_filter} -e cmd/df"
  188. fi
  189. if ! check_header sys/sysmacros.h; then
  190. echo 'Disabling cmd/mknod'
  191. target_filter="${target_filter} -e cmd/mknod"
  192. fi
  193. # As seen missing in Haiku beta5 <https://dev.haiku-os.org/ticket/16257>
  194. check_header wordexp.h && cpp_define HAS_WORDEXP
  195. check_conftest configure.d/sendfile_linux.c && cpp_define HAS_SENDFILE
  196. check_conftest configure.d/copy_file_range.c && cpp_define HAS_COPY_FILE_RANGE
  197. if ! check_conftest configure.d/reallocarray.c; then
  198. echo 'Disabling cmd/df cmd/tr cmd/cut cmd/join'
  199. target_filter="${target_filter} -e cmd/df. -e cmd/tr. -e cmd/cut. -e cmd/join."
  200. fi
  201. check_conftest configure.d/getopt_long.c && cpp_define HAS_GETOPT_LONG
  202. check_conftest configure.d/syncfs.c && cpp_define HAS_SYNCFS
  203. if ! check_conftest configure.d/fgetln.c; then
  204. echo 'Disabling cmd/join'
  205. target_filter="${target_filter} -e cmd/join."
  206. fi
  207. rm -f configure.d/*.bin
  208. echo
  209. ## Configuration write
  210. printf 'Writing to config.mk ...'
  211. cat >config.mk <<EOF
  212. # Autogenerated by ./configure
  213. PREFIX = ${PREFIX}
  214. BINDIR = ${BINDIR}
  215. SHELLDIR = ${SHELLDIR}
  216. PERLDIR = ${PERLDIR}
  217. MANDIR = ${MANDIR}
  218. CC = ${CC}
  219. AR = ${AR}
  220. YACC = ${YACC}
  221. MAKE = ${MAKE}
  222. M4 = ${M4}
  223. MANDOC = ${MANDOC}
  224. MSGFMT = ${MSGFMT}
  225. DBG = ${DBG}
  226. GCOV = ${GCOV}
  227. CRAM = ${CRAM}
  228. CFLAGS = ${CFLAGS}
  229. ARFLAGS = ${ARFLAGS}
  230. LDFLAGS = ${LDFLAGS}
  231. LDSTATIC = ${LDSTATIC}
  232. EOF
  233. is_ok
  234. printf 'Adding targets to config.mk ...'
  235. gen_targets >> config.mk ; or_die
  236. # Must close header guard
  237. echo '#endif // UTILS_STD_CONFIG_H' >> config.h
  238. echo
  239. echo 'Done, you can now run make'