logo

utils-std

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

configure (6613B)


  1. #!/bin/sh
  2. # SPDX-FileCopyrightText: 2017 Haelwenn (lanodan) Monnier <contact+utils@hacktivis.me>
  3. # SPDX-License-Identifier: MPL-2.0
  4. usage() {
  5. cat <<END
  6. Usage: [variables] configure [variables]
  7. Variables:
  8. PREFIX=DIR
  9. BINDIR=DIR
  10. SHELLDIR=DIR
  11. PERLDIR=DIR
  12. MANDIR=DIR
  13. CROSS_COMPILE=TRIPLE
  14. MSGFMT=BIN
  15. AR=BIN
  16. CC=BIN
  17. YACC=BIN
  18. MAKE=BIN
  19. M4=BIN
  20. MANDOC=BIN
  21. GCOV=BIN
  22. CRAM=BIN
  23. CFLAGS=OPTIONS
  24. ARFLAGS=OPTIONS
  25. LDFLAGS=OPTIONS
  26. LDSTATIC=OPTIONS
  27. EXTRA_CFLAGS=OPTIONS
  28. Variables are set in the following order: Default, Environment, Arguments
  29. Dependencies: See the README.md file
  30. END
  31. }
  32. is_ok() {
  33. status="$?"
  34. if test $status -eq 0; then
  35. printf " OK\n"
  36. else
  37. printf " FAIL\n"
  38. fi
  39. return $status
  40. }
  41. or_die() {
  42. is_ok || exit 1
  43. }
  44. gen_targets() {
  45. printf 'EXE ='
  46. printf ' cmd/%s' ${commands}
  47. echo
  48. printf 'MAN1SO ='
  49. for cmd in ${commands}; do
  50. test -f "cmd/${cmd}.1.in" && printf ' %s' "build/cmd/${cmd}.1"
  51. done
  52. echo
  53. printf 'MAN1 = ${MAN1SO}'
  54. for cmd in ${commands}; do
  55. test -f "cmd/${cmd}.1.in" || printf ' %s' "cmd/${cmd}.1"
  56. done
  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. add_commands() {
  96. echo "Adding commands: $*"
  97. commands="${commands} $*"
  98. }
  99. set -o pipefail
  100. ## User configuration
  101. # defaults
  102. PREFIX="${PREFIX:-/usr/local}"
  103. MSGFMT="${MSGFMT:-msgfmt}"
  104. YACC="${YACC:-yacc}"
  105. MAKE="${MAKE:-make}"
  106. CFLAGS="${CFLAGS:--g -O2}"
  107. M4="${M4:-m4}"
  108. MANDOC="${MANDOC:-mandoc}"
  109. CRAM="${CRAM:-cram}"
  110. # when there's 3+ commands starting with the same letter, put them on a new line
  111. commands="
  112. arch base64 basename
  113. cat chmod chown chroot cksum cmp date dirname
  114. echo env expr false getconf head id install link logname
  115. mesg mkdir mkfifo mktemp mv
  116. nice nohup nproc
  117. paste pathchk printf pwd
  118. realpath renice rm rmdir
  119. seq sha1sum sha256sum sha512sum shuf sleep split strings sync
  120. tee test time timeout touch true truncate tty
  121. uname uniq unlink
  122. wc which whoami yes
  123. "
  124. # Also allow variables through arguments
  125. for i; do
  126. case "$i" in
  127. -h|--help)
  128. usage
  129. exit 1
  130. ;;
  131. -*)
  132. printf "Unknown argument ‘%s’\n" "${i}"
  133. usage
  134. exit 1
  135. ;;
  136. [A-Z]*=*)
  137. # shellcheck disable=SC2163
  138. export "$i"
  139. shift
  140. ;;
  141. *)
  142. printf "Unknown argument ‘%s’\n" "${i}"
  143. usage
  144. exit 1
  145. ;;
  146. esac
  147. done
  148. printf 'Writing skeleton to config.h ...'
  149. cat >config.h <<EOF
  150. /* Autogenerated by ./configure */
  151. #ifndef UTILS_STD_CONFIG_H
  152. #define UTILS_STD_CONFIG_H
  153. EOF
  154. is_ok
  155. # Fallback toolchain definitions, based on $CROSS_COMPILE
  156. CC="${CC:-${CROSS_COMPILE}cc}"
  157. AR="${AR:-${CROSS_COMPILE}ar}"
  158. GCOV="${GCOV:-${CROSS_COMPILE}gcov}"
  159. # Fallback definitions for dirs, based on $PREFIX
  160. BINDIR="${BINDIR:-${PREFIX}/bin}"
  161. SHELLDIR="${SHELLDIR:-${BINDIR}}"
  162. PERLDIR="${PERLDIR:-${BINDIR}}"
  163. MANDIR="${MANDIR:-${PREFIX}/share/man}"
  164. # Add some extra CFLAGS
  165. CFLAGS="${CFLAGS} ${EXTRA_CFLAGS}"
  166. # Otherwise assert() can end up doing nothing, don't remove
  167. CFLAGS="${CFLAGS} -DDEBUG -UNDEBUG"
  168. ## System checks
  169. # commands
  170. check_cmd CC "$CC" || exit 1
  171. check_cmd AR "$AR" || exit 1
  172. check_cmd YACC "$YACC" || exit 1
  173. check_cmd MAKE "$MAKE" || exit 1
  174. check_cmd M4 "$M4" || exit 1
  175. if ! check_cmd GCOV "$GCOV"
  176. then
  177. echo 'Notice: "coverage" target will fail'
  178. GCOV="false"
  179. fi
  180. if ! check_cmd MANDOC "$MANDOC"
  181. then
  182. echo 'Notice: Linting depending on mandoc disabled'
  183. MANDOC="true"
  184. fi
  185. if ! check_cmd CRAM "$CRAM"
  186. then
  187. echo "Notice: cram not found, trying prysk"
  188. CRAM="prysk"
  189. if check_cmd CRAM "$CRAM"
  190. then
  191. :
  192. else
  193. CRAM="false"
  194. echo 'Notice: Testsuite depending on cram/psyk disabled'
  195. fi
  196. fi
  197. echo
  198. check_cflag "-Werror=implicit-function-declaration" && CFLAGS_CHECK="${CFLAGS_CHECK} -Werror=implicit-function-declaration"
  199. # clang: -Werror=format-extra-args -Werror=format-insufficient-args
  200. for f in -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wvla -Werror=format-extra-args -Werror=format-insufficient-args
  201. do
  202. check_cflag "$f" && CFLAGS="${CFLAGS} $f"
  203. done
  204. echo
  205. check_header mntent.h
  206. has_mntent_h=$?
  207. check_header sys/sysmacros.h && add_commands mknod
  208. # As seen missing in Haiku beta5 <https://dev.haiku-os.org/ticket/16257>
  209. check_header wordexp.h && cpp_define HAS_WORDEXP
  210. check_conftest configure.d/sendfile_linux.c && cpp_define HAS_SENDFILE
  211. check_conftest configure.d/copy_file_range.c && cpp_define HAS_COPY_FILE_RANGE
  212. check_conftest configure.d/reallocarray.c
  213. has_reallocarray=$?
  214. test 0 -eq $has_reallocarray && add_commands tr cut
  215. check_conftest configure.d/getopt_long.c && cpp_define HAS_GETOPT_LONG
  216. check_conftest configure.d/syncfs.c && cpp_define HAS_SYNCFS
  217. check_conftest configure.d/fgetln.c
  218. has_fgetln=$?
  219. check_conftest configure.d/mkstemps.c && cpp_define HAS_MKSTEMPS
  220. check_conftest configure.d/mkdtemps.c && cpp_define HAS_MKDTEMPS
  221. check_conftest configure.d/o_path.c && add_commands ln
  222. # OpenBSD lacks posix_fadvise
  223. check_conftest configure.d/posix_fadvise.c || cpp_define 'posix_fadvise(fd, off, len, adv) 0'
  224. rm -f configure.d/*.bin
  225. echo
  226. if test 0 -eq $has_reallocarray; then
  227. test 0 -eq $has_mntent_h && add_commands df
  228. test 0 -eq $has_fgetln && add_commands join
  229. fi
  230. echo
  231. ## Configuration write
  232. printf 'Writing to config.mk ...'
  233. cat >config.mk <<EOF
  234. # Autogenerated by ./configure
  235. PREFIX = ${PREFIX}
  236. BINDIR = ${BINDIR}
  237. SHELLDIR = ${SHELLDIR}
  238. PERLDIR = ${PERLDIR}
  239. MANDIR = ${MANDIR}
  240. CC = ${CC}
  241. AR = ${AR}
  242. YACC = ${YACC}
  243. MAKE = ${MAKE}
  244. M4 = ${M4}
  245. MANDOC = ${MANDOC}
  246. MSGFMT = ${MSGFMT}
  247. DBG = ${DBG}
  248. GCOV = ${GCOV}
  249. CRAM = ${CRAM}
  250. CFLAGS = ${CFLAGS}
  251. ARFLAGS = ${ARFLAGS}
  252. LDFLAGS = ${LDFLAGS}
  253. LDSTATIC = ${LDSTATIC}
  254. EOF
  255. is_ok
  256. printf 'Adding targets to config.mk ...'
  257. gen_targets >> config.mk ; or_die
  258. # Must close header guard
  259. echo '#endif // UTILS_STD_CONFIG_H' >> config.h
  260. echo
  261. echo 'Done, you can now run make'