logo

utils-std

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

configure (5933B)


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