summaryrefslogtreecommitdiff
path: root/mk
diff options
context:
space:
mode:
authorwilliam <william@25thandclement.com>2015-04-22 15:50:23 -0700
committerwilliam <william@25thandclement.com>2015-04-22 15:50:23 -0700
commit753b60b0f479e226ecdf7e781804906aa8ee369f (patch)
tree9ccbb398cc17d22aa7cdad3c5eac9a9c9b40c1dc /mk
parentb6ce57a198ed27f314b7183a0876c30f719ef69b (diff)
downloadluaossl-753b60b0f479e226ecdf7e781804906aa8ee369f.tar.gz
luaossl-753b60b0f479e226ecdf7e781804906aa8ee369f.tar.bz2
luaossl-753b60b0f479e226ecdf7e781804906aa8ee369f.zip
update luapath script
Diffstat (limited to 'mk')
-rwxr-xr-xmk/lua.path459
1 files changed, 402 insertions, 57 deletions
diff --git a/mk/lua.path b/mk/lua.path
index eb10d39..8df41c9 100755
--- a/mk/lua.path
+++ b/mk/lua.path
@@ -22,7 +22,7 @@
22# warned. 22# warned.
23# 23#
24# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 24# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
25# 25#
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,
@@ -50,9 +50,41 @@
50# 50#
51# * 2013-10-22 - Initial ldflags detection. 51# * 2013-10-22 - Initial ldflags detection.
52# 52#
53# * 2014-01-26 - Migrate CC vendor detection from external script.
54#
55# * 2014-09-29 - Add ldir and cdir modes which print install path by parsing
56# package.path and package.cpath.
57#
58# * 2014-12-18 - Add -e GLOB option.
59#
60# Deprecate ldir and cdir modes.
61#
62# Add package.path and package.cpath to replace ldir and dir modes.
63# Optional arguments to the new modes are preferred install paths,
64# rather than globs for finding the lua utility path (use the new -e
65# option, instead).
66#
67# * 2014-12-19 - Fix pkg-config version matching. The --modversion of
68# the lua package might be stale. For example, it's 5.2.0 on Ubuntu
69# 14.04 even though the Lua release is 5.2.3.
70#
71# Use the interpreter path as a reference point when searching for
72# headers. $(dirname ${LUA_PATH})/../include is a very likely location
73# as bindir and includedir have the same prefix in most installations.
74#
75# * 2015-01-15 - Quote more command names and arguments. Still need to
76# handle space characters in code that employs command substitution. I
77# think we could handle all whitespace characters, including newlines,
78# by using a control character in IFS and using --exec printf "%s\1" {}
79# rather than -print with find(1).
80#
81# * 2015-01-19 - Add fix for LuaJIT's default package.cpath, which tends to
82# hardcode /usr/local/lib/lua/5.1, ordered before the LuaJIT
83# installation prefix.
84#
53# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 85# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
54# 86#
55# Copyright (C) 2012-2013 William Ahern 87# Copyright (C) 2012-2015 William Ahern
56# 88#
57# Permission is hereby granted, free of charge, to any person obtaining a 89# Permission is hereby granted, free of charge, to any person obtaining a
58# copy of this software and associated documentation files (the "Software"), 90# copy of this software and associated documentation files (the "Software"),
@@ -81,8 +113,10 @@ export LC_ALL=C # no locale headaches
81unset IFS # no field splitting surprises 113unset IFS # no field splitting surprises
82: ${TMPDIR:=/tmp} # sane TMPDIR 114: ${TMPDIR:=/tmp} # sane TMPDIR
83: ${CC:=cc} 115: ${CC:=cc}
116unset LUA_PATH || true # interferes search for module install directory
117unset LUA_CPATH || true
84 118
85MYVERSION=20131025 119MYVERSION=20150119
86MYVENDOR="william@25thandClement.com" 120MYVENDOR="william@25thandClement.com"
87 121
88 122
@@ -99,6 +133,10 @@ MAXDEPTH= # full command switch, like "-maxdepth 3", if supported
99XDEV= # do not cross device boundaries; i.e. "-xdev" 133XDEV= # do not cross device boundaries; i.e. "-xdev"
100SHORTEST= # continue searching until shortest pathname found 134SHORTEST= # continue searching until shortest pathname found
101PKGCONFIG= # path to pkg-config, found by `command -v` when -k option invoked 135PKGCONFIG= # path to pkg-config, found by `command -v` when -k option invoked
136GLOB= # -e GLOB expression for lua, luac, ldir, and cdir
137
138GLOB_LUA="lua:lua[5-9]*:lua-[5-9]*:luajit*"
139GLOB_LUAC="luac:luac[5-9]*:luac-[5-9]*"
102 140
103API_MIN=500 141API_MIN=500
104API_MAX=999 142API_MAX=999
@@ -135,7 +173,7 @@ xdirs() {
135 173
136 set -- ${2:-} 174 set -- ${2:-}
137 175
138 while [ $# -gt 0 ]; do 176 while [ $# -gt 0 ]; do
139 case "${1}" in 177 case "${1}" in
140 -${OPTC}) 178 -${OPTC})
141 shift 179 shift
@@ -167,27 +205,42 @@ ldirs() {
167 xdirs "L" "${1:-}" 205 xdirs "L" "${1:-}"
168} 206}
169 207
170# count ":" delimited directories generated by xdirs 208# count ":"-delimited substrings
171ndirs() { 209count() {
172 IFS=: 210 IFS=:
173 set -- ${1:-} 211 set -- ${1:-}
174 unset IFS 212 unset IFS
175 213
176 printf "$#\n" 214 printf "$#"
177} 215}
178 216
217# append to ":"-delimited string variable
218append() {
219 NAME=${1}
220 eval VALUE="\${${NAME}}"
221 shift
222
223 IFS=:
224 TMP="$*"
225
226 IFS="\n"
227 read -r "${NAME}" <<-EOF
228 ${VALUE:-}${VALUE:+:}${TMP}
229 EOF
230 unset IFS
231}
179 232
180# 233#
181# evalmacro PATH MACRO [REGEX] [SUBST] 234# evalmacro PATH MACRO [REGEX] [SUBST]
182# 235#
183# PATH Header identifier--#include <PATH> 236# PATH Header identifier--#include <PATH>
184# MACRO Macro identifier 237# MACRO Macro identifier
185# REGEX Optional regex pattern to match macro evalutation result 238# REGEX Optional regex pattern to match macro evaluation result
186# SUBST Optional replacement expression 239# SUBST Optional replacement expression
187# 240#
188evalmacro() { 241evalmacro() {
189 printf "#include <$1>\n[===[$2]===]\n" \ 242 printf "#include <$1>\n[===[$2]===]\n" \
190 | ${CC:-cc} ${CPPFLAGS:-} -E - 2>>/dev/null \ 243 | "${CC:-cc}" ${CPPFLAGS:-} -E - 2>>/dev/null \
191 | sed -ne " 244 | sed -ne "
192 s/^.*\\[===\\[ *\\(${3:-.*}\\) *\\]===\\].*$/${4:-\\1}/ 245 s/^.*\\[===\\[ *\\(${3:-.*}\\) *\\]===\\].*$/${4:-\\1}/
193 t Found 246 t Found
@@ -219,7 +272,7 @@ testsym() {
219 272
220 273
221tryluainclude() { 274tryluainclude() {
222 V="$(evalmacro ${1} LUA_VERSION_NUM '[0123456789][0123456789]*')" 275 V="$(evalmacro "${1}" LUA_VERSION_NUM '[0123456789][0123456789]*')"
223 : ${V:=0} 276 : ${V:=0}
224 277
225 if [ "${1%/*}" != "${1}" ]; then 278 if [ "${1%/*}" != "${1}" ]; then
@@ -242,7 +295,7 @@ tryluainclude() {
242 [ "$V" -ge "${API_MIN}" -a "$V" -le "${API_MAX}" ] || return 0 295 [ "$V" -ge "${API_MIN}" -a "$V" -le "${API_MAX}" ] || return 0
243 296
244 if [ -n "${JIT_REQ}" ]; then 297 if [ -n "${JIT_REQ}" ]; then
245 J="$(evalmacro ${1%%lua.h}luajit.h LUAJIT_VERSION_NUM '[0123456789][0123456789]*')" 298 J="$(evalmacro "${1%%lua.h}luajit.h" LUAJIT_VERSION_NUM '[0123456789][0123456789]*')"
246 : ${J:=0} 299 : ${J:=0}
247 300
248 if [ "${JIT_REQ}" = "skip" ]; then 301 if [ "${JIT_REQ}" = "skip" ]; then
@@ -286,6 +339,167 @@ foundversion() {
286 339
287 340
288# 341#
342# luapc
343#
344# wrapper around `pkg-config ... LIB`, where LIB is derived by
345# searching for all libraries with "lua" in the name that have a
346# --modversion equal to the release version printed by ${LUA_PATH} -v.
347#
348LUAPC_LIB=
349
350luapc() {
351 [ -n "${LUA_PATH}" ] || return 0
352
353 [ -n "${PKGCONFIG}" ] || return 0
354
355 # find pkg-config library name
356 if [ -z "${LUAPC_LIB}" ]; then
357 V="$("${LUA_PATH}" -v </dev/null 2>&1 | head -n1 | sed -ne 's/^Lua[^ ]* \([0123456789][0123456789]*\(\.[0123456789][0123456789]*\)*\).*/\1/p')"
358
359 [ -n "${V}" ] || return 0
360
361 V_N=$(mmp2num "${V}")
362
363 for LIB in $("${PKGCONFIG}" --list-all </dev/null 2>>/dev/null | sed -ne 's/^\(lua[^ ]*\).*/\1/p'); do
364 M="$("${PKGCONFIG}" --modversion ${LIB} || true)"
365
366 # break immediately on exact match
367 if [ "${V}" = "${M}" ]; then
368 LUAPC_LIB="${LIB}"
369
370 break
371 fi
372
373 #
374 # NOTE: On Ubuntu 14.04 pkg-config --modversion
375 # lua5.2 prints 5.2.0 even though the release
376 # version is 5.2.3 (what lua5.2 -v prints).
377 #
378 # If the major.minor components match, then
379 # tentatively use that package name.
380 #
381 M_N=$(mmp2num "${M}" 0 0 0)
382
383 if [ "$((${V_N} / 100))" -eq "$((${M_N} / 100))" ]; then
384 LUAPC_LIB="${LIB}"
385 fi
386 done
387
388 [ -n "${LUAPC_LIB}" ] || return 0
389 fi
390
391 ${PKGCONFIG} "$@" "${LUAPC_LIB}" </dev/null 2>>/dev/null || true
392}
393
394
395#
396# findinstalldir package.path|package.cpath [preferred-path ...]
397#
398findinstalldir() {
399 V_DIR=$((${LUA_VER} / 100 % 100)).$((${LUA_VER} % 100))
400
401 if [ "${1}" = "package.cpath" ]; then
402 DIR="$(luapc --variable INSTALL_CMOD)"
403 [ -n "${DIR}" ] && set -- "$@" "${DIR}"
404
405 DIR="$(luapc --variable INSTALL_LIB)"
406 [ -n "${DIR}" ] && set -- "$@" "${DIR}/lua/${V_DIR}"
407
408 DIR="$(luapc --variable libdir)"
409 [ -n "${DIR}" ] && set -- "$@" "${DIR}/lua/${V_DIR}"
410
411 DIR="$(luapc --variable prefix)"
412 [ -n "${DIR}" ] && set -- "$@" "${DIR}/lib/lua/${V_DIR}"
413
414 # LuaJIT installations tend to include
415 # /usr/local/lib/lua/5.1 as one of the first paths, ordered
416 # before the LuaJIT installation prefix, and regardless of
417 # whether there exists a /usr/local/lib/lua/5.1.
418 set -- "$@" "${LUA_PATH}/../../lib/lua/${V_DIR}"
419 set -- "$@" "${LUA_PATH}/../../lib/*/lua/${V_DIR}" # e.g. lib/x86_64-linux-gnu
420 else
421 DIR="$(luapc --variable INSTALL_LMOD)"
422 [ -n "${DIR}" ] && set -- "$@" "${DIR}"
423
424 DIR="$(luapc --variable prefix)"
425 [ -n "${DIR}" ] && set -- "$@" "${DIR}/share/lua/${V_DIR}"
426
427 # See above LuaJIT note. Although the built-in package.path
428 # usually orders the LuaJIT installation prefix first.
429 set -- "$@" "${LUA_PATH}/../../share/lua/${V_DIR}"
430 fi
431
432 ARRAY="${1}"
433 shift
434
435 if [ $# -eq 0 ]; then
436 set -- "/nonexistent" # cannot expand empty $@ on some implementations
437 fi
438
439 "${LUA_PATH}" - "$@" <<-EOF
440 --
441 -- actual pkg-config variable on Ubuntu 14.04
442 --
443 -- /usr//share/lua/5.1
444 --
445 local function fixpath(path)
446 local stack = { path:match"^/" and "" or "." }
447
448 for ent in path:gmatch"([^/]+)" do
449 if ent == ".." and #stack > 1 then
450 stack[#stack] = nil
451 elseif ent ~= "." then
452 stack[#stack + 1] = ent
453 end
454 end
455
456 return table.concat(stack, "/")
457 end
458
459 local function topattern(path)
460 if string.match(path, "*") then
461 path = string.gsub(path, "%%", "%%")
462 return string.gsub(path, "*", "[^/]+")
463 end
464 end
465
466 local dirs = { }
467
468 for dir in ${ARRAY}:gmatch"([^;?]+)/" do
469 dir = fixpath(dir)
470
471 if dir ~= "." then
472 dirs[#dirs + 1] = dir
473 end
474 end
475
476 for _, arg in ipairs{ ... } do
477 arg = fixpath(arg)
478
479 local pat = topattern(arg)
480
481 for _, dir in ipairs(dirs) do
482 if arg == dir then
483 print(dir)
484 os.exit(0)
485 elseif pat and string.match(dir, pat) then
486 print(dir)
487 os.exit(0)
488 end
489 end
490 end
491
492 if dirs[1] then
493 print(dirs[1])
494 os.exit(0)
495 else
496 os.exit(1)
497 end
498 EOF
499}
500
501
502#
289# findversion 503# findversion
290# 504#
291findversion() { 505findversion() {
@@ -315,7 +529,7 @@ findversion() {
315 529
316 530
317 if [ -n "${PKGCONFIG}" ]; then 531 if [ -n "${PKGCONFIG}" ]; then
318 PKGFLAGS="$(${PKGCONFIG} --list-all </dev/null 2>>/dev/null | sed -ne 's/^\(lua[^ ]*\).*/\1/p' | xargs -- ${PKGCONFIG} --cflags 2>>/dev/null | cat)" 532 PKGFLAGS="$("${PKGCONFIG}" --list-all </dev/null 2>>/dev/null | sed -ne 's/^\(lua[^ ]*\).*/\1/p' | xargs -- ${PKGCONFIG} --cflags 2>>/dev/null | cat)"
319 PKGDIRS="$(idirs "${PKGFLAGS}")" 533 PKGDIRS="$(idirs "${PKGFLAGS}")"
320 534
321 IFS=: 535 IFS=:
@@ -349,7 +563,10 @@ findversion() {
349 fi 563 fi
350 564
351 565
352 [ "${RECURSE}" = "yes" ] || return 0 566 if [ "${RECURSE}" != "yes" ]; then
567 [ "${API_VER:-0}" -gt 0 ]
568 return $?
569 fi
353 570
354 571
355 # recurse into CPPDIRS 572 # recurse into CPPDIRS
@@ -359,7 +576,7 @@ findversion() {
359 576
360 if [ $# -gt 0 ]; then 577 if [ $# -gt 0 ]; then
361 for D; do 578 for D; do
362 for F in $(find ${D} ${MAXDEPTH} ${XDEV} -name lua.h -print 2>>/dev/null); do 579 for F in $(find "${D}" ${MAXDEPTH} ${XDEV} -name lua.h -print 2>>/dev/null); do
363 tryluainclude "${F}" 580 tryluainclude "${F}"
364 581
365 if foundversion; then 582 if foundversion; then
@@ -377,7 +594,7 @@ findversion() {
377 594
378 if [ $# -gt 0 ]; then 595 if [ $# -gt 0 ]; then
379 for D; do 596 for D; do
380 for F in $(find ${D}/. ${MAXDEPTH} ${XDEV} -name lua.h -print 2>>/dev/null); do 597 for F in $(find "${D}/." ${MAXDEPTH} ${XDEV} -name lua.h -print 2>>/dev/null); do
381 tryluainclude "${F}" 598 tryluainclude "${F}"
382 599
383 if foundversion; then 600 if foundversion; then
@@ -386,6 +603,26 @@ findversion() {
386 done 603 done
387 done 604 done
388 fi 605 fi
606
607
608 # if we can find the lua interpreter, use it as a reference for
609 # header locations.
610 if findlua; then
611 D="${LUA_PATH%/*}"
612 D="${D%/*}/include"
613
614 if [ -d "${D}" ]; then
615 for F in $(find "${D}" ${MAXDEPTH} ${XDEV} -name lua.h -print 2>>/dev/null); do
616 tryluainclude "${F}"
617
618 if foundversion; then
619 return 0
620 fi
621 done
622 fi
623 fi
624
625 [ "${API_VER:-0}" -gt 0 ]
389} 626}
390 627
391 628
@@ -487,12 +724,12 @@ foundlib() {
487 724
488findlib() { 725findlib() {
489 if [ -n "${PKGCONFIG}" ]; then 726 if [ -n "${PKGCONFIG}" ]; then
490 PKGFLAGS="$(${PKGCONFIG} --list-all </dev/null 2>>/dev/null | sed -ne 's/^\(lua[^ ]*\).*/\1/p' | xargs -- ${PKGCONFIG} --libs 2>>/dev/null | cat)" 727 PKGFLAGS="$("${PKGCONFIG}" --list-all </dev/null 2>>/dev/null | sed -ne 's/^\(lua[^ ]*\).*/\1/p' | xargs -- ${PKGCONFIG} --libs 2>>/dev/null | cat)"
491 PKGDIRS="$(ldirs "${PKGFLAGS}")" 728 PKGDIRS="$(ldirs "${PKGFLAGS}")"
492 PKGDIRS="${PKGDIRS}${PKGDIRS:+:}/lib:/usr/lib:/usr/local/lib" 729 PKGDIRS="${PKGDIRS}${PKGDIRS:+:}/lib:/usr/lib:/usr/local/lib"
493 NUMDIRS="$(ndirs "${PKGDIRS}")" 730 NUMDIRS="$(count "${PKGDIRS}")"
494 PKGLIBS="$(xdirs "l" "${PKGFLAGS}")" 731 PKGLIBS="$(xdirs "l" "${PKGFLAGS}")"
495 NUMLIBS="$(ndirs "${PKGLIBS}")" 732 NUMLIBS="$(count "${PKGLIBS}")"
496 ALLDIRS="${PKGDIRS}${PKGLIBS:+:}${PKGLIBS}" 733 ALLDIRS="${PKGDIRS}${PKGLIBS:+:}${PKGLIBS}"
497 734
498 IFS=: 735 IFS=:
@@ -575,11 +812,17 @@ safeperm() {
575 812
576 813
577findluac() { 814findluac() {
815 if [ $# -eq 0 ]; then
816 IFS=:
817 set -- ${GLOB:-${GLOB_LUAC}}
818 unset IFS
819 fi
820
578 while [ $# -gt 0 ]; do 821 while [ $# -gt 0 ]; do
579 for F in $(findpath "${1}" no "${PATH}"; findpath "${1}" "${RECURSE}" "${BINDIRS}"); do 822 for F in $(findpath "${1}" no "${PATH}"; findpath "${1}" "${RECURSE}" "${BINDIRS}"); do
580 [ -x "$F" ] && safeperm "$F" || continue 823 [ -x "$F" ] && safeperm "$F" || continue
581 824
582 V="$($F -v </dev/null 2>&1 | head -n1 | sed -ne 's/^Lua \([0123456789][0123456789]*\.[0123456789][0123456789]*\).*/\1/p')" 825 V="$("$F" -v </dev/null 2>&1 | head -n1 | sed -ne 's/^Lua \([0123456789][0123456789]*\.[0123456789][0123456789]*\).*/\1/p')"
583 : ${V:=0} 826 : ${V:=0}
584 V="$((${V%%.*} * 100 + ${V##*.} % 100))" 827 V="$((${V%%.*} * 100 + ${V##*.} % 100))"
585 828
@@ -599,26 +842,46 @@ findluac() {
599 842
600 shift 843 shift
601 done 844 done
845
846 if [ -n "${LUAC_PATH}" -a -n "${LUAC_VER}" ]; then
847 return 0
848 else
849 return 1
850 fi
851}
852
853
854isinteger() {
855 I="${1}"
856
857 [ "${#I}" -gt 0 ] || return 1
858
859 while [ "${#I}" -gt 0 ]; do
860 if [ "${I##[0123456789]}" = "${I}" ]; then
861 return 1
862 fi
863
864 I=${I##[0123456789]}
865 done
866
867 return 0
602} 868}
603 869
604 870
605checkints() { 871checkints() {
606 while [ $# -gt 0 ]; do 872 while [ $# -gt 0 ]; do
607 I="${1}" 873 if ! isinteger "${1}"; then
608 while [ "${#I}" -gt 0 ]; do 874 printf -- "${0##*/}: ${1}: not a number\n" >&2
609 if [ "${I##[0123456789]}" = "${I}" ]; then 875 return 1
610 printf -- "${0##*/}: ${1}: not a number\n" >&2 876 fi
611 exit 1
612 fi
613
614 I=${I##[0123456789]}
615 done
616 877
617 shift 878 shift
618 done 879 done
619} 880}
620 881
621 882
883# Only major.minor for matching LUA_VERSION_NUM in lua.h. Also, _VERSION
884# only includes major.minor.
622lua2num() { 885lua2num() {
623 M=0 886 M=0
624 m="${2:-0}" 887 m="${2:-0}"
@@ -636,6 +899,7 @@ lua2num() {
636} 899}
637 900
638 901
902# All major.minor.patch for matching LUAJIT_VERSION_NUM in luajit.h.
639jit2num() { 903jit2num() {
640 M=0 904 M=0
641 m="${2:-0}" 905 m="${2:-0}"
@@ -655,12 +919,45 @@ jit2num() {
655} 919}
656 920
657 921
922mmp2num() {
923 M="${2:-0}"
924 m="${3:-0}"
925 p="${4:-0}"
926
927 IFS=".+-_"
928 set -- ${1}
929 unset IFS
930
931 if isinteger "${1:-}"; then
932 M=${1}
933 fi
934
935 if isinteger "${2:-}"; then
936 m=${2}
937 fi
938
939 if isinteger "${3:-}"; then
940 p=${3}
941 fi
942
943 checkints $M $m $p
944
945 printf "$((${M} * 10000 + ${m} * 100 + ${p}))\n"
946}
947
948
658findlua() { 949findlua() {
950 if [ $# -eq 0 ]; then
951 IFS=:
952 set -- ${GLOB:-${GLOB_LUA}}
953 unset IFS
954 fi
955
659 while [ $# -gt 0 ]; do 956 while [ $# -gt 0 ]; do
660 for F in $(findpath "${1}" no "${PATH}"; findpath "${1}" "${RECURSE}" "${BINDIRS}"); do 957 for F in $(findpath "${1}" no "${PATH}"; findpath "${1}" "${RECURSE}" "${BINDIRS}"); do
661 [ -x "$F" ] && safeperm "$F" || continue 958 [ -x "$F" ] && safeperm "$F" || continue
662 959
663 V="$($F -e 'print(string.match(_VERSION, [[[%d.]+]]))' </dev/null 2>>/dev/null | head -n1 | sed -ne 's/^\([0123456789][0123456789]*\.[0123456789][0123456789]*\).*/\1/p')" 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')"
664 : ${V:=0} 961 : ${V:=0}
665 V="$((${V%%.*} * 100 + ${V##*.} % 100))" 962 V="$((${V%%.*} * 100 + ${V##*.} % 100))"
666 963
@@ -671,7 +968,7 @@ findlua() {
671 [ "${V}" -ge "${API_MIN}" -a "${V}" -le "${API_MAX}" ] || continue 968 [ "${V}" -ge "${API_MIN}" -a "${V}" -le "${API_MAX}" ] || continue
672 969
673 if [ -n "${JIT_REQ}" ]; then 970 if [ -n "${JIT_REQ}" ]; then
674 J="$($F -v </dev/null 2>&1 | head -n1 | sed -ne 's/^LuaJIT \([0123456789][0123456789]*\.[0123456789][0123456789]*\.[0123456789][0123456789]*\).*/\1/p')" 971 J="$("$F" -v </dev/null 2>&1 | head -n1 | sed -ne 's/^LuaJIT \([0123456789][0123456789]*\.[0123456789][0123456789]*\.[0123456789][0123456789]*\).*/\1/p')"
675 J="$(jit2num ${J:-0})" 972 J="$(jit2num ${J:-0})"
676 973
677 if [ "${JIT_REQ}" = "skip" ]; then 974 if [ "${JIT_REQ}" = "skip" ]; then
@@ -691,12 +988,33 @@ findlua() {
691 988
692 shift 989 shift
693 done 990 done
991
992 if [ -n "${LUA_PATH}" -a -n "${LUA_VER}" ]; then
993 return 0
994 else
995 return 1
996 fi
997}
998
999
1000ccname() {
1001 "${CC}" -E - <<-EOF | awk '/sunpro/||/clang/||/gcc/||/other/{ print $1; exit; }'
1002 #if defined __SUNPRO_C
1003 sunpro
1004 #elif defined __clang__
1005 clang
1006 #elif defined __GNUC__
1007 gcc
1008 #else
1009 other
1010 #endif
1011 EOF
694} 1012}
695 1013
696 1014
697usage() { 1015usage() {
698 cat <<-EOF 1016 cat <<-EOF
699 usage: ${0##*/} [-I:L:P:d:Dkrm:xsv:j:JVh] cppflags|ldflags|version|lua|luac 1017 usage: ${0##*/} [-I:L:P:d:De:krm:xsv:j:JVh] cppflags|version|lua|luac|...
700 -I PATH additional search directory for includes 1018 -I PATH additional search directory for includes
701 -L PATH additional search directory for libraries 1019 -L PATH additional search directory for libraries
702 -P PATH additional search directory for binaries 1020 -P PATH additional search directory for binaries
@@ -705,6 +1023,7 @@ usage() {
705 unless a trailing "/" is present 1023 unless a trailing "/" is present
706 (default sandbox is \$TMPDIR/${0##*/}-XXXXXXXXXXXXXXXX) 1024 (default sandbox is \$TMPDIR/${0##*/}-XXXXXXXXXXXXXXXX)
707 -D do not create a sandbox 1025 -D do not create a sandbox
1026 -e GLOB glob pattern for finding utilities (lua, luac, etc)
708 -k query pkg-config if available 1027 -k query pkg-config if available
709 -r recursively search directories 1028 -r recursively search directories
710 -m MAXDEPTH limit recursion to MAXDEPTH (only for GNU and BSD find) 1029 -m MAXDEPTH limit recursion to MAXDEPTH (only for GNU and BSD find)
@@ -718,15 +1037,16 @@ usage() {
718 -V print this script's version information 1037 -V print this script's version information
719 -h print this usage message 1038 -h print this usage message
720 1039
721 cppflags print derived additional CPPFLAGS necessary 1040 cppflags print derived additional CPPFLAGS necessary
722 ldflags print derived additional LDFLAGS necessary (TODO) 1041 ldflags print derived additional LDFLAGS necessary (TODO)
723 version print derived Lua API version 1042 version print derived Lua API version
724 luac [GLOB] print path to luac utility using optional glob patterns 1043 luac print path to luac utility ($(printf "${GLOB_LUA}" | tr ':' ' '))
725 (e.g. "luac5.?"; default is "luac*") 1044 lua print path to lua interpreter ($(printf "${GLOB_LUAC}" | tr ':' ' '))
726 lua [GLOB] print path to lua interpreter using optional glob patterns 1045 package.path print preferred module install path
727 (e.g. "lua luajit"; default is "lua*") 1046 package.cpath print preferred C module install path
728 evalmacro run internal macro evaluator for debugging 1047 ccname print CC name (e.g. sunpro, clang, gcc)
729 testsym run internal library symbol reader for debugging 1048 evalmacro run internal macro evaluator for debugging
1049 testsym run internal library symbol reader for debugging
730 1050
731 This utility is used to derive compiler flags and filesystem paths 1051 This utility is used to derive compiler flags and filesystem paths
732 necessary to utilize Lua, LuaJIT, and particular versions thereof. 1052 necessary to utilize Lua, LuaJIT, and particular versions thereof.
@@ -767,7 +1087,7 @@ version() {
767} 1087}
768 1088
769 1089
770while getopts I:L:P:d:Dkrm:xsv:j:JVh OPT; do 1090while getopts I:L:P:d:De:krm:xsv:j:JVh OPT; do
771 case "${OPT}" in 1091 case "${OPT}" in
772 I) 1092 I)
773 INCDIRS="${INCDIRS:-}${INCDIRS:+:}${OPTARG}" 1093 INCDIRS="${INCDIRS:-}${INCDIRS:+:}${OPTARG}"
@@ -784,6 +1104,9 @@ while getopts I:L:P:d:Dkrm:xsv:j:JVh OPT; do
784 D) 1104 D)
785 SANDBOX= 1105 SANDBOX=
786 ;; 1106 ;;
1107 e)
1108 GLOB="${GLOB:-}${GLOB:+:}${OPTARG}"
1109 ;;
787 k) 1110 k)
788 PKGCONFIG="$(command -v pkg-config || true)" 1111 PKGCONFIG="$(command -v pkg-config || true)"
789 ;; 1112 ;;
@@ -857,8 +1180,8 @@ done
857shift $(($OPTIND - 1)) 1180shift $(($OPTIND - 1))
858 1181
859 1182
860for U in ${CC:-cc} find grep od rm rmdir sed xargs; do 1183for U in "${CC:-cc}" find grep od rm rmdir sed xargs; do
861 if ! command -v ${U} >>/dev/null 2>&1; then 1184 if ! command -v "${U}" >>/dev/null 2>&1; then
862 printf -- "${0##*/}: ${U}: command not found\n" >&2 1185 printf -- "${0##*/}: ${U}: command not found\n" >&2
863 fi 1186 fi
864done 1187done
@@ -911,7 +1234,7 @@ fi
911 1234
912case "${1:-}" in 1235case "${1:-}" in
913cppflags) 1236cppflags)
914 findversion 1237 findversion || exit 1
915 1238
916 [ "${API_VER:-0}" -gt 0 ] || exit 1 1239 [ "${API_VER:-0}" -gt 0 ] || exit 1
917 1240
@@ -927,9 +1250,7 @@ ldflags)
927 1250
928 ;; 1251 ;;
929version) 1252version)
930 findversion 1253 findversion || exit 1
931
932 [ "${API_VER:-0}" -gt 0 ] || exit 1
933 1254
934 printf "$(((${API_VER} / 100) % 100)).$((($API_VER) % 100))\n" 1255 printf "$(((${API_VER} / 100) % 100)).$((($API_VER) % 100))\n"
935 1256
@@ -945,31 +1266,55 @@ libv*)
945luac) 1266luac)
946 shift 1267 shift
947 1268
948 if [ $# -eq 0 ]; then 1269 if [ $# -gt 0 ]; then
949 set -- luac\* 1270 append GLOB $*
950 fi 1271 fi
951 1272
952 findluac $* 1273 findluac || exit 1
953 1274
954 [ -n "${LUAC_PATH}" ] || exit 1
955
956 printf -- "${LUAC_PATH}\n" 1275 printf -- "${LUAC_PATH}\n"
957 1276
958 ;; 1277 ;;
959lua) 1278lua)
960 shift 1279 shift
961 1280
962 if [ $# -eq 0 ]; then 1281 if [ $# -gt 0 ]; then
963 set -- lua\* 1282 append GLOB $*
964 fi 1283 fi
965 1284
966 findlua $* 1285 findlua || exit 1
967 1286
968 [ -n "${LUA_PATH}" ] || exit 1
969
970 printf -- "${LUA_PATH}\n" 1287 printf -- "${LUA_PATH}\n"
971 1288
972 ;; 1289 ;;
1290ldir|cdir)
1291 printf -- "${0##*/}: ${1}: deprecated command\n" >&2
1292 MODE="${1}"
1293 shift
1294
1295 if [ $# -gt 0 ]; then
1296 append GLOB $*
1297 fi
1298
1299 findlua || exit 1
1300
1301 if [ "${MODE}" = "cdir" ]; then
1302 findinstalldir package.cpath
1303 else
1304 findinstalldir package.path
1305 fi
1306
1307 ;;
1308package.path|package.cpath)
1309 findlua || exit 1
1310
1311 findinstalldir "$@" || exit 1
1312
1313 ;;
1314ccname)
1315 ccname
1316
1317 ;;
973evalmacro) 1318evalmacro)
974 shift 1319 shift
975 1320