logo

badwolf

minimalist and privacy-oriented web browser based on WebKitGTK git clone https://anongit.hacktivis.me/git/badwolf.git/

configure (11427B)


  1. #!/bin/sh
  2. # SPDX-FileCopyrightText: 2019-2023 Badwolf Authors <https://hacktivis.me/projects/badwolf>
  3. # SPDX-License-Identifier: BSD-3-Clause
  4. VERSION=1.4.0
  5. VERSION_FULL=${VERSION}$(./version.sh)
  6. DEPS="gtk+-3.0 libxml-2.0"
  7. SRCS="bookmarks.c userscripts.c fmt.c fmt_test.c uri.c uri_test.c keybindings.c downloads.c badwolf.c man_uri_scheme.c"
  8. OBJS="bookmarks.o userscripts.o fmt.o uri.o keybindings.o downloads.o badwolf.o man_uri_scheme.o"
  9. OBJS_test="fmt_test.o uri_test.o bookmarks_test.o"
  10. EXE=badwolf
  11. EXE_test="fmt_test uri_test bookmarks_test"
  12. DOCS="usr.bin.badwolf README.md KnowledgeBase.md interface.md"
  13. TRANS="fr pt_BR sr tr de vi"
  14. TRANS_MAN="de fr sr tr vi"
  15. lint_targets=""
  16. min_webkitgtk=2.32.0
  17. min_glib_guri=2.66.0
  18. arg0="$0"
  19. args="$@"
  20. usage() {
  21. cat <<END
  22. Usage: [variables] configure [variables]
  23. Variables:
  24. PREFIX=DIR
  25. BINDIR=DIR
  26. MANDIR=DIR
  27. DOCDIR=DIR
  28. DATADIR=DIR
  29. APPSDIR=DIR
  30. PKGCONFIG=BIN
  31. MSGFMT=BIN
  32. INKSCAPE=BIN
  33. CC=BIN
  34. CFLAGS=OPTIONS
  35. CMD_ED=BIN
  36. LDFLAGS=OPTIONS
  37. EXTRA_CFLAGS=OPTIONS
  38. XGETTEXT=BIN
  39. MSGMERGE=BIN
  40. MANDOC=BIN
  41. SHELLCHECK=BIN
  42. FLAWFINDER=BIN
  43. REUSE=BIN
  44. WITH_WEBKITGTK=(4.0|4.1)
  45. WITH_URI_PARSER=(guri|libsoup2)
  46. ENABLE_NLS=0|1
  47. Variables are set in the following order: Default, Environment, Arguments
  48. Dependencies: See README.md
  49. END
  50. }
  51. is_ok() {
  52. status="$?"
  53. if test $status -eq 0; then
  54. printf " OK\n"
  55. else
  56. printf " FAIL\n"
  57. fi
  58. return $status
  59. }
  60. required() {
  61. is_ok || exit 1
  62. }
  63. pkg_config_check() {
  64. printf 'Checking: %s %s ...' "${PKGCONFIG}" "$*"
  65. "${PKGCONFIG}" "$@"
  66. is_ok
  67. }
  68. ## User configuration
  69. # defaults
  70. PREFIX="${PREFIX:-/usr/local}"
  71. PKGCONFIG="${PKGCONFIG:-pkg-config}"
  72. MSGFMT="${MSGFMT:-msgfmt}"
  73. INKSCAPE="${INKSCAPE:-inkscape}"
  74. CC="${CC:-cc}"
  75. CFLAGS="${CFLAGS:--g -O2 -D_FORTIFY_SOURCE=2}"
  76. CMD_ED="${CMD_ED:-ed}"
  77. XGETTEXT="${XGETTEXT:-xgettext}"
  78. MSGMERGE="${MSGMERGE:-msgmerge}"
  79. MANDOC="${MANDOC:-mandoc}"
  80. SHELLCHECK="${SHELLCHECK:-shellcheck}"
  81. FLAWFINDER="${FLAWFINDER:-flawfinder}"
  82. REUSE="${REUSE:-reuse}"
  83. ENABLE_NLS="${ENABLE_NLS:-1}"
  84. # Also allow variables through arguments
  85. for i; do
  86. case "$i" in
  87. -h|--help)
  88. usage
  89. exit 1
  90. ;;
  91. -*)
  92. printf "Unknown argument ‘%s’\n" "${i}"
  93. usage
  94. exit 1
  95. ;;
  96. *=*)
  97. # shellcheck disable=SC2163
  98. export "$i"
  99. shift
  100. ;;
  101. *)
  102. printf "Unknown argument ‘%s’\n" "${i}"
  103. usage
  104. exit 1
  105. ;;
  106. esac
  107. done
  108. # Fallback definitions for dirs, based on $PREFIX
  109. BINDIR="${BINDIR:-${PREFIX}/bin}"
  110. MANDIR="${MANDIR:-${PREFIX}/share/man}"
  111. DOCDIR="${DOCDIR:-${PREFIX}/share/doc/badwolf-${VERSION}}"
  112. DATADIR="${DATADIR:-${PREFIX}/share/badwolf}"
  113. APPSDIR="${APPSDIR:-${PREFIX}/share/applications}"
  114. # Add some extra CFLAGS
  115. CFLAGS="${CFLAGS} -Wall -Wextra -Wconversion -Wsign-conversion -Werror=implicit-function-declaration -Werror=implicit-int -Werror=vla ${EXTRA_CFLAGS}"
  116. ## System checks
  117. # commands
  118. printf 'Checking %s command existence ...' "${PKGCONFIG}"
  119. command -v "${PKGCONFIG}" >/dev/null ; required
  120. printf 'Checking %s command existence ...' "${CC}"
  121. command -v "${CC}" >/dev/null ; required
  122. printf 'Checking %s command existence ...' "${CMD_ED}"
  123. if command -v "${CMD_ED}" >/dev/null ; is_ok
  124. then
  125. :
  126. else
  127. echo 'Warning: Updating of *.pot translation files disabled, you may want to install ed(1)'
  128. CMD_ED="false"
  129. fi
  130. printf 'Checking %s command existence ...' "${MANDOC}"
  131. if command -v "${MANDOC}" >/dev/null ; is_ok
  132. then
  133. lint_targets="${lint_targets} lint_mandoc"
  134. else
  135. echo 'Warning: manpage linting via mandoc(1) disabled'
  136. MANDOC="true"
  137. fi
  138. if test 1 -eq $ENABLE_NLS; then
  139. printf 'Checking %s command existence ...' "${XGETTEXT}"
  140. if command -v "${XGETTEXT}" >/dev/null ; is_ok
  141. then
  142. :
  143. else
  144. echo 'Warning: translation updates disabled'
  145. XGETTEXT="true"
  146. fi
  147. printf 'Checking %s command existence ...' "${MSGMERGE}"
  148. if command -v "${MSGMERGE}" >/dev/null ; is_ok
  149. then
  150. :
  151. else
  152. echo 'Warning: translation updates disabled'
  153. MSGMERGE="true"
  154. fi
  155. else
  156. echo 'notice: translations disabled'
  157. TRANS=""
  158. TRANS_MAN=""
  159. XGETTEXT="true"
  160. MSGMERGE="true"
  161. fi
  162. printf 'Checking %s command existence ...' "${SHELLCHECK}"
  163. if command -v "${SHELLCHECK}" >/dev/null ; is_ok
  164. then
  165. lint_targets="${lint_targets} lint_shellcheck"
  166. else
  167. echo 'Warning: shell linting via shellcheck(1) disabled'
  168. SHELLCHECK="true"
  169. fi
  170. printf 'Checking %s command existence ...' "${FLAWFINDER}"
  171. if command -v "${FLAWFINDER}" >/dev/null ; is_ok
  172. then
  173. lint_targets="${lint_targets} lint_flawfinder"
  174. else
  175. echo 'Warning: C analysis via flawfinder(1) disabled'
  176. FLAWFINDER="true"
  177. fi
  178. printf 'Checking %s command existence ...' "${REUSE}"
  179. if command -v "${REUSE}" >/dev/null ; is_ok
  180. then
  181. lint_targets="${lint_targets} lint_reuse"
  182. else
  183. echo 'Warning: License linting via reuse(1) disabled'
  184. REUSE="true"
  185. fi
  186. echo
  187. # pkg-config
  188. for dep in ${DEPS}
  189. do
  190. pkg_config_check --exists "$dep" || exit 1
  191. done
  192. case "${WITH_WEBKITGTK}n" in
  193. 4.1n)
  194. pkg_config_check --atleast-version="${min_webkitgtk}" webkit2gtk-4.1 || exit 1
  195. DEPS="${DEPS} webkit2gtk-4.1"
  196. ;;
  197. 4.0n)
  198. pkg_config_check --atleast-version="${min_webkitgtk}" webkit2gtk-4.0 || exit 1
  199. DEPS="${DEPS} webkit2gtk-4.0"
  200. ;;
  201. n)
  202. echo "notice: Packagers should consider setting the ABI version (4.0 or 4.1) in WITH_WEBKITGTK" >&2
  203. if pkg_config_check --atleast-version="${min_webkitgtk}" webkit2gtk-4.1
  204. then
  205. DEPS="${DEPS} webkit2gtk-4.1"
  206. else
  207. pkg_config_check --atleast-version="${min_webkitgtk}" webkit2gtk-4.0 || exit 1
  208. DEPS="${DEPS} webkit2gtk-4.0"
  209. fi
  210. ;;
  211. *)
  212. echo "error: invalid webkit2gtk version in WITH_WEBKITGTK environment variable, must be 4.0 or 4.1" >&2
  213. exit 1
  214. ;;
  215. esac
  216. case "${WITH_URI_PARSER}n" in
  217. gurin)
  218. echo "URI parser selected: GUri from glib-2.0"
  219. pkg_config_check --atleast-version="${min_glib_guri}" glib-2.0 || exit 1
  220. DEPS="${DEPS} glib-2.0"
  221. ;;
  222. libsoup2n)
  223. echo "URI parser selected: libsoup-2.4"
  224. pkg_config_check libsoup-2.4 || exit 1
  225. DEPS="${DEPS} libsoup-2.4"
  226. CFLAGS="${CFLAGS} -DUSE_LIBSOUP2"
  227. if echo "${DEPS}" | grep -q 'webkit2gtk-4.1'
  228. then
  229. echo 'warning: libsoup2 selected while WebKitGTK with libsoup3 API is used' >&2
  230. fi
  231. ;;
  232. n)
  233. echo "notice: Packagers should consider setting the URI parsing library (guri or libsoup2) in WITH_URI_PARSER" >&2
  234. if echo "${DEPS}" | grep -q 'webkit2gtk-4.0'
  235. then
  236. pkg_config_check libsoup-2.4 || exit 1
  237. echo "URI parser selected: libsoup-2.4"
  238. DEPS="${DEPS} libsoup-2.4"
  239. CFLAGS="${CFLAGS} -DUSE_LIBSOUP2"
  240. else
  241. pkg_config_check --atleast-version="${min_glib_guri}" glib-2.0 || exit 1
  242. echo "URI parser selected: GUri from glib-2.0"
  243. DEPS="${DEPS} glib-2.0"
  244. fi
  245. ;;
  246. *)
  247. echo "error: invalid uri provider in WITH_URI_PARSER environment variable, must be guri or libsoup2" >&2
  248. ;;
  249. esac
  250. printf 'Using pkg-config to get CFLAGS for %s ...' "${DEPS}"
  251. get_cflags() { "${PKGCONFIG}" --cflags "${DEPS}"; }
  252. DEPS_cflags="$(get_cflags)"
  253. required
  254. printf 'Using pkg-config to get LIBS for %s ...' "${DEPS}"
  255. get_libs() { "${PKGCONFIG}" --libs "${DEPS}"; }
  256. DEPS_libs="$(get_libs)"
  257. required
  258. echo
  259. printf 'Writing to configure.h ...'
  260. cat >configure.h <<EOF
  261. #define DATADIR "${DATADIR}"
  262. #define PACKAGE "Badwolf"
  263. #define _XOPEN_SOURCE 700
  264. #define _POSIX_C_SOURCE 200809L
  265. #define VERSION "${VERSION_FULL}"
  266. EOF
  267. is_ok
  268. ## Configuration write
  269. printf 'Writing to config.ninja ...'
  270. cat >config.ninja <<EOF
  271. # Autogenerated by $arg0 $args
  272. rule gen_config
  273. command = $arg0 "$args"
  274. generator = 1
  275. build config.ninja: gen_config configure
  276. PREFIX = ${PREFIX}
  277. PKGCONFIG = ${PKGCONFIG}
  278. MSGFMT = ${MSGFMT}
  279. INKSCAPE = ${INKSCAPE}
  280. CC = ${CC}
  281. CFLAGS = ${CFLAGS}
  282. LDFLAGS = ${LDFLAGS}
  283. CMD_ED = ${CMD_ED}
  284. MANDOC = ${MANDOC}
  285. XGETTEXT = ${XGETTEXT}
  286. MSGMERGE = ${MSGMERGE}
  287. SHELLCHECK = ${SHELLCHECK}
  288. FLAWFINDER = ${FLAWFINDER}
  289. REUSE = ${REUSE}
  290. DEPS_cflags = ${DEPS_cflags}
  291. DEPS_libs = ${DEPS_libs}
  292. GETTEXT_OPTS = --copyright-holder="Badwolf Authors <https://hacktivis.me/projects/badwolf>" --package-name="Badwolf" --package-version="${VERSION_FULL}" --msgid-bugs-address="contact+badwolf-msgid@hacktivis.me"
  293. rule xgettext
  294. command = \$XGETTEXT --keyword=_ --language=C --from-code=UTF-8 -o \$out --add-comments --sort-output --foreign-user --no-location --no-wrap \$GETTEXT_OPTS \$in && \$CMD_ED -s \$out <po/pot_license.ed
  295. rule msgmerge
  296. # touch: msgmerge doesn't always updates timestamps
  297. command = \$MSGMERGE --update --backup=off \$out \$in && touch \$out
  298. rule xgettext_man
  299. command = if test -e \$out; $
  300. then po4a-updatepo --format man -M utf-8 --master \$in \$GETTEXT_OPTS --po \$out && \$CMD_ED -s \$out <po/pot_license.ed;$
  301. else po4a-gettextize --format man -M utf-8 --master \$in \$GETTEXT_OPTS --po \$out && \$CMD_ED -s \$out <po/pot_license.ed;$
  302. fi
  303. rule cc_exe
  304. command = \$CC -std=c11 \$CFLAGS -include configure.h \$DEPS_cflags -o \$out \$in \$LDFLAGS \$DEPS_libs
  305. rule cc_obj
  306. command = \$CC -std=c11 \$CFLAGS -include configure.h \$DEPS_cflags -c -o \$out \$in
  307. build badwolf: cc_exe ${OBJS}
  308. EOF
  309. all="badwolf"
  310. for obj in ${OBJS}; do
  311. obj_c="$(echo "$obj" | sed -e 's;\.o;.c;g')"
  312. echo -n "build ${obj}: cc_obj ${obj_c} | "
  313. grep '#include "' "${obj_c}" | sed -e 's;#include ";;' -e 's;";;' | tr '\n' ' '
  314. echo
  315. done >>config.ninja
  316. if [ "$CMD_ED" != "false" ]; then
  317. echo "build po/messages.pot: xgettext ${SRCS} | po/pot_license.ed"
  318. echo 'build po/manpage.pot: xgettext_man badwolf.1 | po/pot_license.ed'
  319. fi >>config.ninja
  320. for trans in ${TRANS}; do
  321. echo "build po/${trans}.po: msgmerge po/messages.pot"
  322. echo "build locale/${trans}/LC_MESSAGES/Badwolf.mo: po2mo po/${trans}.po"
  323. all="${all} locale/${trans}/LC_MESSAGES/Badwolf.mo"
  324. done >>config.ninja
  325. for man in ${TRANS_MAN}; do
  326. echo "build po/${man}_man.po: xgettext_man badwolf.1"
  327. echo "build badwolf.${man}.1: translate_manpage po/${man}_man.po"
  328. bundled="${bundled} badwolf.${man}.1"
  329. trans_man="${trans_man} badwolf.${man}.1"
  330. done >>config.ninja
  331. for i in 24 32 48 64 128 256; do
  332. echo "build icons/hicolor/${i}x${i}/apps/badwolf.png: gen_icon icons/hicolor/scalable/apps/badwolf.svg
  333. width = $i
  334. height = $i"
  335. bundled="${bundled} icons/hicolor/${i}x${i}"
  336. icons_list="${icons_list} icons/hicolor/${i}x${i}/apps/badwolf.png"
  337. done >>config.ninja
  338. cat >>config.ninja <<EOF
  339. build icons: phony | ${icons_list}
  340. build trans_man: phony | ${trans_man}
  341. build bundled: phony | icons trans_man
  342. default ${all}
  343. rule remove
  344. command = rm -fr \${in} \${foo}
  345. build install: install | ${all}
  346. build clean: remove
  347. foo = ${all} ${OBJS} ${OBJS_test}
  348. build distclean: remove | clean
  349. foo = config.ninja configure.h install.sh
  350. build fullclean: remove | distclean
  351. foo = ${bundled}
  352. EOF
  353. is_ok
  354. printf 'Writing to ./install.sh ...'
  355. cat >install.sh <<EOF
  356. # Autogenerated by $arg0 $args
  357. # doins <DIR> <filename ...>
  358. doins() {
  359. dir="\${DESTDIR}/\$1"; shift
  360. mkdir -p "\${dir}/" || exit 1
  361. echo "\$@ → \${dir}/"
  362. cp -pr "\$@" "\${dir}/"
  363. }
  364. # newins <DIR> <orig-filename> <dest-filename>
  365. newins() {
  366. dir="\${DESTDIR}/\$1"
  367. mkdir -p "\${dir}/" || exit 1
  368. echo "\$2 → \${dir}/\$3"
  369. cp -pr "\$2" "\${dir}/\$3"
  370. }
  371. doins "${BINDIR}" ./badwolf
  372. doins "${MANDIR}/man1" ./badwolf.1
  373. for man in ${TRANS_MAN}; do
  374. newins "${MANDIR}/\${man}/man1" "./badwolf.\${man}.1" "badwolf.1"
  375. done
  376. doins "${DATADIR}" ./locale
  377. doins "${DATADIR}" ./interface.css
  378. doins "${APPSDIR}" badwolf.desktop
  379. doins "${DOCDIR}" ${DOCS}
  380. doins "${PREFIX}/share" icons
  381. printf "\nNote: An example AppArmor profile has been installed at '${DOCDIR}/usr.bin.badwolf'\n"
  382. EOF
  383. is_ok
  384. echo 'Done, you can now run ninja or samu'