summaryrefslogtreecommitdiff
path: root/mk
diff options
context:
space:
mode:
Diffstat (limited to 'mk')
-rwxr-xr-xmk/luapath (renamed from mk/lua.path)513
1 files changed, 343 insertions, 170 deletions
diff --git a/mk/lua.path b/mk/luapath
index 8df41c9..fe5fc9f 100755
--- a/mk/lua.path
+++ b/mk/luapath
@@ -26,10 +26,10 @@
26# Changelog: 26# Changelog:
27# 27#
28# * 2013-08-02 - Published. Derived from an earlier script, lua.path, 28# * 2013-08-02 - Published. Derived from an earlier script, lua.path,
29# written for the cqueues project. 29# written for the cqueues project.
30# 30#
31# * 2013-08-05 - Redirect stdin from /dev/null when probing so we don't 31# * 2013-08-05 - Redirect stdin from /dev/null when probing so we don't
32# freeze if a utility tries to read from stdin. 32# freeze if a utility tries to read from stdin.
33# 33#
34# chdir to a read-only directory by default to try to prevent creation 34# chdir to a read-only directory by default to try to prevent creation
35# of temporary files. These features address the issues of LuaTeX 35# of temporary files. These features address the issues of LuaTeX
@@ -82,9 +82,31 @@
82# hardcode /usr/local/lib/lua/5.1, ordered before the LuaJIT 82# hardcode /usr/local/lib/lua/5.1, ordered before the LuaJIT
83# installation prefix. 83# installation prefix.
84# 84#
85# * 2015-07-14 - Add recursive glob function implemented in shell code
86# and use instead of find(1).
87#
88# * 2016-03-18 - Fix bug in tryluac where a continue statement was used
89# instead of return 0.
90#
91# * 2016-03-25 - Support ${CC} values with trailing flags, which invoke
92# the compiler through env(1), or which otherwise are intended to
93# expand as multiple words.
94#
95# OpenBSD 5.8 sh does not suppress strict errors within an eval
96# invoked from an if condition compound-list. Workaround by changing
97# trylua to return 0 on matching failure, like tryluainclude and
98# tryluac do.
99#
100# Undeprecate ldir and cdir. The names are more intuitive and
101# convenient as evidenced by the fact that I keep using them instead
102# of package.path and package.cpath. Try to maintain backwards
103# compatibility by using a simple heuristic to differentiate lua
104# interpreter glob patterns from preferred install directory
105# string.match expressions.
106#
85# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 107# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
86# 108#
87# Copyright (C) 2012-2015 William Ahern 109# Copyright (C) 2012-2016 William Ahern
88# 110#
89# Permission is hereby granted, free of charge, to any person obtaining a 111# Permission is hereby granted, free of charge, to any person obtaining a
90# copy of this software and associated documentation files (the "Software"), 112# copy of this software and associated documentation files (the "Software"),
@@ -116,7 +138,7 @@ unset IFS # no field splitting surprises
116unset LUA_PATH || true # interferes search for module install directory 138unset LUA_PATH || true # interferes search for module install directory
117unset LUA_CPATH || true 139unset LUA_CPATH || true
118 140
119MYVERSION=20150119 141MYVERSION=20160325
120MYVENDOR="william@25thandClement.com" 142MYVENDOR="william@25thandClement.com"
121 143
122 144
@@ -129,8 +151,7 @@ LDDIRS= # -L directories from LDFLAGS
129LIBDIRS= 151LIBDIRS=
130BINDIRS= 152BINDIRS=
131RECURSE=no 153RECURSE=no
132MAXDEPTH= # full command switch, like "-maxdepth 3", if supported 154MAXDEPTH=5 # maximum recursion depth
133XDEV= # do not cross device boundaries; i.e. "-xdev"
134SHORTEST= # continue searching until shortest pathname found 155SHORTEST= # continue searching until shortest pathname found
135PKGCONFIG= # path to pkg-config, found by `command -v` when -k option invoked 156PKGCONFIG= # path to pkg-config, found by `command -v` when -k option invoked
136GLOB= # -e GLOB expression for lua, luac, ldir, and cdir 157GLOB= # -e GLOB expression for lua, luac, ldir, and cdir
@@ -165,6 +186,27 @@ LUA_VER=
165 186
166 187
167# 188#
189# warn FORMAT [...]
190#
191# Print message to original stderr.
192#
193exec 9>&2
194warn() {
195 printf "%s: %.0s${1}\n" "${0##*/}" "$@" >&9
196}
197
198#
199# panic FORMAT [...]
200#
201# Print message to original stderr, then exit with failure.
202#
203panic() {
204 warn "$@"
205 exit 1
206}
207
208
209#
168# parse CPPFLAGS -I or LDFLAGS -L directories 210# parse CPPFLAGS -I or LDFLAGS -L directories
169# 211#
170xdirs() { 212xdirs() {
@@ -231,6 +273,46 @@ append() {
231} 273}
232 274
233# 275#
276# glob PATTERN [MAXDEPTH] [EXEC-COMMAND] [INTERNAL:GLOB-COUNT]
277#
278glob() {
279 glob_N="${4:-0}"
280
281 IFS=
282 set +f
283 for F in ${1}; do
284 [ -e "${F}" ] || continue
285 if eval "${3:-printf '%s\\n'} \"\${F}\""; then
286 glob_N=$((${glob_N} + 1))
287 fi
288 done
289 set -f
290 unset IFS
291
292 if [ "${2-0}" -gt 0 ]; then
293 glob "${1%/*}/*/${1##*/}" "$((${2} - 1))" "${3:-}" "${glob_N}" || :
294 fi
295
296 [ "${glob_N}" -gt 0 ]
297} # glob
298
299
300#
301# runcc [...]
302#
303# Wrapper for invoking ${CC}. Some build system include flags in ${CC},
304# invoke the compiler through env(1), or employ other hacks.
305#
306# TODO: Optionally handle unescaping of words in a manner similar to how
307# ${CC} would be evaluated from a make rule--typically by being passed
308# through system(3).
309#
310runcc() {
311 (unset IFS; exec ${CC} "$@")
312}
313
314
315#
234# evalmacro PATH MACRO [REGEX] [SUBST] 316# evalmacro PATH MACRO [REGEX] [SUBST]
235# 317#
236# PATH Header identifier--#include <PATH> 318# PATH Header identifier--#include <PATH>
@@ -240,7 +322,7 @@ append() {
240# 322#
241evalmacro() { 323evalmacro() {
242 printf "#include <$1>\n[===[$2]===]\n" \ 324 printf "#include <$1>\n[===[$2]===]\n" \
243 | "${CC:-cc}" ${CPPFLAGS:-} -E - 2>>/dev/null \ 325 | runcc ${CPPFLAGS:-} -E - 2>>/dev/null \
244 | sed -ne " 326 | sed -ne "
245 s/^.*\\[===\\[ *\\(${3:-.*}\\) *\\]===\\].*$/${4:-\\1}/ 327 s/^.*\\[===\\[ *\\(${3:-.*}\\) *\\]===\\].*$/${4:-\\1}/
246 t Found 328 t Found
@@ -267,7 +349,7 @@ testsym() {
267 # and within [A-T]. 349 # and within [A-T].
268 (nm -Pg ${1} 2>>/dev/null || nm -g 2>>/dev/null) \ 350 (nm -Pg ${1} 2>>/dev/null || nm -g 2>>/dev/null) \
269 | sed -ne '/ [A-T] /p' \ 351 | sed -ne '/ [A-T] /p' \
270 | grep -qE "${2}" 352 | grep -q "${2}"
271} 353}
272 354
273 355
@@ -398,7 +480,9 @@ luapc() {
398findinstalldir() { 480findinstalldir() {
399 V_DIR=$((${LUA_VER} / 100 % 100)).$((${LUA_VER} % 100)) 481 V_DIR=$((${LUA_VER} / 100 % 100)).$((${LUA_VER} % 100))
400 482
401 if [ "${1}" = "package.cpath" ]; then 483 if [ "${1}" = "package.cpath" -o "${1}" = "cdir" ]; then
484 ARRAY="package.cpath"
485
402 DIR="$(luapc --variable INSTALL_CMOD)" 486 DIR="$(luapc --variable INSTALL_CMOD)"
403 [ -n "${DIR}" ] && set -- "$@" "${DIR}" 487 [ -n "${DIR}" ] && set -- "$@" "${DIR}"
404 488
@@ -418,6 +502,8 @@ findinstalldir() {
418 set -- "$@" "${LUA_PATH}/../../lib/lua/${V_DIR}" 502 set -- "$@" "${LUA_PATH}/../../lib/lua/${V_DIR}"
419 set -- "$@" "${LUA_PATH}/../../lib/*/lua/${V_DIR}" # e.g. lib/x86_64-linux-gnu 503 set -- "$@" "${LUA_PATH}/../../lib/*/lua/${V_DIR}" # e.g. lib/x86_64-linux-gnu
420 else 504 else
505 ARRAY="package.path"
506
421 DIR="$(luapc --variable INSTALL_LMOD)" 507 DIR="$(luapc --variable INSTALL_LMOD)"
422 [ -n "${DIR}" ] && set -- "$@" "${DIR}" 508 [ -n "${DIR}" ] && set -- "$@" "${DIR}"
423 509
@@ -429,7 +515,6 @@ findinstalldir() {
429 set -- "$@" "${LUA_PATH}/../../share/lua/${V_DIR}" 515 set -- "$@" "${LUA_PATH}/../../share/lua/${V_DIR}"
430 fi 516 fi
431 517
432 ARRAY="${1}"
433 shift 518 shift
434 519
435 if [ $# -eq 0 ]; then 520 if [ $# -eq 0 ]; then
@@ -576,13 +661,11 @@ findversion() {
576 661
577 if [ $# -gt 0 ]; then 662 if [ $# -gt 0 ]; then
578 for D; do 663 for D; do
579 for F in $(find "${D}" ${MAXDEPTH} ${XDEV} -name lua.h -print 2>>/dev/null); do 664 glob "${D}/lua.h" "${MAXDEPTH}" tryluainclude || :
580 tryluainclude "${F}"
581 665
582 if foundversion; then 666 if foundversion; then
583 return 0 667 return 0
584 fi 668 fi
585 done
586 done 669 done
587 fi 670 fi
588 671
@@ -594,13 +677,11 @@ findversion() {
594 677
595 if [ $# -gt 0 ]; then 678 if [ $# -gt 0 ]; then
596 for D; do 679 for D; do
597 for F in $(find "${D}/." ${MAXDEPTH} ${XDEV} -name lua.h -print 2>>/dev/null); do 680 glob "${D}/lua.h" "${MAXDEPTH}" tryluainclude || :
598 tryluainclude "${F}"
599 681
600 if foundversion; then 682 if foundversion; then
601 return 0 683 return 0
602 fi 684 fi
603 done
604 done 685 done
605 fi 686 fi
606 687
@@ -612,13 +693,11 @@ findversion() {
612 D="${D%/*}/include" 693 D="${D%/*}/include"
613 694
614 if [ -d "${D}" ]; then 695 if [ -d "${D}" ]; then
615 for F in $(find "${D}" ${MAXDEPTH} ${XDEV} -name lua.h -print 2>>/dev/null); do 696 glob "${D}/lua.h" "${MAXDEPTH}" tryluainclude || :
616 tryluainclude "${F}"
617 697
618 if foundversion; then 698 if foundversion; then
619 return 0 699 return 0
620 fi 700 fi
621 done
622 fi 701 fi
623 fi 702 fi
624 703
@@ -631,9 +710,10 @@ findversion() {
631# compatible. 710# compatible.
632# 711#
633trylib() { 712trylib() {
634 if ! testsym "${1}" "lua_newstate"; then 713 testsym "${1}" "lua_newstate" || return 1
635 return 0 714
636 fi 715 # exclude C++
716 [ "${1#*++}" = "${1}" ] || return 1
637 717
638 V=0 718 V=0
639 J=0 719 J=0
@@ -662,16 +742,20 @@ trylib() {
662 if testsym "${1}" "lua_getfenv"; then 742 if testsym "${1}" "lua_getfenv"; then
663 V=501 743 V=501
664 elif testsym "${1}" "lua_yieldk"; then 744 elif testsym "${1}" "lua_yieldk"; then
665 V=502 745 if testsym "${1}" "lua_getctx"; then
746 V=502
747 else
748 V=503
749 fi
666 else 750 else
667 return 0 751 return 1
668 fi 752 fi
669 753
670 [ "$V" -gt 0 -a "$V" -ge "${LIBLUA_VER:-0}" ] || return 0 754 [ "$V" -gt 0 -a "$V" -ge "${LIBLUA_VER:-0}" ] || return 1
671 755
672 [ "$V" -gt "${LIBLUA_VER:-0}" -o "${#D}" -lt "${#LIBLUA_DIR}" -o \( "${JIT_REQ}" = "yes" -a "${LIBJIT_VER:-0}" -lt "${JIT_MAX}" \) ] || return 0 756 [ "$V" -gt "${LIBLUA_VER:-0}" -o "${#D}" -lt "${#LIBLUA_DIR}" -o \( "${JIT_REQ}" = "yes" -a "${LIBJIT_VER:-0}" -lt "${JIT_MAX}" \) ] || return 1
673 757
674 [ "$V" -ge "${API_MIN}" -a "$V" -le "${API_MAX}" ] || return 0 758 [ "$V" -ge "${API_MIN}" -a "$V" -le "${API_MAX}" ] || return 1
675 759
676 760
677 if [ -n "${JIT_REQ}" ]; then 761 if [ -n "${JIT_REQ}" ]; then
@@ -681,12 +765,12 @@ trylib() {
681 fi 765 fi
682 766
683 if [ "${JIT_REQ}" = "skip" ]; then 767 if [ "${JIT_REQ}" = "skip" ]; then
684 [ "${J}" -eq 0 ] || return 0 768 [ "${J}" -eq 0 ] || return 1
685 elif [ "${JIT_REQ}" = "yes" ]; then 769 elif [ "${JIT_REQ}" = "yes" ]; then
686 [ "$J" -ge "${LIBJIT_VER:-0}" ] || return 0 770 [ "$J" -ge "${LIBJIT_VER:-0}" ] || return 1
687 [ "$J" -gt "${LIBJIT_VER:-0}" -o "${#D}" -lt "${#LIBJIT_DIR}" ] || return 0 771 [ "$J" -gt "${LIBJIT_VER:-0}" -o "${#D}" -lt "${#LIBJIT_DIR}" ] || return 1
688 [ "$J" -ge ${JIT_MIN} ] || return 0 772 [ "$J" -ge ${JIT_MIN} ] || return 1
689 [ "$J" -le "${JIT_MAX}" ] || return 0 773 [ "$J" -le "${JIT_MAX}" ] || return 1
690 774
691 LIBJIT_VER="$J" 775 LIBJIT_VER="$J"
692 LIBJIT_DIR="$D" 776 LIBJIT_DIR="$D"
@@ -745,15 +829,17 @@ findlib() {
745 829
746 #printf -- "I=$I K=$K $findlib_L/lib$findlib_l*.*\n" 830 #printf -- "I=$I K=$K $findlib_L/lib$findlib_l*.*\n"
747 831
748 for findlib_R in no ${RECURSE}; do 832 glob "${findlib_L}/lib${findlib_l}*.*" 0 trylib || :
749 for findlib_lib in $(findpath "lib${findlib_l}*.*" ${findlib_R} "${findlib_L}"); do
750 trylib "${findlib_lib}"
751 done
752 833
753 if foundlib; then 834 if foundlib; then
754 return 0 835 return 0;
755 fi 836 fi
756 done 837
838 glob "${findlib_L}/lib${findlib_l}*.*" ${MAXDEPTH} trylib || :
839
840 if foundlib; then
841 return 0;
842 fi
757 843
758 K=$(($K + 1)) 844 K=$(($K + 1))
759 done 845 done
@@ -768,48 +854,73 @@ findlib() {
768 unset IFS 854 unset IFS
769 855
770 for findlib_D; do 856 for findlib_D; do
771 for findlib_R in no ${RECURSE}; do 857 glob "${findlib_D}/liblua*.*" "${MAXDEPTH}" trylib || :
772 for findlib_lib in $(findpath "liblua*.*" ${findlib_R} "${findlib_D}"); do 858
773 trylib "${findlib_lib}" 859 if foundlib; then
774 done 860 return 0
861 fi
862 done
863
864 # if we can find the lua interpreter, use it as a reference for
865 # library locations.
866 if findlua; then
867 findlib_D="${LUA_PATH%/*}"
868 findlib_D="${findlib_D%/*}/lib"
869
870 if [ -d "${findlib_D}" ]; then
871 glob "${findlib_D}/liblua*.*" "${MAXDEPTH}" trylib || :
775 872
776 if foundlib; then 873 if foundlib; then
777 return 0 874 return 0
778 fi 875 fi
779 done 876 fi
780 done 877 fi
781} 878}
782 879
783 880
784findpath() { 881# check setuid and setgid mode
785 NAME="$1" 882safeperm() {
786 WHERE="$3" 883 [ -f "$1" -a ! -u "$1" -a ! -g "$1" ]
884}
787 885
788 PRUNE=
789 886
790 if [ "${2}" = "no" ]; then 887tryluac() {
791 PRUNE="-name . -o -type d -prune -o" 888 tryluac_F="${1}"
792 fi
793 889
794 [ ${#WHERE} -gt 0 ] || return 0 890 [ -x "${tryluac_F}" ] && safeperm "${tryluac_F}" || return 0
795 891
796 IFS=: 892 tryluac_V="$("${tryluac_F}" -v </dev/null 2>&1 | head -n1 | sed -ne 's/^Lua \([0123456789][0123456789]*\.[0123456789][0123456789]*\).*/\1/p')"
797 set -- ${WHERE} 893 : ${tryluac_V:=0}
798 unset IFS 894 tryluac_V="$((${tryluac_V%%.*} * 100 + ${tryluac_V##*.} % 100))"
799 895
800 if [ $# -gt 0 ]; then 896 [ "${tryluac_V}" -gt 0 -a "${tryluac_V}" -ge "${LUAC_VER:-0}" ] || return 0
801 for findpath_D; do
802 find "${findpath_D}/." ${MAXDEPTH} ${XDEV} ${PRUNE} -name "${NAME}" -print 2>>/dev/null | sed -e 's/\/\.//'
803 done
804 fi
805}
806 897
898 [ "${tryluac_V}" -gt "${LUAC_VER:-0}" -o "${#tryluac_F}" -lt "${#LUAC_PATH}" ] || return 0
807 899
808# check setuid and setgid mode 900 [ "${tryluac_V}" -ge "${API_MIN}" -a "${tryluac_V}" -le "${API_MAX}" ] || return 0
809safeperm() { 901
810 [ -f "$1" -a ! -u "$1" -a ! -g "$1" ] 902 printf "return true" 2>>/dev/null | ${tryluac_F} -p - </dev/null >>/dev/null 2>&1 || return 0
903
904 LUAC_PATH="${tryluac_F}"
905 LUAC_VER="${tryluac_V}"
811} 906}
812 907
908#
909# foundluac
910#
911# true if found the best (maximum) possible version, false otherwise
912#
913foundluac() {
914 if [ "${LUAC_VER:-0}" -lt "${API_MAX}" ]; then
915 return 1
916 fi
917
918 if [ "${SHORTEST}" = "yes" ]; then
919 return 1
920 fi
921
922 return 0
923}
813 924
814findluac() { 925findluac() {
815 if [ $# -eq 0 ]; then 926 if [ $# -eq 0 ]; then
@@ -818,36 +929,33 @@ findluac() {
818 unset IFS 929 unset IFS
819 fi 930 fi
820 931
821 while [ $# -gt 0 ]; do 932 for findluac_G; do
822 for F in $(findpath "${1}" no "${PATH}"; findpath "${1}" "${RECURSE}" "${BINDIRS}"); do 933 IFS=:
823 [ -x "$F" ] && safeperm "$F" || continue 934 for findluac_D in ${PATH}; do
824 935 unset IFS
825 V="$("$F" -v </dev/null 2>&1 | head -n1 | sed -ne 's/^Lua \([0123456789][0123456789]*\.[0123456789][0123456789]*\).*/\1/p')"
826 : ${V:=0}
827 V="$((${V%%.*} * 100 + ${V##*.} % 100))"
828
829 [ "${V}" -gt 0 -a "${V}" -ge "${LUAC_VER:-0}" ] || continue
830 936
831 [ "${V}" -gt "${LUAC_VER:-0}" -o "${#F}" -lt "${#LUAC_PATH}" ] || continue 937 glob "${findluac_D}/${findluac_G}" 0 tryluac || :
832 938
833 [ "${V}" -ge "${API_MIN}" -a "${V}" -le "${API_MAX}" ] || continue 939 if foundluac; then
940 return 0
941 fi
942 done
834 943
835 printf "return true" 2>>/dev/null | ${F} -p - </dev/null >>/dev/null 2>&1 || continue 944 IFS=:
945 for findluac_D in ${BINDIRS}; do
946 unset IFS
836 947
837 LUAC_PATH="$F" 948 glob "${findluac_D}/${findluac_G}" "${MAXDEPTH}" tryluac || :
838 LUAC_VER="$V"
839 949
840 [ "${SHORTEST}" = "yes" -o "${LUAC_VER}" -lt "${API_MAX}" ] || break 2 950 if foundluac; then
951 return 0
952 fi
841 done 953 done
842 954
843 shift 955 unset IFS
844 done 956 done
845 957
846 if [ -n "${LUAC_PATH}" -a -n "${LUAC_VER}" ]; then 958 [ "${LUAC_VER:-0}" -gt 0 ] && [ "${#LUAC_PATH}" -gt 0 ]
847 return 0
848 else
849 return 1
850 fi
851} 959}
852 960
853 961
@@ -871,7 +979,7 @@ isinteger() {
871checkints() { 979checkints() {
872 while [ $# -gt 0 ]; do 980 while [ $# -gt 0 ]; do
873 if ! isinteger "${1}"; then 981 if ! isinteger "${1}"; then
874 printf -- "${0##*/}: ${1}: not a number\n" >&2 982 warn "%s: not a number" "${1}"
875 return 1 983 return 1
876 fi 984 fi
877 985
@@ -946,6 +1054,54 @@ mmp2num() {
946} 1054}
947 1055
948 1056
1057trylua() {
1058 trylua_F="${1}"
1059 [ -x "${trylua_F}" ] && safeperm "${trylua_F}" || return 0
1060
1061 trylua_V="$("${trylua_F}" -e 'print(string.match(_VERSION, [[[%d.]+]]))' </dev/null 2>>/dev/null | head -n1 | sed -ne 's/^\([0123456789][0123456789]*\.[0123456789][0123456789]*\).*/\1/p')"
1062 : ${trylua_V:=0}
1063 trylua_V="$((${trylua_V%%.*} * 100 + ${trylua_V##*.} % 100))"
1064
1065 [ "${trylua_V}" -gt 0 -a "${trylua_V}" -ge "${LUA_VER:-0}" ] || return 0
1066
1067 [ "${trylua_V}" -gt "${LUA_VER:-0}" -o "${#trylua_F}" -lt "${#LUA_PATH}" ] || return 0
1068
1069 [ "${trylua_V}" -ge "${API_MIN}" -a "${trylua_V}" -le "${API_MAX}" ] || return 0
1070
1071 if [ -n "${JIT_REQ}" ]; then
1072 J="$("${trylua_F}" -v </dev/null 2>&1 | head -n1 | sed -ne 's/^LuaJIT \([0123456789][0123456789]*\.[0123456789][0123456789]*\.[0123456789][0123456789]*\).*/\1/p')"
1073 J="$(jit2num ${J:-0})"
1074
1075 if [ "${JIT_REQ}" = "skip" ]; then
1076 [ "${J}" -eq 0 ] || return 0
1077 elif [ "${JIT_REQ}" = "yes" ]; then
1078 [ "${J}" -gt 0 ] || return 0
1079 [ "${J}" -ge "${JIT_MIN}" ] || return 0
1080 [ "${J}" -le "${JIT_MAX}" ] || return 0
1081 fi
1082 fi
1083
1084 LUA_PATH="${trylua_F}"
1085 LUA_VER="${trylua_V}"
1086}
1087
1088#
1089# foundlua
1090#
1091# true if found the best (maximum) possible version, false otherwise
1092#
1093foundlua() {
1094 if [ "${LUA_VER:-0}" -lt "${API_MAX}" ]; then
1095 return 1
1096 fi
1097
1098 if [ "${SHORTEST}" = "yes" ]; then
1099 return 1
1100 fi
1101
1102 return 0
1103}
1104
949findlua() { 1105findlua() {
950 if [ $# -eq 0 ]; then 1106 if [ $# -eq 0 ]; then
951 IFS=: 1107 IFS=:
@@ -953,52 +1109,38 @@ findlua() {
953 unset IFS 1109 unset IFS
954 fi 1110 fi
955 1111
956 while [ $# -gt 0 ]; do 1112 for findlua_G; do
957 for F in $(findpath "${1}" no "${PATH}"; findpath "${1}" "${RECURSE}" "${BINDIRS}"); do 1113 IFS=:
958 [ -x "$F" ] && safeperm "$F" || continue 1114 for findlua_D in ${PATH}; do
959 1115 unset IFS
960 V="$("$F" -e 'print(string.match(_VERSION, [[[%d.]+]]))' </dev/null 2>>/dev/null | head -n1 | sed -ne 's/^\([0123456789][0123456789]*\.[0123456789][0123456789]*\).*/\1/p')"
961 : ${V:=0}
962 V="$((${V%%.*} * 100 + ${V##*.} % 100))"
963 1116
964 [ "${V}" -gt 0 -a "${V}" -ge "${LUA_VER:-0}" ] || continue 1117 glob "${findlua_D}/${findlua_G}" 0 trylua || :
965 1118
966 [ "${V}" -gt "${LUA_VER:-0}" -o "${#F}" -lt "${#LUA_PATH}" ] || continue 1119 if foundlua; then
1120 return 0
1121 fi
1122 done
967 1123
968 [ "${V}" -ge "${API_MIN}" -a "${V}" -le "${API_MAX}" ] || continue 1124 IFS=:
1125 for findlua_D in ${BINDIRS}; do
1126 unset IFS
969 1127
970 if [ -n "${JIT_REQ}" ]; then 1128 glob "${findlua_D}/${findlua_G}" "${MAXDEPTH}" trylua || :
971 J="$("$F" -v </dev/null 2>&1 | head -n1 | sed -ne 's/^LuaJIT \([0123456789][0123456789]*\.[0123456789][0123456789]*\.[0123456789][0123456789]*\).*/\1/p')"
972 J="$(jit2num ${J:-0})"
973 1129
974 if [ "${JIT_REQ}" = "skip" ]; then 1130 if foundlua; then
975 [ "${J}" -eq 0 ] || continue 1131 return 0
976 elif [ "${JIT_REQ}" = "yes" ]; then
977 [ "${J}" -gt 0 ] || continue
978 [ "${J}" -ge "${JIT_MIN}" ] || continue
979 [ "${J}" -le "${JIT_MAX}" ] || continue
980 fi
981 fi 1132 fi
982
983 LUA_PATH="$F"
984 LUA_VER="$V"
985
986 [ "${SHORTEST}" = "yes" -o "${LUA_VER}" -lt "${API_MAX}" ] || break 2
987 done 1133 done
988 1134
989 shift 1135 unset IFS
990 done 1136 done
991 1137
992 if [ -n "${LUA_PATH}" -a -n "${LUA_VER}" ]; then 1138 [ "${LUA_VER:-0}" -gt 0 ] && [ "${#LUA_PATH}" -gt 0 ]
993 return 0
994 else
995 return 1
996 fi
997} 1139}
998 1140
999 1141
1000ccname() { 1142ccname() {
1001 "${CC}" -E - <<-EOF | awk '/sunpro/||/clang/||/gcc/||/other/{ print $1; exit; }' 1143 runcc -E - <<-EOF | awk '/sunpro/||/clang/||/gcc/||/other/{ print $1; exit; }'
1002 #if defined __SUNPRO_C 1144 #if defined __SUNPRO_C
1003 sunpro 1145 sunpro
1004 #elif defined __clang__ 1146 #elif defined __clang__
@@ -1026,8 +1168,7 @@ usage() {
1026 -e GLOB glob pattern for finding utilities (lua, luac, etc) 1168 -e GLOB glob pattern for finding utilities (lua, luac, etc)
1027 -k query pkg-config if available 1169 -k query pkg-config if available
1028 -r recursively search directories 1170 -r recursively search directories
1029 -m MAXDEPTH limit recursion to MAXDEPTH (only for GNU and BSD find) 1171 -m MAXDEPTH limit recursion to MAXDEPTH
1030 -x do not cross device mounts when recursing
1031 -s find shortest pathname, otherwise print first best match 1172 -s find shortest pathname, otherwise print first best match
1032 -v VERSION require specific Lua version or range 1173 -v VERSION require specific Lua version or range
1033 (e.g. "5.1" or "5.1-5.2") 1174 (e.g. "5.1" or "5.1-5.2")
@@ -1038,8 +1179,10 @@ usage() {
1038 -h print this usage message 1179 -h print this usage message
1039 1180
1040 cppflags print derived additional CPPFLAGS necessary 1181 cppflags print derived additional CPPFLAGS necessary
1182 version print derived Lua API version from cppflags discovery
1041 ldflags print derived additional LDFLAGS necessary (TODO) 1183 ldflags print derived additional LDFLAGS necessary (TODO)
1042 version print derived Lua API version 1184 libs print derived additional LIBS necessary (TODO)
1185 libversion print derived Lua API version from ldflags/libs discovery
1043 luac print path to luac utility ($(printf "${GLOB_LUA}" | tr ':' ' ')) 1186 luac print path to luac utility ($(printf "${GLOB_LUA}" | tr ':' ' '))
1044 lua print path to lua interpreter ($(printf "${GLOB_LUAC}" | tr ':' ' ')) 1187 lua print path to lua interpreter ($(printf "${GLOB_LUAC}" | tr ':' ' '))
1045 package.path print preferred module install path 1188 package.path print preferred module install path
@@ -1114,20 +1257,21 @@ while getopts I:L:P:d:De:krm:xsv:j:JVh OPT; do
1114 RECURSE=yes 1257 RECURSE=yes
1115 ;; 1258 ;;
1116 m) 1259 m)
1117 if [ -n "${OPTARG##[0123456789]}" ]; then 1260 if [ "${#OPTARG}" -eq 0 -o -n "${OPTARG##[0123456789]}" ]; then
1118 printf -- "${0##*/}: ${OPTARG}: invalid maxdepth\n" >&2 1261 panic "%s: invalid maxdepth" "${OPTARG}"
1119 exit 1
1120 fi
1121
1122 if find "${TMPDIR:-/tmp}" -maxdepth ${OPTARG} -prune >>/dev/null 2>&1; then
1123 MAXDEPTH="-maxdepth ${OPTARG}"
1124 else
1125 printf -- "${0##*/}: $(command -v find): -maxdepth unsupported\n" >&2
1126 fi 1262 fi
1127 1263
1264 MAXDEPTH="${OPTARG}"
1128 ;; 1265 ;;
1129 x) 1266 x)
1130 XDEV="-xdev" 1267 #
1268 # NOTE: This option was
1269 #
1270 # -x do not cross device mounts when recursing
1271 #
1272 # but is currently unsupported as our built-in glob function
1273 # does not implement this functionality. Previously this
1274 # option caused -xdev to be added to invocations of find(1).
1131 ;; 1275 ;;
1132 s) 1276 s)
1133 SHORTEST=yes 1277 SHORTEST=yes
@@ -1140,8 +1284,7 @@ while getopts I:L:P:d:De:krm:xsv:j:JVh OPT; do
1140 API_MAX="$(lua2num ${MAX:-99} 99)" 1284 API_MAX="$(lua2num ${MAX:-99} 99)"
1141 1285
1142 if [ "${API_MIN}" -gt "${API_MAX}" ]; then 1286 if [ "${API_MIN}" -gt "${API_MAX}" ]; then
1143 printf -- "${0##*/}: ${OPTARG}: invalid version range\n" >&2 1287 panic "%s: invalid version range" "${OPTARG}"
1144 exit 1
1145 fi 1288 fi
1146 1289
1147 ;; 1290 ;;
@@ -1153,8 +1296,7 @@ while getopts I:L:P:d:De:krm:xsv:j:JVh OPT; do
1153 JIT_MAX="$(jit2num ${MAX:-99} 99 99)" 1296 JIT_MAX="$(jit2num ${MAX:-99} 99 99)"
1154 1297
1155 if [ "${JIT_MIN}" -gt "${JIT_MAX}" ]; then 1298 if [ "${JIT_MIN}" -gt "${JIT_MAX}" ]; then
1156 printf -- "${0##*/}: ${OPTARG}: invalid version range\n" >&2 1299 panic "%s: invalid version range" "${OPTARG}"
1157 exit 1
1158 fi 1300 fi
1159 1301
1160 JIT_REQ=yes 1302 JIT_REQ=yes
@@ -1180,10 +1322,16 @@ done
1180shift $(($OPTIND - 1)) 1322shift $(($OPTIND - 1))
1181 1323
1182 1324
1183for U in "${CC:-cc}" find grep od rm rmdir sed xargs; do 1325[ "${RECURSE}" = "yes" ] || MAXDEPTH=0
1184 if ! command -v "${U}" >>/dev/null 2>&1; then 1326
1185 printf -- "${0##*/}: ${U}: command not found\n" >&2 1327
1186 fi 1328for U in "${CC}" grep od rm rmdir sed xargs; do
1329 ! command -v "${U}" >>/dev/null 2>&1 || continue
1330
1331 # ${CC} might have trailing flags or invoke the compiler through env
1332 ! command -v "${U%% *}" >>/dev/null 2>&1 || continue
1333
1334 warn "%s: command not found" "${U}"
1187done 1335done
1188 1336
1189 1337
@@ -1191,15 +1339,13 @@ if [ -n "${SANDBOX}" ]; then
1191 if [ "${SANDBOX}" = "${SANDBOX%/}" ]; then 1339 if [ "${SANDBOX}" = "${SANDBOX%/}" ]; then
1192 if [ ! -c "${DEVRANDOM}" ]; then 1340 if [ ! -c "${DEVRANDOM}" ]; then
1193 # TODO: expand DEVRANDOM into set of different possibilities to check 1341 # TODO: expand DEVRANDOM into set of different possibilities to check
1194 printf -- "${0##*/}: ${DEVRANDDOM}: no character random device available\n" >&2 1342 panic "%s: no character random device available" "${DEVRANDOM}"
1195 exit 1
1196 fi 1343 fi
1197 1344
1198 TMP="${SANDBOX}$(od -An -N8 -tx1 < ${DEVRANDOM} 2>>/dev/null | tr -d ' ')" 1345 TMP="${SANDBOX}$(od -An -N8 -tx1 < ${DEVRANDOM} 2>>/dev/null | tr -d ' ')"
1199 1346
1200 if [ ${#TMP} -ne $((${#SANDBOX} + 16)) ]; then 1347 if [ ${#TMP} -ne $((${#SANDBOX} + 16)) ]; then
1201 printf -- "${0##*/}: ${SANDBOX}: unable to generate random suffix\n" >&2 1348 panic "%s: unable to generate random suffix" "${SANDBOX}"
1202 exit 1
1203 fi 1349 fi
1204 1350
1205 SANDBOX="${TMP}" 1351 SANDBOX="${TMP}"
@@ -1241,18 +1387,28 @@ cppflags)
1241 [ -z "${API_DIR:-}" ] || printf -- "-I${API_DIR}\n" 1387 [ -z "${API_DIR:-}" ] || printf -- "-I${API_DIR}\n"
1242 1388
1243 ;; 1389 ;;
1390version)
1391 findversion || exit 1
1392
1393 printf "$(((${API_VER} / 100) % 100)).$((($API_VER) % 100))\n"
1394
1395 ;;
1244ldflags) 1396ldflags)
1245 findlib 1397 findlib
1246 1398
1247 [ "${LIBLUA_VER:-0}" -gt 0 ] || exit 1 1399 [ "${LIBLUA_VER:-0}" -gt 0 ] || exit 1
1248 1400
1249 printf -- "-L${LIBLUA_DIR} -l${LIBLUA_LIB}\n" 1401 if [ "${#LIBLUA_DIR}" -gt 0 ]; then
1402 printf -- "-L%s\n" "${LIBLUA_DIR}"
1403 fi
1250 1404
1251 ;; 1405 ;;
1252version) 1406libs)
1253 findversion || exit 1 1407 findlib
1254 1408
1255 printf "$(((${API_VER} / 100) % 100)).$((($API_VER) % 100))\n" 1409 [ "${LIBLUA_VER:-0}" -gt 0 ] || exit 1
1410
1411 printf -- "-l%s\n" "${LIBLUA_LIB}"
1256 1412
1257 ;; 1413 ;;
1258libv*) 1414libv*)
@@ -1288,21 +1444,38 @@ lua)
1288 1444
1289 ;; 1445 ;;
1290ldir|cdir) 1446ldir|cdir)
1291 printf -- "${0##*/}: ${1}: deprecated command\n" >&2 1447 #
1292 MODE="${1}" 1448 # ldir and cdir were deprecated on 2014-12-18. On 2016-03-25 they
1293 shift 1449 # were revived because their names are more intuitive than
1450 # package.path and package.cpath. For now try to support the
1451 # semantics of both by assuming interpreter glob patterns only match
1452 # file names, while preferred install directory string.match
1453 # expressions have directory components.
1454 #
1455 if true; then
1456 MODE="${1}"
1457
1458 # move command to end; rotates to ${1} after loop
1459 set -- "$@" "${1}"
1460 shift
1294 1461
1295 if [ $# -gt 0 ]; then 1462 cdir_I=0
1296 append GLOB $* 1463 cdir_N="$(($# - 1))"
1464 while [ "${cdir_I}" -lt "${cdir_N}" ]; do
1465 if [ "${1#*/}" = "${1}" ]; then
1466 append GLOB "${1}"
1467 warn "%s: passing glob patterns to %s is deprecated" "${1}" "${MODE}"
1468 else
1469 set -- "$@" "${1}"
1470 fi
1471 shift
1472 cdir_I=$((${cdir_I} + 1))
1473 done
1297 fi 1474 fi
1298 1475
1299 findlua || exit 1 1476 findlua || exit 1
1300 1477
1301 if [ "${MODE}" = "cdir" ]; then 1478 findinstalldir "$@" || exit 1
1302 findinstalldir package.cpath
1303 else
1304 findinstalldir package.path
1305 fi
1306 1479
1307 ;; 1480 ;;
1308package.path|package.cpath) 1481package.path|package.cpath)
@@ -1333,9 +1506,9 @@ testsym)
1333 ;; 1506 ;;
1334*) 1507*)
1335 if [ -n "${1:-}" ]; then 1508 if [ -n "${1:-}" ]; then
1336 printf -- "${0##*/}: ${1}: unknown command\n" >&2 1509 warn "%s: unknown command" "${1}"
1337 else 1510 else
1338 printf -- "${0##*/}: no command specified\n" >&2 1511 warn "no command specified"
1339 fi 1512 fi
1340 1513
1341 exit 1 1514 exit 1