From 437b5e56ab1ace432f2f2ead176e41214a0657c2 Mon Sep 17 00:00:00 2001 From: Packit Date: Sep 15 2020 13:30:15 +0000 Subject: lua-posix-33.3.1 base --- diff --git a/.autom4te.cfg b/.autom4te.cfg new file mode 100644 index 0000000..f47eaee --- /dev/null +++ b/.autom4te.cfg @@ -0,0 +1,4 @@ +# Disable the autom4te.cache directory. +begin-language: "Autoconf-without-aclocal-m4" +args: --no-cache +end-language: "Autoconf-without-aclocal-m4" diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..b42756d --- /dev/null +++ b/.travis.yml @@ -0,0 +1,153 @@ +language: c + +env: + global: + - _COMPILE="libtool --mode=compile --tag=CC gcc" + - _CFLAGS="-O2 -Wall -DLUA_COMPAT_ALL -DLUA_COMPAT_5_2 -DLUA_USE_LINUX" + - _INSTALL="libtool --mode=install install -p" + - _LINK="libtool --mode=link --tag=CC gcc" + - _LIBS="-lm -Wl,-E -ldl -lreadline" + + - prefix=/usr/local + - bindir=$prefix/bin + - incdir=$prefix/include + - libdir=$prefix/lib + + - _inst=$TRAVIS_BUILD_DIR/_inst + - luadir=$_inst/share/lua + - luaexecdir=$_inst/lib/lua + matrix: + - LUA=lua5.3 + - LUA=lua5.2 + - LUA=lua5.1 + - LUA=luajit + + +before_install: + # Put back the links for libyaml, which are missing on recent Travis VMs + - test -f /usr/lib/libyaml.so || + sudo find /usr/lib -name 'libyaml*' -exec ln -s {} /usr/lib \; + - sudo apt-get install help2man + + # Fetch Lua sources. + - cd $TRAVIS_BUILD_DIR + - 'if test lua5.3 = "$LUA"; then + curl http://www.lua.org/ftp/lua-5.3.0.tar.gz | tar xz; + cd lua-5.3.0; + fi' + - 'if test lua5.2 = "$LUA"; then + curl http://www.lua.org/ftp/lua-5.2.3.tar.gz | tar xz; + cd lua-5.2.3; + fi' + - 'if test lua5.1 = "$LUA"; then + curl http://www.lua.org/ftp/lua-5.1.5.tar.gz | tar xz; + cd lua-5.1.5; + fi' + + # Unpack, compile and install Lua. + - 'if test luajit = "$LUA"; then + curl http://luajit.org/download/LuaJIT-2.0.3.tar.gz | tar xz; + cd LuaJIT-2.0.3; + make && sudo make install; + for header in lua.h luaconf.h lualib.h lauxlib.h luajit.h lua.hpp; do + if test -f /usr/local/include/luajit-2.0/$header; then + sudo ln -s /usr/local/include/luajit-2.0/$header /usr/local/include/$header; + fi; + done; + else + for src in src/*.c; do + test src/lua.c = "$src" || test src/luac.c = "$src" || eval $_COMPILE $_CFLAGS -c $src; + done; + eval $_LINK -o lib$LUA.la -version-info 0:0:0 -rpath $libdir *.lo; + sudo mkdir -p $libdir; + eval sudo $_INSTALL lib$LUA.la $libdir/lib$LUA.la; + + eval $_COMPILE $_CFLAGS -c src/lua.c; + eval $_LINK -static -o $LUA lua.lo lib$LUA.la $_LIBS; + sudo mkdir -p $bindir; + eval sudo $_INSTALL $LUA $bindir/$LUA; + + sudo mkdir -p $incdir; + for header in lua.h luaconf.h lualib.h lauxlib.h lua.hpp; do + if test -f src/$header; then + eval sudo $_INSTALL src/$header $incdir/$header; + fi; + done; + fi' + + # Fetch LuaRocks. + - cd $TRAVIS_BUILD_DIR + - 'git clone https://github.com/keplerproject/luarocks.git luarocks-2.2.0' + - cd luarocks-2.2.0 + - git checkout v2.2.0 + + # Compile and install luarocks. + - if test luajit = "$LUA"; then + ./configure --lua-suffix=jit; + else + ./configure; + fi + - 'make build && sudo make install' + + # Tidy up file droppings. + - cd $TRAVIS_BUILD_DIR + - rm -rf lua-5.3.0 lua-5.2.3 lua-5.1.5 LuaJIT-2.0.3 luarocks-2.2.0 + + +install: + # Use Lua 5.3 compatible rocks, where available. + - 'for rock in ansicolors ldoc specl""; do + if test -z "$rock"; then break; fi; + if luarocks list | grep "^$rock$" >/dev/null; then continue; fi; + sudo luarocks install --server=http://rocks.moonscript.org/manifests/gvvaughan $rock; + done' + + # Fudge timestamps on release branches. + - 'if test -f configure; then + test -f aclocal.m4 && touch aclocal.m4; + sleep 1; touch Makefile.in; + sleep 1; test -f config.h.in && touch config.h.in; + sleep 1; touch configure; + fi' + + # Build from rockspec. + - export ROCKSPEC=luaposix-33.3.1-1.rockspec + - 'test -f "$ROCKSPEC" || ROCKSPEC=luaposix-git-1.rockspec' + - sudo luarocks make $ROCKSPEC LUA="$LUA" + + # Clean up files created by root + - sudo git clean -dfx + - sudo rm -rf slingshot /tmp/ldoc + + +script: + # Reconfigure for in-tree test install. + - test -f configure || ./bootstrap --verbose + - ./configure --prefix="$_inst" --disable-silent-rules LUA="$LUA" + + # Verify luarocks installation. + - make installcheck || make installcheck V=1 + + # Verify local build. + - make + - make check || make check V=1 + + # Verify configured installation. + - make install prefix="$_inst" luadir="$luadir" luaexecdir="$luaexecdir" + - LUA_PATH="$luadir/?.lua;$luadir/?/init.lua;;" + LUA_CPATH="$luaexecdir/?.so;;" + make installcheck V=1 + + +# Run sanity checks on CI server, ignoring buggy automakes. +after_success: + - '{ _assign="="; + if grep local-checks-to-skip build-aux/sanity-cfg.mk >/dev/null; then + _assign="+="; + fi; + printf "local-checks-to-skip %s sc_vulnerable_makefile_CVE-2012-3386\n" "$_assign"; + } >> build-aux/sanity-cfg.mk' + - 'make syntax-check || : this will usually fail on the release branch' + +notifications: + slack: aspirinc:JyWeNrIdS0J5nf2Pn2BS1cih diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..b29d3ac --- /dev/null +++ b/AUTHORS @@ -0,0 +1,18 @@ +luaposix is the work of several authors (see git history for +contributors). It is based on two earlier libraries: + +An earlier version of luaposix (up to 5.1.11) + + Copyright Reuben Thomas 2010-2011 + Copyright Natanael Copa 2008-2010 + Clean up and bug fixes by Leo Razoumov 2006-10-11 + Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + Based on original by Claudio Terra for Lua 3.x, with contributions + by Roberto Ierusalimschy. + +lcurses release 7 + + Copyright Tiago Dionizio 2004-2007 + Copyright Reuben Thomas 2009-2011 + +John Belmonte wrote the example program tree.lua. diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..4707e1e --- /dev/null +++ b/COPYING @@ -0,0 +1,19 @@ +Copyright (C) 2006-2015 luaposix authors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..0980c45 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,4352 @@ +2015-03-01 Gary V. Vaughan + + Release version 33.3.1 + * NEWS.md: Record release date. + + configury: bump release version to 33.3.1. + * configure.ac (AC_INIT): Bump release version to 33.3.1. + * .travis.yml: Regenerate. + + posix: fix a stupid cherry pick edit typo. + * lib/posix.lua.in (popen_pipeline): Add comma after close. + +2015-03-01 Reuben Thomas + + posix: add missing locals before pclose and popen_pipeline. + * lib/posix.lua.in (pclose, popen_pipeline): Make sure to import + API module table entries into locals for easier refactoring if + these functions are moved in a future revision. + + posix: remove ability to pass a simple string to execx. + * specs/posix_spec.yaml (execx, spawn, popen): Adjust to exercise + new behaviours with no special support for string arguments. + * lib/posix.lua.in (execx, spawn, popen): Remove special support + for string arguments. + + posix: remove obsolete `posix.system` alias. + * lib/posix.lua.in (system): Remove. + * NEWS.md (Incompatible Changes): Update. + +2015-03-01 Gary V. Vaughan + + specs: installcheck setup. + To prevent a repeat of the unloadable 33.3.0 release, set up + specs so that latest slingshot will rerun the specs against both + configure and luarocks installed luaposix. + * specs/posix_spec.yaml (posix.version): Move from here... + * specs/posix_version_spec.yaml (version): ...to here. + * specs/specs.mk (specl_SPECS): Add specs/posix_version_spec.yaml. + * specs/spec_helper.lua: Check for installcheck in the environment + before tweaking Lua paths to point at build tree. + + slingshot: sync with upstream, for installcheck support. + * slingshot: Sync with upstream. + * .travis.yml: Regenerate. + +2015-02-28 Reuben Thomas + + local.mk: install posix/init.lua under posix + +2015-02-28 Gary V. Vaughan + + maint: post-release administrivia. + * NEWS: Add header line for next release. + * .prev-version: Record previous version. + * ./local.mk (old_NEWS_hash): Auto-update. + + Release version 33.3.0 + * NEWS.md: Record release date. + + configury: bump release version to 33.3.0. + * configure.ac (AC_INIT): Bump release version to 33.3.0. + * .travis.yml: Regenerate. + * NEWS.md: Fix a small typo. + + maint: update .gitignore. + * .gitignore: add lib/posix/init.lua. + + maint: workaround LuaRocks install manifest key clash. + LuaRocks install manifest cannot store two files with the same + key. + * configure.ac (AC_CONFIG_FILES): Expand lib/posix.lua.in to + lib/posix/init.lua for installation. + * build-aux/config.ld.in (file): Adjust accordingly. + * local.mk (dist_lua_DATA): Likewise. + * NEWS.md (Bugs Fixed): Update. + Workaround suggested by quae@daurnimator.com + + configury: don't forget to distribute compat-5.2.{c,h}. + * local.mk (EXTRA_DIST): Add ext/include/compat-5.2.c and + ext/include/compat-5.2.h. + +2015-02-28 Reuben Thomas + + rockspec.conf: remove bogus constraint on bit32 version + +2015-02-28 Gary V. Vaughan + + slingshot: sync with upstream for distcheck fixes. + * slingshot: Sync with upstream again. + +2015-02-27 Gary V. Vaughan + + slingshot: Sync with upstream for Travis Lua 5.3 build fixes. + * slingshot: Sync with upstream. + * .travis.yml: Regenerate. + + maint: exclude compat-5.2 sources from assorted syntax checks. + * build-aux/sanity-cfg.mk + (exclude_file_name_regexp--sc_require_config_h) + (exclude_file_name_regexp--sc_require_config_h_first) + (exclude_file_name_regexp--sc_useless_cpp_parens): Add + ext/include/compat-5.2.c. + (exclude_file_name_regexp--sc_useless_cpp_parens): Add + ext/include/compat-5.2.h. + * ext/include/compat-5.2.c, ext/include/compat-5.2.h: Remove + trailing empty lines. + + maint: don't trigger error-message-uppercase in stdlib.c. + * build-aux/sanity-cfg.mk + (exclude_file_name_regexp--sc_error_message_uppercase): Add + ext/posix/stdlib.c. + + specs: expect portable wc command output format. + BSD and Mac OS X `wc` indent the output from `wc`. + * specs/posix_spec.yaml (popen_pipeline): Allow leading whitespace + in wc output. + + slingshot: sync with upstream, for --libdir fix. + Close #210 + * slingshot: Sync with upstream. + +2015-02-27 Reuben Thomas + + Merge pull request #213 from luaposix/remove-pipeline + Remove pipeline + + NEWS.md: add recent changes + + posix: remove pipline, pipeline_iterator and pipeline_slurp + These functions were experimental and only briefly documented. They are + replaced by the popen family. + + NEWS.md: fix some formatting + +2015-02-26 Reuben Thomas + + posix: add popen, popen_pipeline, and execx. + * specs/posix_spec.yaml (popen, popen_pipeline): Specify + correct behaviours for these new functions. + * lib/posix.lua.in (popen, popen_pipeline, execx): New functions. + +2015-02-26 Gary V. Vaughan + + Merge pull request #211 from luaposix/fdopen + Fdopen + +2015-02-25 Reuben Thomas + + Merge pull request #206 from luaposix/remove-builtin-bit32 + build: remove posix.bit32 + +2015-02-21 Reuben Thomas + + Add fdopen + Uses luaL_Stream; we rely on compat-lua-5.2 to make this work on Lua 5.1 + and LuaJIT. + +2015-02-19 Reuben Thomas + + Build Lua 5.3 with 5.2 compatibility + Needs -DLUA_COMPAT_5_2, just as 5.2 needs -DLUA_COMPAT_ALL + + Build Lua 5.3 with 5.2 compatibility + Needs -DLUA_COMPAT_5_2, just as 5.2 needs -DLUA_COMPAT_ALL + + build: remove posix.bit32 + Close #204 again, removing posix.bit32 in favour of a rockspec + dependency, which will use the built-in library in Lua >= 5.2, or the + backported rock in Lua 5.1 + +2015-02-17 Gary V. Vaughan + + Merge branch 'sparked435-master' + + curses: support linking against NetBSD curses. + * ext/include/_helpers.c (LPOSIX_CURSES_COMPLIANT): Leave this + unset on NetBSD, unless linked against ncurses. + (binding_notimplemented): New function for returning a `nil`, + "not implemented" error pair from an unbound function... + * ext/posix/stdlib.c (mkdtemp): ...factored out of here. Adjust + accordingly. + * ext/posix/curses.c (Presizeterm): Use it here too. + (Pripoffline, Pslk_init, Pslk_refresh, Pslk_noutrefresh) + (Pslk_label, pslk_clear, Pslk_restore, Pslk_touch) + (Pslk_attron, Pslk_attroff, Pslk_attrset): Use it here When + LPOSIX_CURSES_COMPLIANT is not set. + * ext/posix/curses/window.c (Wsyncok, Wimmedok): Likewise. + * NEWS.md (New Features): Update. + +2015-02-17 aaron + + Workarounds for missing NetBSD curses functions. + +2015-02-16 Gary V. Vaughan + + curses: remove unusable KEY_MOUSE constant. + * ext/posix/curses.c (register_curses_constants): Comment out + KEY_MOUSE, along with a comment to remind us not to reintroduce + it again later! + * NEWS.md (Incompatible Changes): Update. + + dirent: throw a Lua error when called with non-existent path. + Close #207. + * specs/posix_dirent_spec.yaml: New file. Specify correct + behaviours, paying special attention to throwing an error when + called with a non-existent path. + * specs/specs.mk (specl_SPECS): Add specs/posix_dirent_spec.yaml. + * ext/posix/dirent.c (Pdir): Check for errors when opening + path argument, and throw an error if necessary. + (pfiles): Likewise. + * examples/dir.lua: Adjust accordingly. + * NEWS.md (Bugs Fixed): Update. + Reported by Ingo Struck + +2015-02-11 Gary V. Vaughan + + doc: rationale for posix.bit32 inclusion. + Close #204 + * ext/posix/bit32.c: Add LDocs to explain why we have yet another + bit twiddling functions module here in luaposix. + + Merge branch 'zevv-getsockname' + +2015-02-11 Gary V. Vaughan + + Merge branch 'getsockname' of https://github.com/zevv/luaposix into zevv-getsockname + * specs/posix_sys_socket_spec.yaml (getsockname): Specify bad + argument behaviours minimally. + * ext/posix/sys/socket.c (getsockname): Port forward to latest + helpers and conventions. Fix LDocs. + * examples/socket.lua: Port forward additional getsockname call. + * NEWS.md (New features): Update. + + + Conflicts: + examples/socket.lua + ext/posix/posix.c + +2015-02-11 Ico Doornekamp + + Added getsockname() to examples/socket.lua + + Added getsockname + +2015-01-31 Gary V. Vaughan + + signal: workaround a printf long vs int type coercion issue. + * ext/posix/signal.c (sig_handle): Some architectures use a long + for sig_atomic_t, so we need a %ld specifier to display it without + a warning. In case sig_atomic_t is narrower than a long, cast it + up before passing to fprintf. + + sys.socket: move sys/types.h include earlier. + * ext/posix/sys/socket.c: netinet/udp.h complains about lack of + u_short definition on FreeBSD 10, so move sys/types.h before it + in the hope of fixing that. + Reported by jeangit@github. + + sys.resource: add ifdef guards to RLIM_SAVED_CUR and RLIM_SAVED_MAX. + * ext/posix/sys/resource.c (luaopen_posix_sys_resource): Add + ifdef guards around RLIM_SAVED_CUR and RLIM_SAVED_MAX declarations, + because FreeBSD 10 does not provide them. + Reported by jeangit@github. + +2015-01-20 Reuben Thomas + + posix.lua: use error, not die; fixes #201 + +2015-01-19 Gary V. Vaughan + + doc: improve LDocs for sys.socket sockaddr tables. + Closes #200 + * ext/posix/sys/socket.c (sockaddr): Document all optional fields. + * NEWS.md: Update. + Reported by Bernd Eggink + + slingshot: sync with upstream for lua 5.3.0 final support. + * slingshot: Sync with upstream. + * .travis.yml: Regenerate. + +2015-01-18 Reuben Thomas + + Make posix.pipeline_slurp more efficient + Use standard table.concat method instead of repeated string + concatenation. + +2015-01-04 Gary V. Vaughan + + maint: post-release administrivia. + * NEWS: Add header line for next release. + * .prev-version: Record previous version. + * ./local.mk (old_NEWS_hash): Auto-update. + + Release version 33.2.1 + * NEWS.md: Record release date. + + configury: distribute posix.curses.html correctly. + * local.mk (dist_modules_DATA): Add posix.curses.html. + * configure.ac (AC_INIT): Bump release version to 33.2.1. + * .travis.yml: Regenerate. + * NEWS.md: Update. + Reported by Ulrich Schmidt + +2015-01-03 Gary V. Vaughan + + maint: post-release administrivia. + * NEWS: Add header line for next release. + * .prev-version: Record previous version. + * ./local.mk (old_NEWS_hash): Auto-update. + + Release version 33.2.0 + * NEWS.md: Record release date. + + specs: accept '?' as function name in Lua bad argument errors. + LuaJIT in particular often fails to find the name of a function, + so we must accept '?' when checking error message contents. + * specs/spec_helper.lua (typeerrors): Call badargs.format twice, + and return a table of results. + (init): Use typerrors wrapper. + * specs/posix_compat_spec.yaml, specs/posix_deprecated_spec.yaml, + specs/posix_spec.yaml, specs/posix_sys_resource_spec.yaml, + specs/posix_sys_socket_spec.yaml, specs/posix_time_spec.yaml: Use + spec_helper.lua:init, or manually create a list of error messages + including returned function name, or "?" when that could not be + found, e.g. by LuaJIT. + +2015-01-02 Gary V. Vaughan + + configury: bump release version to 33.2.0. + * configure.ac (AC_INIT): Bump release version to 33.2.0. + * .travis.yml: Regenerate. + + maint: adjust indentation for github markdown multi-para bullets. + * NEWS.md: Adjust indentation so that multi-paragram bullet + points are correctly rendered by github markdown. + + specs: fix off by one error in localtime and gmtime examples. + * specs/posix_time_spec.yaml (gmtime, localtime): Fix expectation + range to fit (correct) description. + * NEWS.md: Update. + + gnulib: sync with upstream. + + maint: commit git rockspec to master branch. + * .gitignore: Allow git rockspecs. + * luaposix-git-1.rockspec: New file. + + configury: add ansicolors to travis_extra_rocks. + * bootstrap.conf (buildreq): Reference Specl 14.0.0 with correct + version number. + (travis_extra_rocks): Add ansicolors for color specl outpet. + * .travis.yml: Regenerate. + +2015-01-01 Gary V. Vaughan + + maint: add 5.3 to compatiblity statement in files' preamble. + * ext/include/_helpers.c, ext/posix/bit32.c, ext/posix/ctype.c, + ext/posix/curses.c, ext/posix/curses/chstr.c, + ext/posix/curses/window.c, ext/posix/dirent.c, + ext/posix/errno.c, ext/posix/fcntl.c, ext/posix/fnmatch.c, + ext/posix/getopt.c, ext/posix/glob.c, ext/posix/grp.c, + ext/posix/libgen.c, ext/posix/poll.c, ext/posix/posix.c, + ext/posix/pwd.c, ext/posix/sched.c, ext/posix/signal.c, + ext/posix/stdio.c, ext/posix/stdlib.c, ext/posix/sys/msg.c, + ext/posix/sys/resource.c, ext/posix/sys/socket.c, + ext/posix/sys/stat.c, ext/posix/sys/statvfs.c, + ext/posix/sys/time.c, ext/posix/sys/times.c, + ext/posix/sys/utsname.c, ext/posix/sys/wait.c, + ext/posix/syslog.c, ext/posix/termio.c, ext/posix/time.c, + ext/posix/unistd.c, ext/posix/utime.c, lib/posix.lua.in, + lib/posix/_argcheck.lua, lib/posix/compat.lua, + lib/posix/deprecated.lua, lib/posix/util.lua: Add 5.3 to + compatibility statement in files' preamble. + + maint: update copyrights. + * COPYING, bootstrap.conf, configure.ac, ext/include/_helpers.c, + ext/posix/bit32.c, ext/posix/ctype.c, ext/posix/curses.c, + ext/posix/curses/chstr.c, ext/posix/curses/window.c, + ext/posix/dirent.c, ext/posix/errno.c, ext/posix/fcntl.c, + ext/posix/fnmatch.c, ext/posix/getopt.c, ext/posix/glob.c, + ext/posix/grp.c, ext/posix/libgen.c, ext/posix/poll.c, + ext/posix/posix.c, ext/posix/pwd.c, ext/posix/sched.c, + ext/posix/signal.c, ext/posix/stdio.c, ext/posix/stdlib.c, + ext/posix/sys/msg.c, ext/posix/sys/resource.c, + ext/posix/sys/socket.c, ext/posix/sys/stat.c, + ext/posix/sys/statvfs.c, ext/posix/sys/time.c, + ext/posix/sys/times.c, ext/posix/sys/utsname.c, + ext/posix/sys/wait.c, ext/posix/syslog.c, ext/posix/termio.c, + ext/posix/time.c, ext/posix/unistd.c, ext/posix/utime.c, + lib/posix.lua.in, lib/posix/_argcheck.lua, lib/posix/compat.lua, + lib/posix/deprecated.lua, lib/posix/util.lua, local.mk: Add 2015 + to copyright statement. + + rockspec: Lua 5.4 and higher not yet supported. + * rockspec.conf (dependencies): Add lua < 5.4 constraint. + + maint: use correct Specl >= 14 arity for bad argument errors. + Now that Specl's badargs module is generating examples with + the correct messages, we can now say 'no more than 0 arguments'. + * ext/include/_helpers.c (checknargs): Return singular 'argument' + in error message only for exactly 1 expected argument, otherwise + plural. + + slingshot: sync with upstream. + * slingshot: Sync with upstream. + * bootstrap: Update from slingshot. + * configure.ac: Remove SS_CONFIG_TRAVIS invocation. Move extra + rocks from here... + * bootstrap.conf (travis_extra_rocks): ...to here. + (require_bootstrap_uptodate): Remove. + * .gitignore: Remove slingshot.m4. + +2014-12-22 Gary V. Vaughan + + configury: enable mkdtemp on _XOPEN_SOURCE incompatible hosts. + * configure.ac (POSIX_EXTRA_CPPFLAGS) : Add + -DLPOSIX_2008_COMPLIANT instead of -D_XOPENSOURCE=700. + * ext/include/_helpers (LPOSIX_2008_COMPLIANT): When manually + defined, also ensure LPOSIX_2001_COMPLIANT is defined. + +2014-12-19 Gary V. Vaughan + + maint: use table.unpack over unpack for 5.3.0 compatibility. + Lua 5.3 has table.unpack but not _G.unpack; Lua 5.2 has + table.unpack and _G.unpack; Lua 5.1 has _G.unpack but not + table.unpack + * lib/posix.lua.in (unpack): Use table.unpack over unpack, to + work on all three! + * lib/posix/deprecated.lua (unpack): Likewise. + + maint: add missing NEWS. + * NEWS: Note recent QNX support. + + stdlib: mkdtemp returns an error on substandard hosts. + * ext/posix/stdlib.c (mkdtemp): Move POSIX compliance guards + inside the function definition, with an alternate function body + that returns an error when there is no mkdtemp in the C library. + (posix_stdlib_fns): Remove POSIX compliance guard from mkdtemp. + + maint: detect POSIX 2001 or POSIX 2008 compliance. + Close #197. + * configure.ac: Reformat comments. + Pass LPOSIX_2001_COMPLIANT directly to cpp on QNX. + * ext/include/_helpers.c (LPOSIX_2008_COMPLIANT): Enable only + if _POSIX_C_SOURCE or _XOPEN_SOURCE are set appropriately. + (LPOSIX_2001_COMPLIANT): Add _XOPEN_SOURCE >= 600 condition. + * ext/posix/stdlib.c (Pmkdtemp): Disable this function unless + LPOSIX_2008_COMPLIANT is defined. + Reported by James Harris + + maint: post-release administrivia. + * NEWS: Add header line for next release. + * .prev-version: Record previous version. + * ./local.mk (old_NEWS_hash): Auto-update. + + Release version 33.1.0 + * NEWS.md: Record release date. + + specs: adjust setrlimit error message expectations. + * specs/posix_sys_resource_spec.yaml (setrlimit): Adjust error + messages to reflect recent int->number table field type changes. + + slingshot: sync with upstream, for Lua 5.3.0 improvements. + * slingshot: Sync with upstream. + * bootstrap: Update from slingshot. + * NEWS: Move from here... + * NEWS.md: ...to here. Convert to Markdown format. + * .gitignore: Add NEWS. + * local.mk (old_NEWS_hash): Regenerate. + (luaexec_LTLIBRARIES): Change from assigment to appending. + * .travis.yml: Regenerate. + +2014-12-18 Gary V. Vaughan + + resources: don't truncate rlim structure field values. + With f8d8939 we were too zealous with changing all internal + types from lua_Number (et. al) to lua_Integer (et. al), where + lua_Integer is not wide enough to contain an rlim_t. + * ext/include/_helpers (checknumberfield, pushnumberfield) + (setnumberfield): New function and macros equivalent to the + earlier implementations of checkintegerfield, pushintegerfield + and setintegerfield respectively. + * ext/posix/sys/resource.c (pushrlimit): Set PosixRlimit table + entries with setnumberfield. + (setrlimit): Extract PosixRlimit fields with checknumberfield. + * specs/posix_sys_resource_spec.yaml (setrlimit): Remove + spurious braces. + + posix: fix bad argument errors for spawn. + * specs/posix_spec.yaml (spawn): Uncomment badargs diagnosis. + * lib/posix.lua.in (M.spawn): Fix argument type error message for + nil-valued argument 2. + +2014-12-17 Gary V. Vaughan + + sys.socket: support OpenBSD 5.6. + Close #182. + * ext/posix/sys/socket.c: Change the order of inclusion of some + headers to satisfy OpenBSD 5.6. + +2014-12-17 Reuben Thomas + + Fix argument checks for spawn and add specs + +2014-12-17 Gary V. Vaughan + + sys.msg: only enable SysV messaging where it is supported. + * configure.ac (AC_CHECK_HEADER): Add sys/msg.h. + (AC_CHECK_FUNCS): Add msgrcv, msgsend. + (HAVE_SYSV_MESSAGING): Define if the above are all present. + * ext/posix/sys/msg.c (LPOSIX_2001_COMPLIANT): Change from using + this... + (HAVE_SYSV_MESSAGING): ...to this. + + configury: reformat AC_CHECK_FUNCS to discourage adding more! + * configure.ac: Reformat. + +2014-12-17 James Harris + + configury: no _XOPEN_SOURCE on QNX. + * configure.ac (POSIX_EXTRA_CPPFLAGS): Don't add _XOPEN_SOURCE on + QNX either. + + socket: guard AI_ADDRCONFIG definition. + * ext/posix/sys/socket.c (luaopen_posix_sys_socket): For machines + that don't define AI_ADDRCONFIG, wrap the binding in a CPP guard. + + unistd: stub gethostid for POSIX implementations that dropped it. + * configure.ac (AC_CHECK_FUNCS): Add gethostid. + * ext/posix/unistd.c (Pgethostid): If there is no gethostid on + this host, return an error rather than trying to call it. + + configury: support separate libsocket. + * configure.ac (LIBSOCKET): Check for a socket funtion carrying + socket library. + * local.mk (ext_posix_posix_la_LDFLAGS): Add $(LIBSOCKET). + + curses: fix compilation errors when host has no curses library. + * ext/posix/curses/chstr.c: Adjust #ifdef HAVE_CURSES to make + sure there's an emptyg posix_curses_chstr_fns definition. + * ext/posix/curses/window.c: Likewise for + posix_curses_windows_fns. + * ext/posix/curses.h: Likewise for curseslib. + Also move #includes for the above files out of the HAVE_CURSES + guard. + +2014-12-17 Gary V. Vaughan + + maint: add Lua 5.3 to README.md. + * README.md: Add Lua 5.3 reference. + + slingshot: sync with upstream, for travis ownership fixes. + * slingshot: Sync with uptstream. + * .travis.yml: Regenerate. + + travis: debug check-local failure. + * .travis.yml (script): Debug check-local failure. + + slingshot: sync with upstream, for Lua 5.3.x support. + * slingshot: Sync with upstream. + * .travis.yml: Regenerate. + + configury: bump release number to 33.1.0. + * configure.ac (AC_INIT): Bump release number to 33.1.0. + + specs: move stdlib function specs to their own spec-file. + * specs/posix_spec.yaml (abort, getenv, grantpt, mkdtemp, mkstemp) + (openpt, ptsname, realpath, unlockpt, setenv): Move from here... + * specs/posix_stdlib_spec.yaml (abort, getenv, grantpt, mkdtemp) + (mkstemp, openpt, ptsname, realpath, unlockpt, setenv): New file. + ...to here. + * specs/specs.mk (specl_SPECS): Add specs/posix_stdlib_spec.yaml. + + doc: cross reference umask and sys.stat.umask. + * ext/posix/sys/stat.c (umask): Reference posix.umask. + * lib/posix/compat.lua (umask): Reference posix.sys.stat.umask. + +2014-12-16 Gary V. Vaughan + + maint: support 5.3.0 integers correctly. + Many integer fields and values were incorrectly becoming `.0` + suffixed floats in Lua 5.3.0. + * ext/include/_helpers.c (lua_isinteger): Define to lua_isnumber + with pre-5.3.0 Lua headers. + (checkinteger): Use it. + (checkch): Use checkint over luaL_checknumber. + (checkintegerfield): Use lua_pushinteger over lua_pushnumber. + (pushnumberfield, setnumberfield): Rename from these... + (pushintegerfield, setintegerfield): ...to these, and adjust to + work with Integer subtypes in Lua 5.3.0. + * ext/posix/curses.c (Punctrl): Use checkch over luaL_checknumber. + * ext/posix/grp (pushgroup): Set gr_gid field as an integer. + * ext/posix/poll.c (poll_fd_list_check_table): Use lua_isinteger + for argument check. + * ext/posix/pwd.c (pushpasswd): Use setintegerfield for pw_uid + and pwd_gid fields. + * ext/posix/sys/resource.c (pushrlimit): Use setintegerfield for + rlim_cur and rlim_max fields. + * ext/posix/sys/socket.c (pushsockaddrinfo): Use pushintegerfield + for family, port, pid and groups fields. + (Pgetaddrinfo): Use pushintegerfield for socktype and protocol + fields. + * ext/posix/sys/stat.c (pushstat): Use setintegerfield for all + fields. + * ext/posix/sys/statvfs.c (pushstatvfs): Use setintegerfield for + all fields. + * ext/posix/sys/time.c (pushtimeval): Use setintegerfield for + tv_sec and tv_usec fields. + * ext/posix/sys/times.c (pushtimefield): Use pushintegerfield. + * ext/posix/termio.c (Ptcgetattr): Use pushintegerfield for + iflag, oflag, lflag, cflag and cc fields. + * ext/posix/time.c (pushtimespec): Use setintegerfield for + tv_sec and tv_nsec fields. + (pushtm): Use setintegerfield for all fields. + * ext/posix/unistd.c (mygetuid. mygetgid): Use lua_isinteger and + lua_tointeger for argument checking. + * NEWS: Update. + + stdlib: accept optional 3rd argument to setenv. + Close #185. + * ext/posix/stdlib.c (Psetenv): Allow optional 3rd argument again. + * NEWS: Update. + + maint: remove unused luaexec_LDFLAGS macro. + Silence an Automake warning about unused luaexec_LDFLAGS. + * local.mk (luaexec_LDFLAGS): Remove. + + slingshot: sync with upstream, for git submodule fixes. + Latest slingshot bootstrap passes arguments to 'git submodule init' + correctly. + * slingshot: Sync with upstream. + * bootstrap: Update from slingshot. + * .travis.yml: Regenerate. + + specs: specify localtime and gmtime month values correctly. + * specs/posix_time_spec.yaml (gmtime, localtime): Add a + specification for December epoch returning month 11. + Fix description of month range to be 0-11. + * specs/posix_compat_spec.yaml (gmtime, localtime): Add a + specification for December epoch returning month 12. + Fix description of month range to be 1-12. + Fix specification to check month range 1-12. + +2014-12-16 Reuben Thomas + + Fix #187 + + Fix #189 + +2014-11-06 Gary V. Vaughan + + deprecated: handle nonexistent files gracefully. + * lib/posix/deprecated (stat, statvfs): If the underlying C API + call does not return a table, simply return nil instead of + calling doselection. + + sys.socket: initialize hints with zeros. + * ext/posix/sys/socket.c (Pgetaddrinfo): It's not safe to rely + on field values in uninitialised automatic struct addrinfo + declaration. Use memset to overwrite garbage. + * NEWS: Update. + + maint: support _POSIX_C_SOURCE in lieu of _POSIX_VERSION. + On OpenBSD 5.6, _POSIX_VERSION is set to just 199009L by default, + and messing with _XOPEN_SOURCE or setting _POSIX_VERSION directly + changes the C library header declarations. It seems that + _POSIX_C_SOURCE is defined to 200112L by default, indicating that + the newer functions luaposix wants to bind to really are available. + * configure.ac (POSIX_EXTRA_CPPFLAGS): Elide _XOPEN_SOURCE + definition on OpenBSD. + * ext/include/_helpers.c (LPOSIX_2001_COMPLIANT): New preprocessor + symbol, defined when either _POSIX_VERSION or _POSIX_C_SOURCE + are bigger than 200112L. + * ext/posix/stdlib.c, ext/posix/sys/msg.c, + ext/posix/sys/socket.c, ext/posix/sys/times.c, + ext/posix/syslog.c, ext/posix/unistd.c: Predicate on new + LPOSIX_2001_COMPLIANT definition instead of _POSIX_VERSION. + + sys.socket: make some more preprocessor constants conditional. + * ext/posix/sys/socket.c (AI_ALL, AI_V4MAPPED): Add preprocessor + guards, as these two are not defined on at least OpenBSD 5.6. + + configury: propagate _XOPEN_SOURCE cpp defines fully. + * configure.ac (POSIX_EXTRA_CFLAGS): A misnomer... + (POSIX_EXTRA_CPPFLAGS): ...better named like this. + * local.mk (AM_CPPFLAGS): Add POSIX_EXTRA_CPPFLAGS, so addition + preprocessor definitions reach submodule compilation too. + (ext_posix_posix_la_CFLAGS): Remove. + +2014-11-05 Gary V. Vaughan + + doc: use OpenGroup SUSv3 urls for manual page links. + * build-aux/config.ld.in (custom_see_handler): Send manual page + links to OpenGroup SUSv3 specifications instead of kernel.org. + + maint: update README. + * README.md: Update some bitrot. + + configury: add sys/socket.h to other socket header checks. + The net/if.h check fails on at least OpenBSD 5.6 without this + patch. + * configure.ac (AC_CHECK_HEADERS): Add sys/socket.h to default + headers when checking for net/if.h and linux/netlink.h. + + configury: set LIBRT only if it is required for clock_gettime. + * configure.ac (LIBRT): Extract from != Darwin guard and set to + -lrt if that is required for clock_gettime to work. + (POSIX_EXTRA_CFLAGS): Move up to compiler flag setting section. + (AC_CHECK_FUNCS): Move out of library checking section. + + sys.resource: provide RLIMIT_AS fallback for OpenBSD 5.6. + * ext/posix/sys/resource.c (RLIMIT_AS): Fallback to RLIMIT_DATA + if not otherwise defined. + + maint: preliminary Lua 5.3.0-beta compatibility. + Close #181. + * configure.ac (AX_PROG_LUA): Accept Lua 5.3 interpreters. + * ext/include/lua52compat.h: Remove. + * local.mk (EXTRA_DIST): Adjust accordingly. + * ext/include/_helpers.c (lua_objlen, lua_strlen, luaL_openlib) + (luaL_register): Lua 5.2 and 5.3 compatibility definitions. + * ext/posix/sched.c, ext/posix/termio.c: Use luaposix optint() + rather than deprecated luaL_optint(). + * NEWS: Update. + + bit32: remove remaining `require "bit"` invocations. + * lib/posix.lua.in: require "posix.bit32" unconditionally. + * specs/posix_unistd_spec.yaml: Likewise. + + maint: remove dependency on luabitop. + * specs/spec_helper.lua (bit): Fallback on posix.bit32 if there + is no native bit32 module. + * lib/posix/compat.lua, lib/posix/deprecated.lua: Use + posix.bit32 unconditionally. + * rockspec.conf (dependencies): Remove luabitop. + + bit32: fetch uint32_t definition from stdint.h. + * ext/posix/bit32.c: include stdint.h instead of sys/types.h. + + bit32: new module for lua5.1 compatibility. + * specs/posix_bit32_spec.yaml: Specify behaviours of band, bnot + and bor. + * specs/specs.mk (specl_SPECS): Add posix_bit32_spec.yaml. + * ext/posix/bit32.c: New module implementing band, bnot and bor. + * ext/posix/posix.c: #include bit32.c. + * build-aux/config.ld.in (file): Add ext/posix/bit32.c. + * local.mk (EXTRA_ext_posix_posix_la_SOURCES): Likewise. + (posix_submodules): Likewise. + (ext_posix_bit32_la_LDFLAGS): Set module LDFLAGS. + * NEWS: Update. + +2014-11-04 Gary V. Vaughan + + maint: ignore src.rock files. + * .gitignore: Add *.src.rock. + + maint: update README. + * README.md: Fix some outdated paragraphs. + + maint: post-release administrivia. + * NEWS: Add header line for next release. + * .prev-version: Record previous version. + * ./local.mk (old_NEWS_hash): Auto-update. + + Release version 33.0.0 + * NEWS: Record release date. + + configury: adopt semantic versioning. + * configure.ac (AC_INIT): Bump version to 33.0.0. + + doc: document returned error numbers in many APIs. + * ext/posix/fcntl.c, ext/posix/poll.c, ext/posix/sched.c, + ext/posix/signal.c, ext/posix/stdio.c, ext/posix/stdlib.c, + ext/posix/sys/msg.c, ext/posix/sys/resource.c, + ext/posix/sys/socket.c, ext/posix/sys/stat.c, + ext/posix/sys/times.c, ext/posix/sys/utsname.c, + ext/posix/sys/wait.c, ext/posix/syslog.c, ext/posix/termio.c, + ext/posix/time.c, ext/posix/unistd.c, ext/posix/utime.c, + lib/posix/compat.lua, lib/posix/deprecated.lua: Document third + returned error number for many APIs. + +2014-11-03 Gary V. Vaughan + + syslog: add LOG_MASK, and pass bits to openlog and setlogmask. + Close #156. + * specs/posix_spec.yaml (openlog): Move from here... + * specs/posix_deprecated_spec.yaml (openlog): ...to here. + * specs/posix_spec.yaml (setlogmask): Move from here... + * specs/posix_compat_spec.yaml (setlogmask): ...to here. + * specs/posix_spec.yaml (closelog, syslog): Move from here + * specs/posix_syslog_spec.yaml (closelog, syslog): New file. + ...to here. + * specs/specs.mk (specl_SPECS): Add posix_syslog_spec.yaml. + * specs/posix_syslog_spec.yaml (openlog, setlogmask) + (LOG_MASK): Specify behaviour of new minimal bindings. + * ext/posix/compat.lua (openlog, setlogmask): Simplify + accordingly. + * lib/posix/deprecated.lua (openlog): Reimplement old string + specified option API in Lua over new minimal binding. + * ext/posix/syslog.c (PLOG_MASK): New function for converting + option priorities to mask bits. + * lib/posix/compat.lua (setlogmask): Reimplement old auto-ORing + API over new LOG_MASK and minimal setlogmask bindings. + * NEWS: Update. + + doc: remove unused posix.util.html. + * local.mk (dist_modules_DATA): Remove doc/modules/posix.util.html. + + posix: move openpty utility into posix and add argchecks. + * lib/posix/util.lua (openpty): Move from here... + * lib/posix.lua (openpty): ...to here. Add argcheck wrapper. + * lib/posix/util.lua: Reexport openpty for backwards compatibility. + * specs/posix_spec.yaml (openpty): Add specs for argchecks. + * build-aux/config.ld.in (file): Remove lib/posix/util.lua. + * NEWS: Update. + + specs: set initial describe headers consistently. + * specs/curses_spec.yaml, specs/posix_compat_spec.yaml, + specs/posix_ctype_spec.yaml, specs/posix_deprecated_spec.yaml, + specs/posix_fcntl_spec.yaml, specs/posix_fnmatch_spec.yaml, + specs/posix_grp_spec.yaml, specs/posix_pwd_spec.yaml, + specs/posix_sys_msg_spec.yaml, + specs/posix_sys_resource_spec.yaml, + specs/posix_sys_stat_spec.yaml, + specs/posix_sys_statvfs_spec.yaml, + specs/posix_sys_time_spec.yaml, specs/posix_sys_times_spec.yaml, + specs/posix_sys_utsname_spec.yaml, specs/posix_time_spec.yaml, + specs/posix_unistd_spec.yaml: Use dot delimmited module names + consistently in initial describe heading. + + doc: show return type correctly on exec and execp. + * ext/posix/unistd.c (Pexec, Pexecp): Show return type correctly. + + doc: show return type of posix.signal.signal. + * ext/posix/signal.c (signal): Show return type. + + refactor: move lua docs to the top of LDoc index sidebar. + * build-aux/config.ld.in (files): Move Lua files to the top of + the list. + + unistd: deprecate exec with string tuple args. + Close #167. + * specs/posix_spec.yaml (exec, execp): Move from here... + * specs/posix_deprecated.yaml (exec, execp): ...to here. + * specs/posix_unistd.yaml (exec, execp): ...and much simplified + specification here. + * ext/posix/unistd.c (runexec): Simplify accordingly. + * lib/posix/deprecated (exec, execp): Reimplement string tuple + passing, [0]-crippled API again over C binding. + * NEWS: Update. + + signal: modernize posix.signal. + Close #161. + * specs/posix_spec.yaml (kill, killpg, raise, signal): Move from + here... + * specs/posix_signal_spec.yaml (kill, killpg, raise, signal): + New file. ...to here. + * specs/specs.mk (specl_SPECS): Add specs/posix_signal_spec,yaml. + * examples/signal.lua: Rewrite in modern style. + * ext/posix/signal.c (Psignal): Update LDocs. + (luaopen_posix_signal): Add SIG_DFL and SIG_IGN constants. + * NEWS: Update. + +2014-11-02 Gary V. Vaughan + + specs: don't truncate output after fcntl examples. + * specs/lposix_spec.yaml (fcntl F_GETFL): Make sure to save and + correctly restore stdio buffering correctly around examples. + * NEWS: Update. + + deprecated: make sure bitwise operations are defined. + * lib/posix/deprecated.lau (bit): Require a bit operation lib. + (band, bnot, bor): Define local bitwise operators. + + refactor: separate undocumented compat APIs. + * lib/posix/compat.lua (doselection, PosixTm, LegacyTm, pushmode) + (bind, clock_getres, clock_gettime, connect, fadvise, fnmatch) + (getgroup, getpasswd, getpid, getrimit, gettimeofday, gmtime) + (hostid, isgraph, isprint, localtime, mktime, nanosleep, pathconf) + (setrlimit, stat, statvfs, strftime, strptime, sysconf, times) + (uname): Move from here... + * lib/posix/deprecated.lua (doselection, PosixTm, LegacyTm) + (pushmode, bind, clock_getres, clock_gettime, connect, fadvise) + (fnmatch, getgroup, getpasswd, getpid, getrimit, gettimeofday) + (gmtime, hostid, isgraph, isprint, localtime, mktime, nanosleep) + (pathconf, setrlimit, stat, statvfs, strftime, strptime, sysconf) + (times, uname): New file. ...to here. + * build-aux/sanity-cfg.mk (sc_error_message_uppercase): Adjust + accordingly. + * build-aux/config.ld.in (file): Add lib/posix/compat.lua. + * lib/posix/compat.lua: Document within posix module. + +2014-10-28 Gary V. Vaughan + + refactor: separate private argument checking helpers. + * lib/posix/compat.lua (argerror, argtypeerror, badoption) + (checkint, checkselection, checkstring, checktable, optint) + (optstring, opttable, toomanyargerror): Move from here... + * lib/posix/_argcheck.lua (argerror, argtypeerror, badoption) + (checkint, checkselection, checkstring, checktable, optint) + (optstring, opttable, toomanyargerror): New file. ...to here. + * local.mk (dist_luaposix_DATA): Add lib/posix/_argcheck.lua. + + socket: bind connect and bind minimally. + Close #158. + * specs/posix_spec.yaml (accept, bind, connect, getaddrinfo) + (listen, recv, recvfrom, send, sendto, setsockopt, shutdown) + (socket, socketpair): Move from here... + * specs/posix_sys_socket_spec.yaml (accept, bind, connect) + (getaddrinfo, listen, recv, recvfrom, send, sendto, setsockopt) + (shutdown, socket, socketpair): New file. ...to here. + (bind, connect): Adjust specifications to expect 0 returned upon + success. + * specs/posix_deprecated_spec.yaml (bind, connect): New file. + Check for backward compatible return types when imported from + posix module. + * specs/specs.mk (specl_SPECS): Add + specs/posix_sys_socket_spec.yaml and + specs/posix_deprecated_spec.yaml. + * ext/posix/sys/socket.c (bind, connect): Simplify accordingly. + * examples/socket.lua: Adjust to new style submodule imports. + * lib/posix/deprecated.lua (bind, connect): Write wrapper + functions to implement `true` return API. + * local.mk (dist_luaposix_DATA): Add lib/posix/deprecated.lua. + * lib/posix.lua.in: Import deprecated APIs. + + time: remote debugging with Travis!! + * lib/posix/compat.lua (clock_getres): Fix if guard for + undefined clock_getres. + (clock_gettime): Fix indentation. + * specs/psoix_time_spec.yaml (clock_getres, clock_gettime): Use + prototype instead of type to get metatable _type! + + time: bind clock_getres and clock_gettime minimally. + Close #159. + * specs/posix_time_spec.yaml (clock_getres, clock_gettime): Adjust + to specify passing of integer constants and return PosixTimespec + tables. + * specs/posix_compat_spec.yaml (clock_getres, clock_gettime): + Specify backwards compatible behaviours accepting optional name + and returning separate sec, nanosec results. + * ext/posix/time.c (get_clk_id_const): Remove. + (clock_getres, clock_gettime): Simplify. + * lib/posix/compat.lua (clock_getres, clock_gettime): Reimplement + old API over new minimal binding. + * NEWS: Update + +2014-10-25 Gary V. Vaughan + + time: bind nanosleep minimally. + Close #162. + * specs/posix_spec.yaml (nanosleep): Move from here... + * specs/posix_compat_spec.yaml (nanosleep): ...to here. + * specs/posix_time_spec.yaml (nanosleep): Specify behaviour of + minimal binding. + * ext/posix/time.c (totimespec, pushtimespec): New functions. + Convert between C struct timespec and Lua PosixTimespec table. + (nanosleep): Simplify accordingly. + * lib/posix/compat.lua (nanosleep): Reimplement old API over new + minimal binding. + * NEWS: Update. + + time: pass struct tm equivalent tables with POSIX field names. + * specs/posix_spec.yaml (gmtime, localtime, mktime, strftime) + (strptime): Move from here... + * specs/posix_compat_spec.yaml (gmtime, localtime, mktime) + (strftime, strptime): ...to here. Add full specifications. + * specs/posix_time_spec.yaml (clock_getres, clock_gettime, gmtime) + (localtime, mktime, strftime, strptime, time): Specify behaviours + of thin bindings for these APIs. + * specs/specs.mk (specl_SPECS): Add specs/posix_time_spec.yaml. + * ext/posix/time.c (Stm_fileds, totm, pushtm): Convert and verify + C struct tm records and Lua PosixTm tables. + (gmtime, localtime, mktime, strftime, strptime): Simplify + accordingly. + * lib/posix/compat.lua (PosixTm, LegacyTm): Convert between new + PosixTm tables and old custom field name `struct tm` tables. + (gmtime, localtime, mktime, strftime, strptime): Reimplement + legacy table manipulation APIs over new thin bindings. + * NEWS: Update. + + maint: tidy up sanity check configuration. + * build-aux/sanity-cfg.mk: Escape '.' in regexps properly. + Add lib/posix/compat.lua to sc_error_message_uppercase. + +2014-10-24 Gary V. Vaughan + + resource: bind getrlimit and setrlimit minimally. + Close #164. + * specs/posix_spec.yaml (getrlimit, setrlimit): Move from here... + * specs/posix_compat_spec.yaml (getrlimit, setrlimit): ...to here. + * specs/posix_sys_resource_spec.yaml (getrlimit, setrlimit): New + file. Specify minimal binding behaviours. + * specs/specs.mk (specl_SPECS): Add + specs/posix_sys_resource_spec.yaml. + * ext/include/_helpers.c (checkfieldtype): Improve nil diagnostic + to read 'no value'. + (lookup_symbol): Remove unused function. + * ext/posix/sys/resource.c (rlimit_map, Krlimit, Srlimit): Remove + unused internal APIs. + (pushrlimit): Push a PosixRlimit table onto the stack. + (getrlimit, setrlimit): Simplify accordingly. + * lib/posix/compat.lua (optint): New helper function. + (getrlimit, setrlimit): Reimplement string resource multi-return + API in Lua. + * NEWS: Update. + + refactor: reorder renamed fcntl functions alphabetically. + * ext/posix/fcntl.c: Order functions alphabetically. + + compat: adjust argerror diagnostics for backwards compatibility. + * lib/posix/compat.lua (fadvise): Adjust argerror diagnostics. + + maint: adjust badarguments example generation for fadvise. + * specs/posix_compat_spec.yaml (fadvise): Adjust fadvise + generation specifier. + + maint: missing declaration. + * ext/posix/fcntl.c (Pposix_fadvise): Add missing declaration. + + fcntl: bind posix_fadvise minimally. + Close #169. + * specs/posix_spec.yaml (fadvise): Move from here... + * specs/posix_compat_spec.yaml (fadvise): ...to here. + * specs/posix_fcntl_spec.yaml (posix_fadvise): Specify argcheck + behaviours on supporting systems. + * ext/posix/fcntl.c (Pfadvise): Rename from this... + (Pposix_fadvise): ...to this. Change first argument to a file + descriptor to match POSIX API. + * lib/posix/compat.lua (fadvise): Reimplement file handle + argument version in Lua. + * NEWS: Update. + + refactor: move _helper.c functions into only calling submodule. + * ext/include/_helpers.c (mygetuid, mygetgid): Move from here... + * ext/posix/unistd.c (mygetuid, mygetgid): ...to here. + + maint: remove unused doselection helper. + * ext/include/_helpers.c (Selector, doselection): Remove. + * ext/posix/sys/resource.c (Pgetrlimit): Remove unsolvable FIXME + comment. + + times: bind times minimally. + Close #165. + * specs/posix_spec.yaml (times): Move from here... + * specs/posix_compat_spec.yaml (times): ...to here. + * specs/posix_sys_times_spec.yaml (times): New file. Specify + minimal binding of times(2). + * specs/specs.mk (specl_SPECS): Add + specs/posix_sys_times_spec.yaml. + * ext/posix/sys/times.c (struct mytimes, Ftimes, Stimes): Remove. + (Ptimes): Simplify accordingly. + * lib/posix/compat.lua (times): Reimplement legacy multi-string + or table io/API over minimal C binding. + * NEWS: Update. + +2014-10-23 Gary V. Vaughan + + compat: fix a typo, so stat is wrapped with _DEBUG false. + * lib/posix/compat.lua (stat): When _DEBUG is false, make sure to + still add a stat function entry to the export table! + + statvfs: bind statvfs minimally. + * specs/posix_spec.yaml (statvfs): Move from here... + * specs/posix_compat_spec.yaml (statvfs): ...to here. + * specs/posix_sys_statvfs_spec.yaml (statvfs): New file. Specify + a minimal binding of statvfs(2). + * specs/specs.mk (specl_SPECS): Add + specs/posix_sys_statvfs_spec.yaml. + * ext/posix/sys/statvfs.c (Fstatvfs, Kpathvfs, Sstatvfs): Remove. + (Pstatvfs): Simplify drastically. + (luaopen_posix_sys_vfs): Add statvfs f_flags bitmasks. + * lib/posix/compat.lua (statvfs): Reimplement legacy multi-string + or table io/API over minimal C binding. + * NEWS: Update. + + maint: don't rely on undefined evaluation order. + * ext/posix/unistd.c (Ppathconf): The C standard allows arguments + to be evaluated in any order, and we have specl examples that + require argchecks proceed from left to right, so hoist the first + argument out of the nested call to satisfy that. + + unistd: wrap pathconf minimally. + * specs/posix_spec.yaml (pathconf): Move from here... + * specs/posix_compat_spec.yaml (pathconf): ...to here. + * specs/posix_unistd_spec.yaml (pathconf): Specify a minimal + binding of pathconf(2). + * ext/posix/unistd.c (pathconf_map, Fpathconf, Kpathconf) + (Spathconf): Remove. + (pathconf): Simplify drastically. + (luaopen_posix_unistd): Add pathconf argument constants. + * lib/posix/compat.lua (pathconf): Reimplement legacy multi- + string or table i/o API over minimal C binding. + * NEWS: Update. + + unistd: wrap sysconf minimally. + * specs/posix_spec.yaml (sysconf): Move from here... + * specs/posix_compat_spec.yaml (sysconf): ...to here. + * specs/posix_unist_spec.yaml (sysconf): Specify minimal + binding of sysconf(2). + * ext/posix/unistd.c (sysconf_map, Fsysconf, Ksysconf, Ssysconf): + Remove. + (sysconf): Simplify drastically. + (luaopen_posix_unistd): Add sysconf argument constants. + * lib/posix/compat.lua (sysconf): Reimplement legacy multi-string + or table i/o API over minimal C binding. + * NEWS: Update. + + posix: factor out doselection argument checking function. + * lib/posix/compat.lua (badoption, checkint, checkstring) + (checktable, optstring): Accept and propagate new error level + parameter. + (checkselection): Use them to factor out argument checking for + doselection argchecking wrappers. + (getpasswd, getpid, stat): Simplify argchecking wrappers + accordingly. + * NEWS: Update. + +2014-10-22 Gary V. Vaughan + + refactor: factor out doselection-like functionality. + * lib/posix/compat.lua (doselection): Given a table of field + names, and a mapping table return a tuple of remapped names, or + the whole table when no fields are passed. + (getpasswd, getpid, stat): Simplify accordingly. + + specs: specify posix.sys.stat.stat behaviour. + * specs/posix_sys_stat_spec.yaml (stat): New examples based on + lstat. + + specs: add missing file. + * specs/posix_fcntl_spec.yaml: New file. + + posix: move mode munching from C to Lua. + Close #147. + * specs/posix_spec.yaml (chmod, mkdir, mkfifo, msgget, open): + Move from here... + * specs/posix_compat_spec.yaml (chmod, mkdir, mkfifo, msgget) + (open): ...to here, and add functionality examples. + * specs/posix_sys_msg_spec.yaml (msgget), + specs/posix_sys_stat_spec.yaml (chmod, mkdir, mkfifo): Updated + versions of original examples, tailored to work with integer mode + arguments. + * local.mk (specl_SPECS): Add specs/posix_fcntl_spec.yaml and + specs/posix_sys_msg_spec.yaml. + * ext/posix/fcntl.c (Popen): Drastically simplified, to a + minimal POSIX binding. + * ext/posix/sys/msg.c (Pmsgget): Likewise. + * ext/posix/sys/stat.c (Pchomd, Pmkdir, Pmkfifo): Likewise. + * ext/include/_helpers.c (M, rwxrwxrwx, octal_mode, mode_munch): + Remove. No longer in use. + * lib/posix/compat.lua (checkint): New support function. + (chmod, mkdir, mkfifo, msgget, open): Reimplement legacy mode + munching APIs over minimal C bindings. + (create): Adjust to use new minimal open binding. + +2014-10-21 Gary V. Vaughan + + sys.stat: wrap umask minimally. + * specs/posix_spec.yaml (umask): Move from here... + * specs/posix_compat_spec.yaml (umask): ...to here. + * specs/posix_sys_stat_spec.yaml (umask): Specify minimal binding + for umask(2). + * ext/posix/sys/stat.c (umask): Simplify drastically. + * ext/include/_helpers.c (pushmode): Remove. No longer used. + * lib/posix/compat.lua (rwxrwxrwx, octal_mode, mode_munch): + Translated from C equivalents in ext/include/_helpers.c. + (umask): Use them to reimplement legacy modestring based API. + + refactor: move pushtimeval function to ext/posix/sys/time.c. + There's only one call-site for this function, so no need to keep + it in the shared helpers file. + * ext/include/_helpers.c (pushtimeval): Move from here... + * ext/posix/sys/time.c (pushtimeval): ...to here. + + maint: retain backwards compatibility with v32 posix.stat. + We now have `posix.sys.stat` for thin bindings of stat and lstat, + so maintain backwards compatibility with v32 in `posix.stat`. + * specs/posix_compat_spec.yaml (lstat): Remove. + (stat): Adjust to expect lstat under the hood. + * specs/posix_spec.yaml: Adjust stat/lstat clients. + * lib/posix/compat.lua (lstat): Remove. + (stat): Adjust to use lstat under the hood. + * NEWS: Update. + + specs: fix a bug in lstat.st_blocks example. + * specs/posix_sys_stat_spec.yaml (lstat): Don't expect number + of disk blocks used by a file to equal the number used by the + directory that file is in! + + compat: import bitwise operations before use. + * lib/posix/compat.lua: Import bitwise operations before use. + + maint: disable prohibit_stat_st_blocks sanity check. + * build-aux/sanity-cfg.mk (local-checks-to-skip): Add + sc_prohibit_stat_st_blocks, because we need to use st_blocks + here until licensing allows using the gnulib/module/stat-size. + + maint: add missing file. + * specs/posix_sys_stat_spec.yaml: New file, forgotten from last + commit. + + sys.stat: wrap stat and lstat properly. + * specs/posix_spec.yaml (lstat, stat): Move from here... + * specs/posix_compat_spec.yaml (lstat, stat): ...to here. + * specs/posix_sys_stat_spec.yaml: New file. Specify correct thin + binding for stat(2) and lstat(2). + * specs/specs.mk (specl_SPECS): Add posix_sys_stat_spec.yaml. + * ext/posix/sys/stat.c (pushstat): New function. Push a struct + stat-like table on top of the stack. + (S_ISBLK, S_ISCHR, S_ISDIR, S_ISFIFO, S_ISLNK, S_ISREG) + (S_ISSOCK): New APIs. + (S_IFMT, S_IFBLK, S_IFCHR, S_IFDIR, S_IFIFO, S_IFLNK, S_IFREG) + (S_IRWXU, S_IRUSR, S_IWUSR, S_IXUSR, S_IRWXG, S_IRGRP, S_IWGRP) + (S_IXGRP, S_IRWXO, S_IROTH, S_IWOTH, S_IXOTH, S_ISGID, S_ISUID): + New constants. + (Plstat, Pstat): Simplify accordingly. + (filetype, Fstat, Sstat): Remove. + * specs/spec_helper.lua (rmtmp): Update to use low-level stat + call. + * lib/posix/compat.lua (lstat, stat): Reimplement wierd multi- + return value, table or tuple input APIs over new lean bindings. + * NEWS: Update. + + maint: name posix_compat_spec.yaml correctly. + * specs/posix_compat.yaml: Move from here... + * specs/posix_compat_spec.yaml: ...to here. + * specs/specs.mk (specl_SPECS): Adjust accordingly. + + refactor: use std.object.type compatible metatables. + * specs/spec_helper.lua (prototype): Copied from lua-stdlib. + * specs/posix_grp_spec.yaml (getgrent, getgrgid, getgrnam): + Specify prototype responses for return tables. + * specs/posix_pwd_spec.yaml (getpwent, getpwnam, getpwuid): + Likewise., + * specs/posix_sys_time_spec.yaml (gettimeofday): Likewise. + * specs/posix_sys_utsname_spec.yaml (uname): Likewise. + * ext/include/_helpers.c (LPOSIX_STMT_BEG, LPOSIX_STMT_END): New + macros for safe compound statement macro definitions. + (LPOSIX_CONST, pushnumberfield, pushstringfield): Use them here. + (pushliteralfield): New macro for literal fields. + (setnumberfield, setstringfield, settypemetatable): New macros + for easy return table creation. + (pushtimeval): Simplify accordingly. Set metatable._type. + * ext/posix/curses/chstr.c (luaopen_posix_curses_chstr): Ditto. + * ext/posix/curses/window.c (luaopen_posix_curses_window): Ditto. + * ext/posix/grp.c (pushgroup): Ditto. + * ext/posix/pwd.c (pushpasswd): Ditto. + * ext/posix/sys/socket.c (pushsockaddrinfo): Ditto. + * ext/posix/sys/utsname.c (pushutsname): Ditto. + * NEWS: Update. + + maint: add missing file. + * specs/posix_sys_time_spec.yaml: Add missing file. + + doc: name timeval fields correctly. + * ext/posix/sys/time.c (timeval): Prefix both field names with + `tv_` per C struct timeval, and pushtimeval table. + + sys.time: wrap gettimeofday properly. + * specs/posix_spec.yaml (gettimeofday): Move from here... + * specs/posix_compat.yaml (gettimeofday): ...to here. + * specs/posix_sys_time_spec.yaml (gettimeofday): Specify correct + thin binding for gettimeofday(2). + * specs/specs.mk (specl_SPECS): Add posix_sys_time_spec.yaml. + * ext/include/_helpers.c (pushtimeval): New function. Push a + struct timeval-like table on top of the stack. + * ext/posix/sys/time.c (Pgettimeofday): Simplify accordingly. + * lib/posix/compat.lua (gettimeofday): Rewrite misnamed table + fields returning API here for backwards compatibility. + +2014-10-20 Gary V. Vaughan + + refactor: simplify push{string,number}field and clients. + * ext/include/_helpers.c (pushnumberfield, pushstringfield): + Reimplement as macros, with fewer arguments required. Adjust all + callers. + * ext/posix/sys/socket.c (sockaddr_to_lua): Renamed from this... + (pushsockaddrinfo): ...to this, and simplify considerably. Adjust + all callers. + + socket: allow getaddrinfo results as connect address argument. + Undo overzealous rejection of misnamed fields to socket.connect. + * ext/posix/sys/socket.c (Safinet_fields): Also permit fields + written to getaddrinfo results. + + maint: move stat and lstat from posix.unistd to posix.sys.std. + * ext/posix/unistd.c (filetype, Fstat, Sstat, Plstat, Pstat): + Move from here... + * ext/posix/sys/stat.c (filetype, Fstat, Sstat, Plstat, Pstat): + ...to here. + + utsname: wrap uname properly. + Close #154. + * specs/posix_spec.yaml (uname): Move from here... + * specs/posix_compat.yaml (uname): ...to here. Add diagnose bad + option example. + * specs/posix_sys_utsname_spec.yaml (uname): Specify correct thin + binding for uname(2). + * specs/specs.mk (specl_SPECS): Add posix_sys_utsname_spec.yaml. + * ext/posix/sys/utsname.c (pushutsname): New function to push + a table with struct utsname fields. + (uname): Use it to push the actual results of the call. + * lib/posix/compat.lua (uname): Rewrite old format specifier + replacing API here for backwards compatibility. + + ctype: wrap isprint and isgraph properly. + Close #160. + * specs/posix_spec.yaml (isprint, isgraph): Move from here... + * specs/posix_compat.yaml (isprint, isgraph): ...to here. Add + result specifications. + * specs/posix_ctype_spec.yaml (isprint, isgraph): Specify correct + thin binding for these functions. + * specs/specs.mk (specl_SPECS): Add posix_ctype_spec.yaml. + * ext/posix/ctype.c (isprint, isgraph): Return the actual result + of calling these functions. + * lib/posix/compat.lua (isprint, isgraph): Rewrite the weird true/ + false return API here for backwards compatibility. + + fnmatch: wrap fnmatch(3) properly. + Close #168. + * specs/posix_spec.yaml (fnmatch): Move from here... + * specs/posix_compat.yaml (fnmatch): ...to here. + * specs/posix_fnmatch_spec.yaml (fnmatch): Specify correct thin + binding for fnmatch(3). + * specs/specs.mk (specl_SPECS): Add posix_fnmatch_spec.yaml. + * ext/posix/fnmatch.c (fnmatch): Return the actual result of + the call. + (luaopen_posix_fnmatch): Export FNM_NOMATCH constant. + * lib/posix/compat.lua (fnmatch): Rewrite the weird true/false + error raising API here for backwards compatibility. + + doc: add curses constants LDocs. + * ext/posix/curses.c: Document constants. + (register curses constants): Fix a typo so that KEY_F31 is + defined as advertised. + * NEWS: Update. + + doc: LDoc config improvements. + * build-aux/config.ld.in (title): Display package name as well as + release number. + (description): Mention inclusion of curses bindings explicitly. + (backtick_references): Require @{...} for cross-references, + leaving backticks for terminal font markup. + + doc: tidy up LDoc output for posix.termio. + * ext/posix/termio.c: Tidy up formatting for LDocs. + +2014-10-19 Gary V. Vaughan + + slingshot: sync with upstream, for git submodule fixes. + * slingshot: Sync with upstream. + * bootstrap: Import from slingshot. + + doc: add LDocs for submodule constants. + * ext/posix/errno.c, ext/posix/fcntl.c, ext/posix/fnmatch.c, + ext/posix/sched.c, ext/posix/signal.c, ext/posix/stdio.c, + ext/posix/sys/msg.c, ext/posix/sys/socket.c, ext/posix/sys/wait.c, + ext/posix/syslog.c, ext/posix/unistd.c: Add LDocs for constants. + * NEWS: Update. + +2014-10-17 Gary V. Vaughan + + posix: use correct POSIX gethostid API. + Closes #153. + * specs/posix_spec.yaml (hostid): Move from here... + * specs/posix_compat.yaml (hostid): ...to here. + * specs/posix_unistd_spect.yaml (gethostid): Specify with correct + POSIX API name. + * ext/posix/unistd.c (Phostid): Rename from this... + (Pgethostid): ...to this. + * lib/posix/compat.lua (hostid): An alias to gethostid for + backwards compatibility. + * NEWS: Update. + + maint: add missing lib/posix/compat.lua file. + * lib/posix/compat.lua: New file, forgotten from an earlier + commit. + + maint: add missing specs/posix_compat.yaml file. + * specs/posix_compat.yaml: New file, forgotten from previous + commit. + +2014-10-16 Gary V. Vaughan + + refactor: maintain backwards compatibility for getpasswd. + Closes #148. + Separate backwards compatibility functions so that they still + work as before, but do not appear in the documentation. + * specs/posix_spec.yaml (creat, getgroup, getpasswd, getpid): + Move from here... + * specs/posix_compat_spec.yaml (creat, getgroup, getpasswd) + (getpid): New file. ...to here. + * lib/posix.lua.in (argerror, argtypeerror, checkstring) + (checktable, toomanyargerror, creat, getgroup, getpasswd) + (getpid): Move from here... + * lib/posix/compat.lua (argerror, argtypeerror, checkstring) + (checktable, toomanyargerror, creat, getgroup, getpasswd) + (getpid): New file. ...to here. + * NEWS: Update. + + refactor: simplify posix.getpasswd for consistency. + * specs/posix_spec.yaml (getpasswd): Simplify behaviours for + consistency with pasix.getgroup. + * lib/posix.lua.in (getpasswd): Simplify accordingly. + * NEWS: Update. + + unistd: implement getpid and similar APIs. + Closes #152. + * specs/posix_unistd_spec.yaml: New file. Specify behaviours for + getegid, geteuid, getgid, getpgrp, getpid, getppid, getuid. + * specs/specs.mk (specs_SPECS): Add specs/posix_unistd_spec.yaml. + * ext/posix/unistd.c (getpid): Delete. + (setegid, geteuid, getgid, getpgrp, getpid, getppid, getuid): New + functions. Satisfy specifications. + * lib/posix.lua.in (getpid): Reimplement legacy API over new + POSIX bindings. + * NEWS: Update. + + posix: getgroup argument defaults to egid. + * specs/posix_spec.yaml (getgroup): Specify behaviour with no + arguments. + * lib/posix.lua.in (group): New LDocs for getgroup return table + fields. + (getgroup): Adjust LDocs accordingly. + Default to egid with no argument. + * NEWS: Update. + + pwd: implement POSIX pwd APIs. + Closes #150. + (getpwuid, setpwent): Specify correct behaviours. + * ext/posix/pwd.c (endpwent, getpwent, getpwnam, getpwuid) + (setpwent): Implement bindings to these POSIX pwd APIs. + * ext/posix/pwd.c (getpasswd): Remove. + * lib/posix.lua.in (getpasswd): Reimplement over POSIX APIs to + continue satisfying specifications. + * NEWS: Update. + + refactor: tidy up formatting in grp.c. + * ext/posix/grp.c: Tidy up formatting. + +2014-10-14 Gary V. Vaughan + + specs: specify timer math behaviours. + * specs/posix_spec.yaml (timeradd, timercmp, timersub): Specify + behaviours. + * lib/posix.lua.in (timeradd, timercmp, timersub): Argcheck + wrappers return inner function results. + (timercmp, timersub): Fix typo with initial definition scopes. + + refactor: reorder posix.lua.in functions alphabetically. + * lib/posix.lua.in: Reorder functions alphabetically. + + specs: add argument checking to Lua language posix functions. + * specs/posix_spec.yaml (creat, getgroup, spawn, pipeline) + (pipeline_iterator, pipeline_slurp, euidaccess, timeradd) + (timercmp, timersub): Add basic argument checking behaviour + specifications. + * lib/posix.lua.in: Move submodule imports to the start, so they + are available to local Lua functions. + Cache import table lookups into upvalues for fast access. + (creat, getgroup, spawn, pipeline, pipeline_iterator) + (pipeline_slurp, euidaccess, timeradd, timercmp, timersub): + Use cached upvalues everywhere. + Split argument type checking into wrapper function which is not + used when global `_DEBUG` is false. + + refactor: factor Lua argument checking into helper functions. + * lib/posix.lua.in (argerror, toomanyargerror, argtyperror): + Argument error message management, inspired by stdlib. + (checkstring, checktable): Check argument types, inspired by Lua + C API. + (creat, getgroup, pipeline): Simplify accordingly. + + maint: revert a1f9049 'move creat from Lua to C'. + * ext/posix/fcntl.c (creat): Remove. + * lib/posix.lua (creat): Implement in Lua. + * specs/posix_spec.yaml (creat): Adjust. + * NEWS: Update. + + specs: allow empty root group membership. + * specs/posix_grp_spec.yaml (getgrgid, getgrnam): Allow empty + root group membership. + * specs/posix_spec.yaml (getgroup): Likewise. + + maint: remove trailing blanks. + * specs/posix_grp_spec.yaml: Remove trailing blanks. + + grp: implement POSIX group APIs. + Closes #151. + * specs/posix_grp_spec.yaml (endgrent, getgrent, getgrgid) + (getgrnam, setgrent): Specify correct behaviours. + * ext/posix/grp.c (endgrent, getgrent, getgrgid, getgrnam) + (setgrent): Implement bindings to these POSIX group APIs. + * specs/posix_spec.yaml (getgroup): Specify expected behaviour. + * ext/posix/grp.c (getgroup): Remove. + * lib/posix.lua (getgroup): Reimplement over POSIX APIs to + continue satisfying specifications. + * NEWS: Update. + + specs: remove unused curses subdirectory paths. + * specs/spec_helper.lua (package.cpath): Remove unused curses + subdirectory paths. + +2014-10-13 Gary V. Vaughan + + refactor: write final semi-colons at expansion site. + Give text editors a fighting chance of doing auto-indentation + properly. + * ext/posix/curses.c (CCR): Remove final semi-colon from macro + expansion. + Write a literal semi-colon at each expansion site. + + curses: add curses.A_COLOR constant where supported. + * ext/posix/curses.c (register_curses_constants): Define A_COLOR. + * NEWS: Update. + + doc: add summary sentence to each curses API. + * ext/posix/curses.c, ext/posix/curses/window.c: Add API summary + lines. + +2014-10-11 Gary V. Vaughan + + doc: put release number in index.html. + * build-aux/config.ld.in (project): Add release number. + + configury: fix documentation dependencies. + * local.mk (allhtml): All generated documentation. + Use it to ensure we regenerate as necessary. + + maint: add missing boilerplate copyright to lua sources. + * lib/posix.lua.in, lib/posix/util.lua: Add boilerplate copyright + + doc: add per-module overview. + * build-aux/config.ld.in (boilerplate): Set to true so we can put + a copyright comment at the very top of each file. + * ext/posix/ctype.c, ext/posix/curses.c, + ext/posix/curses/chstr.c, ext/posix/curses/window.c, + ext/posix/dirent.c, ext/posix/errno.c, ext/posix/fcntl.c, + ext/posix/fnmatch.c, ext/posix/getopt.c, ext/posix/glob.c, + ext/posix/grp.c, ext/posix/libgen.c, ext/posix/poll.c, + ext/posix/pwd.c, ext/posix/sched.c, ext/posix/signal.c, + ext/posix/stdio.c, ext/posix/stdlib.c, ext/posix/sys/msg.c, + ext/posix/sys/resource.c, ext/posix/sys/socket.c, + ext/posix/sys/stat.c, ext/posix/sys/statvfs.c, + ext/posix/sys/time.c, ext/posix/sys/times.c, + ext/posix/sys/utsname.c, ext/posix/sys/wait.c, + ext/posix/syslog.c, ext/posix/termio.c, ext/posix/time.c, + ext/posix/unistd.c, ext/posix/utime.c: Move copyright comments + to the very top of the file. Add a short overview description. + + curses: remove separate curses doc generation. + * build-aux/make_lcurses_doc.pl: Remove. + * local.mk (DIST_DOC_DATA, EXTRA_DIST): Adjust accordingly. + (classesdir): Location for ldoc class html files. + (dist_classes_DATA): Add new generated curses class docs. + * ext/posix/curses.c: Rewrite equivalent docs here. + * NEWS: Update. + + doc: add updated curses example. + * examples/curses.lua: Updated example from old lcurses docs. + + curses: don't forget to open curses submodules. + * ext/posix/curses.c (luaopen_posix_curses): Open submodules. + + curses: factor out chstr and window objects. + * ext/posix/curses.c: Factor out chstr and window objects, + methods and support functions from here... + * ext/posix/curses/chstr.c, ext/posix/curses/window.c: ...to + here. + * ext/posix/curses.c, ext/posix/curses/chstr.c, + ext/posix/curses/window.c: Add rudimentary LDocs to every API. + * build-aux/config.ld.in (file): Add ext/posix/curses/window.c, + ext/posix/curses/chstr.c and ext/posix/curses.c. + * ext/posix/curses/chstr.c: Add __call metamethod for creating + new objects. + * ext/posix/curses/chstr.c, ext/posix/curses/window.c: Add _type + field for compatibility with `std.object.type`. + * local.mk (EXTRA_ext_posix_posix_la_SOURCES): Add + ext/posix/curses/chstr.c and ext/posix/curses/window.c. + (posix_submodules): Add ext/posix/curses/chstr.la and + ext/posix/curses/window.la. + * build-aux/config.ld.in (custom_see_handler): Adjust to create + working URLs for curses 3X manual pages. + +2014-10-10 Gary V. Vaughan + + refactor: rename chstr_ prefixed functions to C prefix. + * ext/posix/curses.c: Rename chstr_ prefixed function to C + prefix. + (chstrlib): Use LUAPOSIX_FUNC instead of MENTRY. + + refactor: rename curses api function with P prefix. + * ext/posix/curses.c: Rename C prefixed functions with P prefix. + + refactor: use _helpers.c checkint and optint in curses submodule. + * ext/posix/curses.c: Use checkint and optint throughout instead + of luaL_checkint & luaL_checknumber and luaL_optint resp. + + refactor: reformat curses.c to match posix sources. + * ext/posix/curses.c: Reformat. + + refactor: unroll curses submodule function generator macros. + * ext/posix/curses.c: Unroll obfuscating function generating + macros. + (LC_NUMBER, LC_NUMBER2, LC_STRING, LC_STRING2, LC_BOOL) + (LC_BOOLOK, LCW_BOOLOK, LCW_BOOLOK2, LCW_WIN2, LCW_WIN2YX) + (LC_ATTROK, LC_TOGGLEOK, LCW_WINBOOLOK, LCW_WININTOK): Remove. + * ext/include/_helpers.c (pushboolresult, pushintresult) + (pushstringresult): New macros to simplify returning a single + object on the stack. + * ext/include/curses.c (pushokresult): Likewise. + * ext/posix/ctype.c, ext/posix/curses.c, ext/posix/dirent.c, + ext/posix/fnmatch.c, ext/posix/signal.c, ext/posix/stdio.c, + ext/posix/stdlib.c, ext/posix/sys/socket.c, ext/posix/time.c, + ext/posix/unistd.c: Simplify accordingly. + + curses: use _helpers.c macros. + * ext/posix/curses.c (LCURSES_SPLICE, LCURSES_STR, LCURSES_STR_1): + Remove. Adjust all callers to use LPOSIX equivalents from + ext/include/_helpers.c. + (curseslib, windowlib): Use LPOSIX_FUNC to declare table entries + rather than custom MENTRY macros. + + posix: consolidate included C sources. + * ext/include/strlcpy.c: Add multiple include guards. + * ext/posix/_helpers.c: Move from here... + * ext/include/_helpers.c: ...to here. + * local.mk (EXTRA_ext_posix_posix_la_SOURCES) + (EXTRA_DIST): Adjust accordingly. + + curses: integrate into posix tree. + * ext/curses/curses.c: Move from here... + * ext/posix/curses.c: ...to here. + * local.mk + * ext/posix/curses.c (luaopen_curses_c): Rename from this... + (luaopen_posix_curses): ...to this. + * lib/curses.lua: Adjust accordingly. + * local.mk (curses_cpath, ext_curses_curses_c_la_SOURCES) + (ext_curses_curses_c_la_LDFLAGS): Remove. + (std_cpath): Simplify accordingly. + (EXTRA_ext_posix_posix_la_SOURCES): Add ext/posix/curses.c. + (ex_posix_curses_la_LDFLAGS, ext_posix_posix_la_LDFLAGS): Add + $(CURSES_LIB). + (posix_submodules): Add ext/posix/curses.la. + * ext/posix/curses.c (luaopen_posix_curses): Add a version + entry to the returned table to match other posix modules. + * build-aux/make_lcurses_doc.pl: Adjust accordingly. + * ext/posix/posix.c: Include curses.c module. + * configure.ac (WANTEDLIBS, WANTEDLUA): Remove. Treat it like + other posix modules with no OS support. + * local.mk (dist_lua_DATA, luaexec_LTLIBRARIES): Adjust + accordingly. + +2014-10-09 Gary V. Vaughan + + configury: make posix module version dynamic. + * lib/posix.lua: Move from here... + * lib/posix.lua.in: ...to here. + (version): Use @PACKAGE_STRING@ in place of hard-coded 33. + * configure.ac (AC_CONFIG_FILES): Add lib/posix.lua. + * .gitignore: Add lib/posix.lua. + + configury: add missing fdatasync declaration if necessary. + Fixes #172. + * configure.ac (AC_CHECK_DECLS_ONCE): Check for missing fdatasync + declaration, e.g. on Mac OS 10.9. + * ext/posix/unistd.c (Pfdatasync): Roll our own to save a compiler + warning if the system didn't supply one. + + posix: build and install modules correctly. + * configure.ac (POSIX_EXTRA_LDFLAGS): Rename from this... + (LIBRT): ...to this. + (LIBCRYPT): Set according to results of AC_SEARCH_LIBS. + * local.mk (lib_LTLIBRARIES): Moved from the C library tree... + (luaexec_LTLIBRARIES): ...to the Lua cpath tree. + (check_LTLIBRARIES): Move from here... + (EXTRA_LTLIBRARIES): ...to here. + (check_local): Ensure standalone modules build correctly... + (clean_local): ...and that file droppings are removed. + * NEWS: Update. + + posix: allow standalone reuse of posix submodules. + * ext/posix/sys/msg.c, ext/posix/sys/socket.c, + ext/posix/syslog.c: Move guards to ensure even on hosts with no + sys/msg.h, we don't get an empty object file. + * local.mk (noinst_LTLIBRARIES): Add standalone compilations to + ensure the submodules really build as separate compilation units. + * NEWS: Update. + + posix: split posix subfiles into separate modules. + * ext/posix/_helpers.h: Removed. Content moved from here... + * ext/posix/_helpers.c: ...to here. Adjust all callers. + * ext/posix/posix.c (R, luaopen_posix_c): Move registered + functions and constants from here... + * ext/posix/ctype.c, ext/posix/dirent.c, ext/posix/errno.c, + ext/posix/fcntl.c, ext/posix/fnmatch.c, ext/posix/getopt.c, + ext/posix/glob.c, ext/posix/grp.c, ext/posix/libgen.c, + ext/posix/poll.c, ext/posix/pwd.c, ext/posix/sched.c, + ext/posix/signal.c, ext/posix/stdio.c, ext/posix/stdlib.c, + ext/posix/sys/msg.c, ext/posix/sys/resource.c, + ext/posix/sys/socket.c, ext/posix/sys/stat.c, + ext/posix/sys/statvfs.c, ext/posix/sys/time.c, + ext/posix/sys/times.c, ext/posix/sys/utsname.c, + ext/posix/sys/wait.c, ext/posix/syslog.c, ext/posix/termio.c, + ext/posix/time.c, ext/posix/unistd.c, ext/posix/utime.c: ...to + here. Provide individual `luaopen_` entry functions. + build-aux/config.ld.in, build-aux/sanity-cfg.mk: Adjust + accordingly. + * ext/posix/posix.c: Reduce to a single compilation unit that + includes the sources for all the other submodules. + * lib/posix.lua (openpty): Move from here... + * lib/posix/util.lua (openpty): New file. ...to here. + * lib/posix/sys.lua: Move definitions from here... + * lib/posix.lua: ...to here. + * lib/posix/sys.lua: Re-export backwards compatibility APIs from + here too. + * lib/posix.lua: Re-export all submodule entry points from here + too to retain the flat namespace of old releases. + * local.mk: Adjust accordingly. + * NEWS: Update. + + posix: missing headers for Linux portability. + * ext/posix/pwd.c: Include unistd.h for geteuid and others. + * ext/posix/stdlib.c: Include fcntl.h for open. + * ext/posix/sched.c: Include unistd.h for + _POSIX_PRIORITY_SCHEDULING. + * ext/posix/sys/msg.c, ext/posix/sys/socket.c, + ext/posix/syslog.c: Include unistd.h for _POSIX_VERSION. + * ext/posix/sys/times.h: Include unistd.h for sysconf. + + maint: split giant posix.c file into manageable chunks. + * ext/posix/posix.c: Separate into sections... + * ext/posix/_helpers.c, ext/posix/_helpers.h, ext/posix/ctype.c, + ext/posix/dirent.c, ext/posix/errno.c, ext/posix/fcntl.c, + ext/posix/fnmatch.c, ext/posix/getopt.c, ext/posix/glob.c, + ext/posix/grp.c, ext/posix/libgen.c, ext/posix/poll.c, + ext/posix/pwd.c, ext/posix/sched.c, ext/posix/signal.c, + ext/posix/stdio.c, ext/posix/stdlib.c, ext/posix/syslog.c, + ext/posix/termio.c, ext/posix/time.c, ext/posix/unistd.c, + ext/posix/utime.c: ...here. + * ext/posix/posix.c: #include sources back into here. + * build-aux/config.ld.in (file): Adjust accordingly. + * build-aux/sanity-cfg.mk: Likewise. + * lib/posix.lua: Likewise. + +2014-10-09 Gary V. Vaughan + + Merge pull request #173 from tylerneylon/master + doc: gettimeofday uses microsec, not nano. + + * ext/posix/posix.c (gettimeofday): Fix a typo in usec documentation. + Reported by Tyler Neylon + +2014-10-09 Tyler Neylon + + Fix a typo: gettimeofday uses microsec, not nano. + +2014-10-09 Gary V. Vaughan + + maint: git ignore .dirstamp files. + * .gitignore: Add .dirstamp catch all. Remove per-directory + duplicates of the same. + + slingshot: resync with upstream for yaml bugfix. + * slingshot: Resync with upstream for yaml quoting bugfix. + * .travis.yml: Regenerate. + + slingshot: sync with upstream for mkrockspecs bugfix. + * slingshot: Sync with upstream for mkrocspecs bugfix. + * .travis.yml: Regenerate. + +2014-10-06 Gary V. Vaughan + + maint: simplify installation instructions in README.md. + * README.md (Installation): Remove --server flag; moonscript.org + is checked automatically now. + + maint: add myself to the copyright holders in posix.c. + * ext/posix/posix.c: Add myself to the copyright holders. + + specs: compare file size rather than racey modification times. + Fix #145. + * specs/posix_spec.yaml (stat): Compare the size statistic + rather than mtime to avoid a race condition. + + posix: remove call to 5.2-only lua_tointegerx and simplify. + * ext/posix/posix.c (interror): Remove, and fold functionality + from here... + (checkinteger): ...to here. + (argtypeerror): Simplify accordingly. + + specs: don't fail tty tests when run from /dev/console + * specs/posix_spec.yaml (ttyname): Allow /dev/console. + + posix: enforce argument types for clock_getres and clock_gettime. + * ext/posix/posix.c (Pclock_getres, Pclock_gettime): Use + luaL_checkstring instead of lua_tostring to enforce argument + type checking. + +2014-10-05 Gary V. Vaughan + + posix: add posix.IPPROTO_UDP. + * ext/posix/posix.c: Add IPPROTO_UDP definition. + + doc: improve posix LDocs. + * expt/posix/posix.c: Use [opt] annotations, and add missing + manual references. + + configury: remove duplicated SPECL_ENV settings. + * specs/specs.mk (SPECL_ENV): Remove - these same valuas are + already propagated automatically by slingshot. + + posix: show correct argument errors for fadvise and setsockopt. + * ext/posix/posix.c (Pfadvise): Use checkint rather than + luaL_checkinteger for correct argument error formatting. + (Psetsockopt): Likewise for luaL_checknumber. + + slingshot: sync with upstream for SPECL_ENV improvements. + * slingshot: Sync with upstream. + * specs/specs.mk (SPECL_ENV): Set according to slingshot + recommendations. + * specs/specs_helper.lua (package.path): Likewise. + + posix: argument errors overhaul. + * specs/spec_helper.lua (bind, init): Remove. + * specs/lposix_spec.yaml, specs/posix_spec.yaml: Specify argument + error diagnostics for all APIs. + * ext/posix/posix.c: Use checknargs, or other means to diagnose + argument type and arity errors for all APIs. + * NEWS: Update. + + maint: reformat for consistency and GNU style function headers. + * ext/posix/posix.c: Put function return types on a separate + line for easy function name grepping; don't use cuddle braces; + indent case branches one tab; exdent labels one tab; don't put a + space between function call and arguments; do put a space between + flow control keyword and arguments. + + maint: add buildreq tools to bootstrap.conf. + * bootstrap.conf (buildreq): List bootstrap build requirements. + +2014-10-01 Gary V. Vaughan + + docs: move lseek, sync and nice to the correct sections. + * ext/posix/posix.c (lseek): Move to "File descriptors" section. + (sync): Move to "File system" section. + (nice): Move to "Process management" section. + + maint: fix a type name typo. + * ext/posix/posix.c (poll_fd_list_from_table): Replace missing + 'e' in lua_State from last commit. + + maint: reformat for consistency. + * ext/posix/posix.c: Use TAB indents, comma-space argument + separators and function declarations all-on-one-line consistently. + + doc: modernize LDocs. + * ext/posix/posix.c (Pgetopt, Ppoll, Pfcntl, Pdirname, Pfnmatch) + (Pglob, Psymlink, Paccess, Pfadvise, Pumask, Putime, Pwaitpid) + (Psetlogmask): Modernize LDocs. + + doc: use correct manual references for isprint and isgraph. + * ext/posix/posix.c (isgraph, isprint): Use correct manual page + references. + +2014-09-21 Gary V. Vaughan + + specs: expect sockaddr.groups type to be number, not string. + * specs/posix_spec.yaml (bind, connect, sendto): Expect correct + type for AF_NETLINK socket groups field. + + Merge branch 'zevv-sockaddr-errors' + + posix: provide idiomatic argument errors from sockaddr calls. + * specs/spec_helper.lua (init): New helper to return a partial + application of expected argument error call. + * specs/posix_spec.yaml (bind, connect, sendto): Use it to + specify expected bad argument errors. + * ext/posix/posix.c (try_getfield): Move from here... + (checkfieldtype): ...to here. Lua functions normally throw an + error for bad arguments, so do that for posix API argument errors + too. + (sockaddr_from_lua): Use it. + Provide a default case branch to report unsupported socket family + arguments. + (checknargs): Throw an error for too many arguments. + (Pbind, Pconnect, Psendto): Use it. + Revert to reporting invalid socket address if sockaddr_from_lua + fails without diagnosing a type error. + +2014-09-20 Ico Doornekamp + + posix: add better error reporting on sockaddr table member fields. + * ext/posix/posix.c (try_getfield): New function. Wrap + `lua_getfield`, but push more accurate error diagnostics in case + of type mismatch. + (sockaddr_from_lua, Pconnect, Pbind, Psendto): Use it. + +2014-08-26 Gary V. Vaughan + + slingshot: synch with upstream, for slack integrations. + * slingshot: Synch with upstream. + * .slackid: Add slack id. + * .travis.yml: Regenerate. + + Merge branch 'hjelmeland-f_sched_setscheduler' + + posix: tidy up rt_sched patches for merging. + * configure.ac (AC_CHECK_FUNCS): Add sched_getscheduler and + sched_setscheduler. + * ext/posix/posix.c (Psched_setscheduler, Psched_getscheduler): + Improve compilation guards to also require HAVE_SCHED_GETSCHEDULER + and HAVE_SCHED_SETSCHEDULER before exposing to Lua. + * examples/rt_sched.lua: Remove trailing tabs. + +2014-08-26 Egil Hjelmeland + + whitespace polish + + whitespace polish + + Added sched_setscheduler example/test + + Use ifdef _POSIX_PRIORITY_SCHEDULING to protect sched_setscheduler + + merge upstream + +2014-08-19 Gary V. Vaughan + + posix: support IPC_NOWAIT constant. + Closes #140. + * ext/posix/posix.c (luaopen_posix_c): Add IPC_NOWAIT constant. + Reported by Bernd Eggink. + +2014-07-31 Gary V. Vaughan + + travis: use luarocks beta with rocks.moonscript.org. + * .travis.yml: Regenerate with latest slingshot. + + maint: upgrade slingshot to work even when luarocks.org is down. + * slingshot: Upgrade to latest upstream. + + doc: update luarocks install instructions. + * README.md (Installation): Update to reference moonscript rocks + repository, which has better uptime than the default luarocks + domain used by released LuaRocks. + +2014-07-26 Egil Hjelmeland + + Added sched_setscheduler()/sched_getscheduler() + +2014-07-17 Gary V. Vaughan + + Merge branch 'waffle-iron-master' + +2014-07-17 Making GitHub Delicious. + + add waffle.io badge + +2014-06-29 Gary V. Vaughan + + refactor: move common spec initialisation to spec_helper.lua. + This also allows running the latest (unreleased) specl directly + from the bulid directory without having to call `make check`. + * specs/spec_helper.lua: New file. Set package.path and + package.cpath so that specl can find specified modules without + LUA_PATH and LUA_CPATH. + Add common code... + * specs/lposix_spec.yaml, specs/posix_spec.yaml: ...from here. + * specs/specs.mk (EXTRA_DIST): Add specs/spec_helper.lua. + + posix: move creat from Lua to C. + Better support for projects that copy posix.c into their own tree + and compile directly. + * lib/posix.lua (creat): Move from here... + * ext/posix/posix.c (creat): ...to here. + * NEWS: Update. + +2014-06-28 Gary V. Vaughan + + posix: tighten up readlink call. + * specs/posix_spec.yaml (readlink): New specifications for + readlink behaviours and error handling. + * ext/posix/posix.c (Preadlink): Implement better error handling, + and robustness. + * NEWS: Update. + + posix: wrap stat and lstat correctly. + * specs/posix_spec.yaml (describe stat): Adjust specs for correct + behaviour of stat. + (describe lstat): New examples to specify behaviour of new lstat + wrapper. + * ext/posix/posix.c (Pstat): Call stat(2), not lstat(2)! + (Plstat): New wrapper for lstat(2). + (R): Add Plstat. + * NEWS: Update. + +2014-05-30 Gary V. Vaughan + + maint: post-release administrivia. + * configure.ac (AC_INIT): Bump release number to 33. + * NEWS: Add header line for next release. + * .prev-version: Record previous version. + * ./local.mk (old_NEWS_hash): Auto-update. + + Release version 32 + * NEWS: Record release date. + +2014-05-25 Gary V. Vaughan + + maint: bump copyright to include 2014. + * COPYING: Bump copyright years to include 2014. + + travis: ignore CVE-2012-3386 failure on Ubuntu Precise. + Travis runs on Ubuntu 12.04 LTS, which ships an automake old + enough to still be vulnerable... but we're running CI checks + here, so that shouldn't fail the whole build! + * .travis.yml: Skip CVE-2012-3386 check. + + travis: ensure sanity-checks don't back up before a release. + * .travis.yml: Append `make syntax-check` to prevent sanity + erosion! + + posix: avoid spurious parens in cpp directives. + * ext/posix/posix.c: Remove some spurious parentheses in ifdef + statements. + + posix: use strlcpy instead of broken strncpy. + * ext/curses/strlcpy.c: Move from here... + * ext/include/strlcpy.c: ...to here. + (strlcpy): Declare static to prevent symbol clashes. + * local.mk (ext_curses_curses_c_la_CPPFLAGS): Remove. strlcpy is + now in existing header directory. + * build-aux/sanity-cfg.mk: Adjust strlcpy path references. + * ext/posix/posix.c: Include strlcpy.c. + (sockaddr_from_lua, Psetsockopt): Use strlcpy to avoid security + and safety problems with strncpy. + + maint: remove spurious trailing blank lines. + * examples/netlink-uevent.lua, examples/ping.lua: Remove + spurious trailing blank lines. + + configury: exclude ext/posix/posix.c from file_system check. + * build-aux/sanity-cfg.mk (sc_file_system): Exclude + ext/posix/posix.c. + + doc: add missing termios api LDocs. + * ext/posix/posix.c (tcdrain, tcflow, tcflush, tcgetattr) + (tcsendbreak, tcsetattr): Add missing LDoc api headers. + * NEWS: Update. + + doc: add missing socket api LDocs. + * ext/posix/posix.c (accept, bind, connect, getaddrinfo, listen) + (recv, recvfrom, send, sendto, setsockopt, shutdown, socket) + (socketpair): Add missing LDoc api headers. + * NEWS: Update. + + maint: `P` function prefix is for Published APIs exposed to Lua. + Naming a C function with a leading `P` indicates that it is + published to Lua. Rename some functions that are not named + according to this scheme. + * ext/posix/posix.c (Ppoll_event_map) + (Ppoll_events_createtable, Ppoll_events_from_table) + (Ppoll_events_to_table, Ppoll_fd_list_check_table) + (Ppoll_fd_list_from_table, Ppoll_fd_list_to_table): Rename from + these... + (poll_event_map, poll_events_createtable, poll_events_from_table) + (poll_events_to_table, poll_fd_list_check_table) + (poll_fd_list_from_table, poll_fd_list_to_table): ...to these. + Adjust all callers. + + tests: remove spurious tests-termios.lua. + * tests-termios.lua: Remove. The existing examples/termios.lua + demonstrates more functionality. + + docs: reorder posix.c and break into groups of named functions. + * build-aux/config.ld.in (sort): Alphabetize documentation within + sections. + * ext/posix/posix.c: Add section blocks for related functions and + move declarations into appropriate sections. + + slingshot: sync with upstream. + * slingshot: Sync with upstream, particularly for datarootdir + fixes that make docs visible with `luarocks doc luaposix`. + * bootstrap.conf (slingshot_files): Remove + m4/ax_compare_version.m4. + * .gitignore: Update. + + doc: show LDocs for lib/posix.lua and lib/posix/sys.lua. + * ext/posix/config.ld: Move from here... + * build-aux/config.ld.in: ...to here. + (title): Add Package name and version. + (file): Add lib/posix.lua and lib/posix/sys.lua. + (merge): Set to true to combine LDocs for lib/posix.lua and + ext/posix/posix.c into a single document module. + (format): Change from discount to markdown. + * ext/posix/posix.c (@module): Change to `posix` to merge with + lib/posix.lua. + * lib/posix.lua: Add `@module posix` declaration. + * lib/posix/sys.lua: Add `@module posix.sys` declaration. + (euidaccess, spawn, timeradd): Fix LDoc formatting errors. + * local.mk (examplesdir, modulesdir): New subdirectory locations + for generated documentation to install to. + (dist_examples_DATA): List generated examples files explicitly to + avoid GNU make dependency on $(wildcard) expansion. + (dist_modules_DATA): Add doc/modules/posix.html and + doc/modules/posix.sys.html. + (dist_data_DATA): Replace this... + (dist_lua_DATA): ...with this + (luaposixdir): Subdirectory for sys.lua to install to. + (dist_luaposix_DATA): Add lib/posix/sys.lua. + ($(dist_doc_DATA)): Fix LDoc invocation for new config.ld + location. + (doc): Add $(dist_examples_DATA) and $(dist_modules_DATA) + dependencies. + (EXTRA_DIST): Add missing examples files. + Change location of config.ld. + (MAINTAINERCLEANFILES): Add $(dist_examples_data) and + $(dist_modules_DATA). + * NEWS: Update. + + sys: new submodule for non-POSIX apis. + Close #73 + * lib/posix.lua (list, euidaccess, pipeline, pipeline_iterator) + (pipeline_slurp, spawn, timeradd, timersub): Move from here... + * lib/posix/sys.lua (list, euidaccess, pipeline) + (pipeline_iterator, pipeline_slurp, spawn, timeradd, timersub): + New file. ...to here. + * lib/posix.lua (__index): Attempt to load a suitably named + submodule to satisfy missing keys. + * NEWS: Update. + +2014-05-24 Gary V. Vaughan + + docs: add some formatting consistency. + * ext/posix/posix.c: Escape underscores for markdown processing + where necessary to avoid spurious italics, and try to be more + consistent with string examples in double quotes and constants + in fixed width font. + + posix: fix gettimeofday LDocs to match API. + Fix #133. + * ext/posix/posix.c (Pgettimeofday): Has returned a Lua table + with `sec` and `usec` fields for quite some time... make sure + the LDocs reflect that! + +2014-05-21 Gary V. Vaughan + + specs: check fork() child processes in parent process. + Close #110. + * specs/posix_spec.yaml (fork): Running expect in the forked + specl child process has no effect on the state and reporting in + the parent. Write the results from the child into a shared pipe + and check them in the parent instead. + + Merge pull request 122 from cathalgarvey/luaposix + Almost entirely rewritten to be lighter, correctly formatted, and + to work when the host has no posix_advise implementation. + + Merge pull request #122 from cathalgarvey/luaposix + Entirely rewritten. + + configury: add back net/if.h accidentally removed in merge conflict. + * configure.ac (AC_CHECK_HEADERS): Add back net/if.h. + + examples: predicate ping example on p.SO_BINDTODEVICE. + * examples/ping.lua: If either p.SOCK_RAW or p.SO_BINDTODEVICE + are not defined, then the underlying OS libraries didn't have + the necessary functionality for luaposix to bind to... so skip + the example in that case. + + Merge pull request #132 from zevv/ping. + posix: add support for netlink sockets with uevent netlink example. + +2014-05-21 Gary V. Vaughan + + Merge branch 'netlink' of github.com:zevv/luaposix into zevv-netlink + + Conflicts: + configure.ac + ext/posix/posix.c + +2014-05-21 Gary V. Vaughan + + Merge pull request #131 from zevv/ping + posix: add SOCK_RAW, IPPROTO_ICMP and SO_BINDTODEVICE support. + +2014-05-21 Ico Doornekamp + + Added support for netlink sockets with small uevent netlink example + + Added SOCK_RAW, IPPROTO_ICMP and SO_BINDTODEVICE; this allows sending and receiving of raw icmp (e.g. ping) packets from lua + +2014-05-21 Gary V. Vaughan + + posix: add Debug priority to syslog LDocs. + * ext/posix/posix.c (syslog): Add Debug priority to LDocs. + + posix: include strings.h for strcasecmp declaration. + * configure.ac (AC_CHECK_HEADERS): Add strings.h. + * ext/posix/posix.c (strings.h): If the host system is POSIX + compliant enough to ship this header, include it for a strcasecmp + declaration. + + posix: FreeBSD 10 doesn't define O_DSYNC. + * ext/posix/posix.c (O_DSYNC): Set a fallback definition of 0. + +2014-05-21 Gary V. Vaughan + + Merge pull request #128 from ittner/fix-getopt-ldoc-warning + doc: Remove ldoc warning for getopt @see + +2014-05-21 Gary V. Vaughan + + travis: update scripts from slingshot. + * .travis.yml: Regenerate with latest slingshot for a slew of + improvements. + + NEWS: Update. + * NEWS: Update. + + gnulib: sync with upstream. + * gnulib: Update to latest master. + + slingshot: sync with upstream. + * slingshot: Sync with upstream for grep GNUism fix. + * bootstrap: Sync with slingshot/bootstrap. + * .travis.yml: Regenerate. + +2014-05-11 Alexandre Erwin Ittner + + doc: Remove ldoc warning for getopt @see + +2014-03-14 Reuben Thomas + + openpty: add missing posix. prefix to call of close + +2014-01-05 Gary V. Vaughan + + slingshot: sync with upstream. + Fix the annoying contest.sed file dropping bug. + * slingshot: Sync with upstream. + * bootstrap: Sync with slingshot. + +2014-01-04 Gary V. Vaughan + + maint: update copyright notices to include 2014. + * .x-update-copyright: New file. Exclude files not owned by this + project from update-copyright rules. + * build-aux/.gitignore: Add update-copyright. + * bootstrap.conf, configure.ac, local.mk: Bump copyright year. + + slingshot: sync with upstream, and simplify accordingly. + * slingshot: Sync with upstream. + * bootstrap: Update from slingshot. + * bootstrap.slingshot: Remove, no longer required. + * bootstrap.conf: Remove bootstrap.slingshot source boilerplate. + (luaposix_force_readme): Remove. Automated by slingshot now. + * .gitignore: Update. + * .travis.yml: Until github.com/stevedonovan/LDoc catches up with + require fixes for luaposix, use gvvaughan/LDoc on Travis. + +2013-12-11 Gary V. Vaughan + + doc: add missing LDoc function tag. + * ext/posix/posix.c (strptime): Add missing @function tag. + + doc: fix LDoc manual page custom_see_handler pattern. + * ext/posix/config.ld (custom_see_handler): Add a missing closing + `%)`. + (upat): Pull the format string up per LDoc documentation. + + slingshot: sync with upstream. + * slingshot: Update from latest upstream, particularly for an + empty table access fix in mkrockspecs. + + doc: move DateTime functions back to their own LDoc section. (Fix #119) + * ext/posix/posix.c: Move Date and Time functions back to the + end of the implementation functions to avoid picking up non- + datetime related functions in the generated LDoc docs. + + slingshot: sync with upstream. + * slingshot: Update to latest upstream revision, particularly + to pick up fixes for changes in Travis wrt. libyaml.so location. + * .travis.yml: Regenerate. + +2013-12-11 Gary V. Vaughan + + Merge pull request #121 from zevv/socketpair + Added socketpair() and AF_UNIX domain + + Merge pull request #120 from craigbarnes/treefix + Avoid unnecessary table creation and unpacking in examples/tree.lua + + Merge pull request #118 from craigbarnes/linkfix + Fix typo in readme + + Merge pull request #117 from fperrad/master + fix without IPv6 + +2013-11-25 Cathal Garvey + + Added Pfadvise and constant advise values. Untested. + +2013-10-31 Ico Doornekamp + + Added socketpair() and AF_UNIX domain + +2013-09-21 Craig Barnes + + Avoid unnecessary table creation and unpacking in examples/tree.lua + + Fix typo in LuaRocks URL + +2013-09-20 Francois Perrad + + fix without IPv6 + +2013-09-13 Gary V. Vaughan + + slingshot: sync with upstream. + * slingshot: Update to latest revision, particularly to get the + fix for release announcement content. + +2013-09-09 Gary V. Vaughan + + maint: post-release administrivia. + * configure.ac (AC_INIT): Bump revision to 32. + * NEWS: Add header line for next release. + * .prev-version: Record previous version. + * ./local.mk (old_NEWS_hash): Auto-update. + + Release version 31 + * NEWS: Record release date. + + slingshot: sync with upstream. + * slingshot: Update to latest version for recent bootstrap fixes, + among others. + * bootstrap: Regenerate. + + maint: update NEWS. + * NEWS: Update with user visible changes since previous release. + + posix: fix a typo in tc[gs]etattr constant definitions. + * ext/posix/posix.c (VTOP): Changed spelling from this... + (VSTOP): ...to this. + + maint: bump revision to 31. + * configure.ac (AC_INIT): Bump release revision to 31. + + maint: remove trailing spaces added by previous merge. + * ext/posix/posix.c (Ptcsetattr, Ptcgetattr): Remove trailing + whitespace. + +2013-09-07 Gary V. Vaughan + + Merge pull request #116 from zevv/termios-cc-flags + Added missing termios cc flags + +2013-09-03 Ico Doornekamp + + all termios c_cc flags available are now used in tcgetattr() and tcsetattr(), even though no symbols may be available for each flag. this makes sure a tcsetattr() after a tcgetattr() preserves all flags, even the non POSIX cmplient ones + +2013-09-02 Ico Doornekamp + + Added missing termios cc flags + +2013-08-29 Gary V. Vaughan + + maint: post-release administrivia. + * NEWS: Add header line for next release. + * .prev-version: Record previous version. + * ./local.mk (old_NEWS_hash): Auto-update. + + Release version 30 + * NEWS: Record release date. + + maint: update NEWS. + * NEWS: Update with user visible changes since previous release. + + boostrap: sync with upstream. + This version fixes some cosmetic and CLI inconsistencies, as + well as improving portability to BSDs. + * bootstrap: sync with upstream. + + configury: don't nuke the lib subdirectory. + Now that we've made use of lib for Lua library files, make sure + not to let gnulib-tool scribble in it. + * bootstrap.conf (source_base): Tell gnulib-tool to put its empty + library directory somewhere harmless. + (luaposix_remove_empty_lib): And then remove that. + + maint: reorganise sources into subdirectories. + Rather than dump everything into the project root directory + indiscriminately, move extension modules into subdirectories + of a new 'ext/' subdirectory, Lua libraries into 'lib/'. And + adjust the build system to work with that layout. + * lua52compat.h: Move from here... + * ext/include/lua52compat.h: ...to here. + * local.mk (AM_CPPFLAGS): Add -I ext/include. + * lcurses.c, strlcpy.c, curses.lua: Move from here... + * ext/curses/curses.c, ext/curses/strlcpy.c, lib/curses.lua: + ...to here. + * lposix.c, posix.lua: Move from here... + * ext/posix/posix.c, lib/posix.lua: ...to here. + * configure.ac (AM_INIT_AUTOMAKE): Add subdir-objects for future + compatibility with Automake 2.0. + (WANTEDLIBS, WANTEDLUA): Adjust paths. + * local.mk (std_cpath, std_path, EXTRA_LTLIBRARIES, lib_LTLIBRARIES) + (dist_data_DATA, dist_doc_DATA, EXTRA_DIST): Likewise. + * tree.lua: Move from here... + * examples/tree.lua: ...to here. + * make_lcurses_doc.pl, config.ld: Move from here... + * build-aux/make_lcurses_doc.pl, ext/posix/config.ld: ...to here, + and adjust for relative path changes. + * dummy.c: No longer used. Remove. + * build-aux/sanity-cfg.mk: Remove references to dummy.c. + Adjust for relative path changes. + * .gitignore: Update. + + examples: error messages are not capitalized. + * examples/lock.lua: Don't capitalize error messages. + Discovered by 'make syntax-check' + +2013-08-27 Gary V. Vaughan + + posix: remember to register Pshutdown function. + * lposix.c (R): Add Pshutdown MENTRY. + + posix: remove unused variables. + * lposix.c (Precvfrom): Remove unused host and serv variables. + (Paccept): Likewise, and remove unused r as well. + + posix: mark unused parameters for gcc. + * lposix.c (UNUSED): New macro, expands to __unused__ with GNU C. + (FgetID, Fsysconf, Pcloselog, Psync): Use it to mark unused + function parameters. + + posix: report correct bad option number. + * lposix.c (badoption): Report the passed option number as being + the bad option. + +2013-08-27 Gary V. Vaughan + + Merge pull request #114 from GranPC/patch-1 + Fix repeated "Test ipv4" instead of "Test ipv6" + +2013-08-27 Gary V. Vaughan + + docs: fix typo in chdir ldoc comments. + * lposix.c (Pchdir): Supply a valid usage example. + Closes issue #113. + Reported by Craig Barnes. + +2013-08-26 Gary V. Vaughan + + Merge pull request #112 from craigbarnes/master + Fix and clean up Markdown formatting in README + +2013-08-26 Enrico Tassi + + posix: port getcwd to Hurd. + * lposix.c (Pgetcwd): Use get_current_dir_name function on Hurd. + +2013-08-26 Gary V. Vaughan + + maint: git ignore build-aux/compile. + * build-aux/.gitignore: Add compile. + + configury: don't use unicode characters in shell comments. + * configure.ac: Replace unicode apostrophes with ASCII equivalents. + + typo: set the configure package version correctly. + * configure.ac (AC_INIT): The correct release number is 30. + + posix: improve portability of constant definitions. + Rather than try to catalog what compiler/OS releases supply what + constant symbols in their headers with a rats nest of `#if __BSD` + etc, wrap all of the contentious preprocessor defines in matching + `#ifdefs` so that they are only provided by luaposix in the + environments that define them. This should provide much better + future portability to new compiler/OS combinations. + * lposix.c (lua_open_posix_c): Simplify the declarations by using + a consistent MENTRY definition. + Except for extremely well-known groups of symbols, and groups + that are already inside _POSIX_VERSION >= 200112L guards, wrap + each constant declaration in a matching `#ifdef`. + +2013-08-12 GranPC + + Fix repeated "Test ipv4" instead of "Test ipv6" + +2013-08-10 Alexander V. Nikolaev + + Merge pull request #111 from markgurevich/mg/2625/file-locks-v2 + Lock or unlock files with fcntl() + +2013-08-08 Craig Barnes + + Fix and clean up Markdown formatting in README.md + +2013-07-24 Mark Gurevich + + Lock or unlock files with fcntl() + +2013-06-27 Gary V. Vaughan + + typo: fix target URL of Travis badge link in README.md. + * README.md: Fix target URL of Travis badge link. + + maint: post-release administrivia. + * NEWS: Add header line for next release. + * .prev-version: Record previous version. + * ./local.mk (old_NEWS_hash): Auto-update. + * configure.ac (AC_INIT): Bump revision to 30. + + Release version 29 + * NEWS: Record release date. + + configury: distribute config.ld. + * local.mk (EXTRA_DIST): Add config.ld, and various example files. + + slingshot: update. + * slingshot: Update to version with spurious gitmodule output + from sanity checks fixed, and improved release branch cleanup. + + configury: run automake without --foreign flag. + * configure.ac (AM_INIT_AUTOMAKE): Remove foreign. + * bootstrap.conf (luaposix_force_changelog, luaposix_finish): + Remove. Bootstrap handles this automatically. + (luaposix_force_readme): Distribute README file. + * .gitignore: Add README. + + curses: remove trailing whitespace. + * lcurses.c (Wresize): Remove trailing whitespace. + + NEWS: update. + +2013-06-27 Gary V. Vaughan + + Merge pull request #105 from aeron005/master + Added wresize binding in curses library + +2013-06-27 Gary V. Vaughan + + slingshot: update. + * slingshot: Update to version with ax_lua.m4 cross compilation + fix. + Reported by Reuben Thomas. + + Closes #98. + +2013-06-27 Gary V. Vaughan + + sync, fsync, fdatasync, nice, lseek: a bunch of new calls. + * lposix.c (Psync, Pfsync, Pfdatasync): Wrap disk synchronisation + calls. + (Pnice): New call. Change process priority. + (Plseek): New call. Move current position of a file discriptor. + * specs/posix_spec.yaml (sync, fsync, fdatasync): New pending + expectations. + (nice, lseek): Specify basic behaviour of these new calls. + Submitted by zevv@github.com, from a patch by Ico Doornekamp. + + Closes #93. + +2013-06-27 Gary V. Vaughan + + specs: convert socket tests from issue #92 to specl. + * specs/posix_spec.yaml (socket handling): New spec, not working + on Mountain Lion, at least :( + Awaiting feedback, see issue #92. + Reported by zevv@github, from a patch by Ico Doornekamp. + + specs: replace racy posix.times specs with more robust implementation. + * specs/posix_spec.yaml (time accounting): Note the inconsistency + between posix.times() and posix.times (...all keys...) from + issue #107, and replace racy spec for posix.times(). + +2013-06-27 Gary V. Vaughan + + docs: fix typo in clock_gettime ldoc comments. + * lposix.c (Pclock_gettime): Fix a cut-n-paste duplication typo. + Reported by Steve Donovan. + + Closes #104. + +2013-06-27 Gary V. Vaughan + + slingshot: update. + * slingshot: Update. + * configure.ac (SS_CONFIG_TRAVIS): Remove luafilesystem now that + slingshot takes care of ldoc prerequisites. + * .travis.yml: Regenerate. + * .gitignore: Ignore doc directory rather than docs, as latest + ldoc seems to be putting files in the former now. + + travis: regenerate .travis.yml. + .travis.yml: Regenerate. + + configury: travis builds with 5.2 require luafilesystem rock. + * configure.ac (SS_CONFIG_TRAVIS): Add luafilesystem to extra + rocks list. + + configury: bump SPECL_MIN to 8. + * configure.ac (SPECL_MIN): Bump to 8, because we're using the + Specl 8 hell.spawn APIs now. + + typo: the documentation directory is called doc, not docs! + * local.mk (dist_doc_DATA, MAINTAINERCLEANFILES): Use correctly + spelled 'doc' instead of previous typo, 'docs'. + + specl: update to Specl 8 changes in hell.spawn. + * specs/posix_spec.yaml: Specl 8 no longer copies table entries + from require results into environments automatically, so make sure + we capture the table, and then use qualified access to spawn. + + slingshot: update. + * slingshot: Update. + * bootstrap.slingshot: Install latest revision. + +2013-05-23 aeron005 + + Added binding for wresize to curses library + +2013-05-09 Gary V. Vaughan + + Revert "Release version 29" + This reverts commit bfce2bc28a5a5f675e4b6f7ef790bcdbfba15aad. + + syntax-check: remove trailing whitespace. + * build-aux/sanity-cfg.mk (error-message-uppercase): Exclude + examples/socket.lua, which otherwise triggers false positives. + * NEWS, examples/socket.lua, examples/termios.lua, lposix.c: + Remove trailing whitespace. + + Release version 29 + * NEWS: Record release date. + + configury: distribute INSTALL for autotools instructions. + * bootstrap.conf (gnulib_non_module_files): Add doc/INSTALL. + + typo: use correct spelling of prefix in README.md. + * README.md: s/perfix/prefix/g + +2013-05-09 Gary V. Vaughan + + Merge pull request #99 from zevv/fix-dir-example + Fixed dir example for 5.2 + + Merge pull request #96 from zevv/fix-glob-example + Fixed glob example + + Merge pull request #100 from zevv/add-b57600 + Added missing 57k6 baudrate to termios table + + Merge pull request #95 from zevv/fix-poll + I broke poll with commit 8deb0ebd041ab6d4761f86a7a906dd850111bae7 + + Merge pull request #94 from zevv/fix-poll-example + Fix poll example, open failed due to wrong 2nd argument type + +2013-05-09 Gary V. Vaughan + + specs: add pending guards to weird Travis failures. + * specs/posix_spec.yaml: Mark pending those examples inexplicably + failing on Travis, per github issue #102. + + configury: bump release version to 29. + * configure.ac (AC_INIT): Bump release version to 29. + The '5.1.' prefix is a misnomer now tha we support Lua 5.2, and + bumping the prefix to '5.2.' would be no better, since we support + Lua 5.1 simultaneously, and 5.3 will be along one of these days. + + sanity: add configuration fragment with sanity exclusions. + * build-aux/sanity-config.mk (sc_require_config_h) + (sc_require_config_h_first): Exclude dummy.c and strlcpy.c, which + are both included directly into another source file before + compilation. + * .gitignore, build-aux/.gitignore: Adjust. + + syntax-check: fix many tiny errors raised by sanity.mk. + * config.ld: Remove trailing blank line. + * lcurses.c, strlcpy.c: Remove useless preprocessor parens. + * lcurses.c: Use the blessed `#include ` format. + * local.mk: Remove leading space from SPACE-TAB sequence. + * lposix.c (STREQ): Define to avoid using inverted strcmp logic. + Also remove useless preprocessor parens, and trailing whitespace. + * posix.lua, specs/posix_spec.yaml: Remove trailing whitespace. + * specs/posix_spec.yaml: Use 'file system' in preference to + .filesystem'. + + maint: collect previous release notes into NEWS. + * NEWS: New file, required for the Slingshot release process. + * local.mk (old_NEWS_hash): Update. + +2013-05-09 Reuben Thomas + + specs: ttyname can contain 'pts' rather than 'tty' + + specs: fix some spec failures on Linux. + * specs/posix_spec.yaml (uname): uname -a can display information + that uname(2) does not return, so change the command to say + explicitly what fields we want. + +2013-05-09 Gary V. Vaughan + + specs: convert adhoc tests to specl specs. + * tests-curses.lua: Remove. Move contents from here... + * specs/curses_spec.yaml: New file. ...to here, and reformat. + * tests-posix.lua: Remove. + * specs/posix_spec.yaml: New file. Implement equivalent (or + better!) specs here. + * specs/specs.mk (specl_SPECS): Add new specs. + + specs: convert lunit fcntl checks to specl specs. + * README: Remove reference to lunit. + * tests-fcntl.lua: Remove. + * specs/posix_lua_spec.yaml: New file with equivalent checks for + Specl. + * specs/specs.mk (specl_SPECS): Add specs/posix_lua_spec.yaml. + * local.mk: Include specs/specs.mk. + + slingshot: adopt slingshot release mechanism. + * README: Move from here... + * README.md: ...to here. Adjust for GH Markdown. + * GNUmakefile, Makefile.am, build-aux/mkrockspecs, + m4/ax_compare_version.m4, m4/ax_lua.m4: + Remove. These files are handled by slingshot now. + * rockspecs.lua, m4/ax_with_prog.m4: Remove. No longer used. + * bootstrap.slingshot: New file. Slingshot bootstrap plugin. + * bootstrap.conf: Source it. + * configure.ac: Adjust to drive slingshot processes. + * local.mk: New file. Project local make rules. + * rockspec.conf: New file. Slingshat rockspec template. + * specs/specs.mk: Simplified. + * .prev-version: Record previous version number. + * .gitignore: Update. + * .travis.yml: Regenerate. + + termios: remove deprecated legacy symbols. + Don't write new code with these, they are not definied by stricly + POSIX conformant hosts. See: + http://pubs.opengroup.org/onlinepubs/009695399/basedefs/termios.h.html + * lposix.c (XCASE, IUCLC, OUCLC): Remove. + + termios: make XSI extensions optional. + Mac OS X is a POSIX conformant system, but does not implement + all XSI extensions. Only create constant for XSI extensions if + they are defined by the host system. See: + http://pubs.opengroup.org/onlinepubs/009695399/basedefs/termios.h.html + * lposix.c (CBAUD, EXTA, EXTB, ECHOCTL, ECHOPRT, ECHOKE, FLUSHO) + (PENDIN): Wrap with preprocessor guards. + (DEFECHO, LOBLK, SWTCH, VDISCARD, VDSUSP, VLNEXT, VREPRINT) + (VSTATUS, VWERASE): Additional conditional XSI extensions. + +2013-04-23 Ico Doornekamp + + Fixed dir example for 5.2 + + Added missing 57k6 baudrate to termios table + +2013-04-17 Ico Doornekamp + + Fixed glob example, added missing 'posix ='. Also removed the readlink() part because /proc on linux violates posix and does not properly fill in st_size on lstat(), causing readlink() to fail with EINVAL. + + Fix poll example, open failed due to wrong 2nd argument type, probably from old lposix API? + + I broke poll with commit 8deb0ebd041ab6d4761f86a7a906dd850111bae7 + The result is just fine for calling poll() only once, but breaks for + subsequent calls to poll() when passing the same table. In this case, + the events are not cleared from the revents table, causing false + positives. + +2013-04-16 Reuben Thomas + + Merge pull request #90 from zevv/getopt + Rename getopt_long() to getopt(), long options are now optional. + + Merge pull request #91 from zevv/termios + Moved tests-termios.lua to examples/termios.lua + +2013-04-16 Ico Doornekamp + + Added minimal termios test. + +2013-04-16 Reuben Thomas + + Mention where to look for other contributors. + + Merge pull request #82 from zevv/socket + Added socket functions and test script + +2013-04-16 Ico Doornekamp + + Changed getopt_long semantics, reorderd iterator return values, optarg is now string instead of number. This allows getopt_long to closely mimic getopt + Renamed getopt_long to getopt, changed short options type from number to + string, updated example + + Added POSIX socket functions and constants + +2013-04-16 Reuben Thomas + + Merge pull request #83 from zevv/termios + Added termios and test script + +2013-04-16 Ico Doornekamp + + Added termios and test script + +2013-04-14 Reuben Thomas + + Copy stdlib code into posix.lua, minimally modified + Solves the discussion in already-closed issue #80, and closes pull + request #88 and closes pull request #89. + +2013-04-13 Reuben Thomas + + Merge pull request #85 from zevv/poll-only-triggered-revents + poll only returns active events in revents table, increases performance + + Move require of std.list to correct place + +2013-04-13 Ico Doornekamp + + Simplified lua_pushboolean() expression + + poll only returns active events in revents table, increases performance + +2013-04-12 Reuben Thomas + + Require stdlib; fixes #80 + +2013-04-11 Reuben Thomas + + .gitignore: add TAGS + + lposix.c: fix lua_Alloc calls that free (they should pass the current size); fix a memory leak in msgrcv + + lposix.c: fix error-case space leak in Pread; fixes issue #78 + +2013-04-11 Gary V. Vaughan + + posix.lua: fix a typo in assert. + * posix.lua (pipeline): t1 is not declared, use type of t in the + assert error. + +2013-03-28 Reuben Thomas + + lposix.c: change bogus @long tags to @int tags. + + lposix.c: add function line for pipe (was missing) + Thanks to behoffski for the report. + +2013-03-24 Reuben Thomas + + lposix.c: fix @function line of isprint (was wrongly "isgraph") + Thanks to behoffski for the report. + +2013-03-23 Reuben Thomas + + tests-posix.lua: fix pipeline test for VPATH build + + tests-posix.lua: fix pipeline test + Should call pipeline_slurp, not pipeline_iterator to get whole output + in one go. This has the nice side-effect of testing both + pipeline_iterator and pipeline as well, as pipeline_slurp calls + pipeline_iterator, which calls pipeline. + +2013-03-20 Reuben Thomas + + Makefile.am: unset LUA_INIT_5_2 in calls to get information from woger. + This is an ugly hack, but since it will work at least until the + release of Lua 5.3, it's better than nothing. + + configure.ac: bump version to 5.1.28 + + Simplify and fix pipeline_iterator, and add a test. + +2013-03-18 Reuben Thomas + + posix.lua: fix bug in posix.pipeline_iterator, where it always closed the pipe on first iteration + +2013-03-17 Reuben Thomas + + configure.ac: bump version to 5.1.27 + + posix.lua: rename posix.system to posix.spawn, keeping old name as alias for now. + +2013-03-16 Reuben Thomas + + Allow posix.system to take a function, a shell command, or a file and list of arguments. Use it in pipeline. + Allow pipeline functions to take an extra parameter giving the + function to use to make a pipe (e.g. so posix.openpty can be used + instead). Change argument to a table rather than a list of tasks. + +2013-03-14 Reuben Thomas + + posix.lua: tidy up pipeline and add pipeline_iterator and pipeline_slurp + +2013-03-13 Reuben Thomas + + Merge pull request #72 from nmcveity/fix-5.1-compat + Removed Lua 5.2 functions lua_len and lua_tointegerx + + COPYING: bump copyright year + + Add pipeline function to execute a pipeline of shell commands & Lua functions + +2013-03-05 nmcveity + + Removed Lua 5.2 functions lua_len and lua_tointegerx + This fixes issue #71. + +2013-03-04 Reuben Thomas + + Makefile.am: stop making unnecessary ChangeLog. + +2013-03-03 Reuben Thomas + + lposix.c: fix a space leak in realpath + + configure.ac: bump version to 5.1.26. + + lposix.c: change some @param's to @string where possible + + Add posix.realpath. + + lposix.c: add support for SA_* flags when establishing a signal handler + +2013-03-02 Reuben Thomas + + posix.lua: add posix.openpty + +2013-02-28 Reuben Thomas + + lposix.c: improve documentation of posix.read + + lposix.c: document posix.wait's return values properly + + lposix.c: add killpg + +2013-02-20 Reuben Thomas + + Makefile.am: release directory should already be on release branch; remove checkout command + + Makefile.am: use simpler and more robust scheme of parallel checkout for checking in release code. + + Allow exec/execp arguments to be supplied as a table, including argv[0]. Closes #65. + + configure.ac: bump version to 5.1.25 + + Merge pull request #67 from zserge/master + Support for message queues + +2013-02-19 Reuben Thomas + + Merge pull request #68 from sam-github/pts-support + Fix posix.openpt() requireing and ignoring a path. + + When no LDoc installed, create docs directory before touching files in it; fixes issue #66 + +2013-02-18 Sam Roberts + + Fix posix.openpt() requireing and ignoring a path. + +2013-02-18 Serge Zaitsev + + added basic message queues support + +2013-02-18 Reuben Thomas + + Merge pull request #58 from sam-github/pts-support + Support Unix 98 style pseudoterminals, as specified in POSIX.1-2001 + +2013-02-18 Sam Roberts + + Tests for pseudoterminal support. + +2013-02-17 Sam Roberts + + Support Unix 98 style pseudoterminals, as specified in POSIX.1-2001 + Support consists of openpt(), ptsname(), grantpt(), and unlockpt(). The master + fd can be created by calling openpt(), or by opening "/dev/ptmx" (as + specified by POSIX). + +2013-02-15 Reuben Thomas + + Makefile.am: fix woger command for new rockspec arrangement. + + Makefile.am: prevent unpacked sources being recursively checked in to release branch. + + Makefile.am: remove references to defunct files. + + rockspecs.lua: don't need to turn dots in version into dashes to get release tag. + + .gitignore: remove tarball pattern, as we no longer have tarballs. + + Revert 31671409e62e: bit32 doesn't build with Lua 5.2, so require luabitop instead. + + rockspecs.lua: fix a misnamed variable + + configury: add rockspec-generating files for git/release rockspecs. + + Makefile.am: remove obsolete definition of ROCKSPEC + + configure.ac: remove useless AC_SUBST calls for precious variables. + + tests-posix.lua: remove a debugging line. + + lposix.c: correct cross-reference to getopt.lua + + Bump version down to 5.1.24: we haven't made such a release yet + + configury: update for releasing on 'release' branch of github rather than via tarballs. + + Update ax_lua.m4 to latest: no code changes, formatting only. + + tests-posix.lua: remove commented-out test for non-POSIX putenv function + + Add STD{IN,OUT,ERR}_FILENO constants. + + Add isatty. + +2013-02-12 Reuben Thomas + + Use bit32 (now available for 5.1) rather than luabitop: slightly simplifies things. + +2013-02-11 Reuben Thomas + + lposix.c: Reuben Thomas is no longer the maintainer. + + m4/ax_compare_version.m4: add support file for ax_lua.m4 + +2013-02-07 Alexander V. Nikolaev + + Merge pull request #61 from gvvaughan/pull-request/maint-clean-ldocs-output + configury: clean up ldoc droppings with make maintainer-clean + + Merge pull request #62 from gvvaughan/pull-request/remove-empty-lib-subdir + gnulib: no need to link always empty libgnu. + +2013-02-06 Reuben Thomas + + configury: update ax_lua.m4 to latest version, which simplifies configure.ac slightly. + +2013-01-29 Gary V. Vaughan + + gnulib: no need to link always empty libgnu. + Now that we have no C modules from gnulib, there's no need to + build and link the always empty library any more. + * Makefile.am (SUBDIRS): Remove. + * configure.ac (AC_CONFIG_FILES): Remove lib/Makefile. + * bootstrap.conf (gnulib_tool_options): Add --avoid=dummy to skip + the one remaining empty gnulib C source file. + (luaposix_remove_empty_lib): gnulib-tool now generates a useless + lib subdirectory containing just a Makefile.am and .gitignore. We + don't use or need it any more, so delete it. + (luaposix_finish): Don't copy dummy.c out of gnulib. + + configury: clean up ldoc droppings with make maintainer-clean + * Makefile.am (MAINTAINERCLEANFILES): Add docs/index.html and + docs/ldoc.css. + +2013-01-27 Alexander V. Nikolaev + + Merge pull request #59 from gvvaughan/pull-request/handle-missing-ldoc + configury: handle missing ldoc binary. + +2013-01-26 Gary V. Vaughan + + configury: handle missing ldoc binary. + * configure.ac (LDOC): Set with AX_WITH_PROG. + (HAVE_LDOC): New conditional. + * Makefile.am (HTML): Fold into... + (dist_doc_DATA): ...here. + Run ldoc when available, otherwise touch the requried files to + prevent build failure. + +2013-01-10 Reuben Thomas + + Merge pull request #56 from gvvaughan/pull-request/curses-resizeterm-support + curses: conditional resizeterm support. + + Merge pull request #55 from gvvaughan/pull-request/fix-waddstr-double-append-bug + curses: don't waddstr() each string twice. + + Merge pull request #53 from gvvaughan/pull-request/remove-automake-werror + configury: remove automake -Werror option. + + Merge pull request #52 from gvvaughan/pull-request/add-am-prog-ar + configury: use AM_PROG_AR for automake 1.13. + + Merge pull request #50 from gvvaughan/pull-request/keep-gnulib-revision-under-version-control + configury: keep gnulib revision under version control. + + Merge pull request #51 from gvvaughan/pull-request/sync-upstream-bootstrap + bootstrap: sync with upstream. + + Merge pull request #54 from gvvaughan/pull-request/no-need-for-lt-output + configury: no need to fork for libtool.m4 variables. + +2013-01-10 Gary V. Vaughan + + curses: conditional resizeterm support. + * configure.ac (AC_CHECK_FUNCS): Check whether resizeterm is + implemented by the selected curses library. + * lcurses.c (Cresizeterm): If it is, use it, otherwis throw an + error to explain why not. + (curseslib): Add it to the toplevel curses functions. + + curses: don't waddstr() each string twice. + Fix a bug introduced by commit 5aa297512. + * lcurses.c (Waddstr): Only add the string one time! + + configury: no need to fork for libtool.m4 variables. + libtool.m4 is expanded into configure already, so the values are + available after LT_INIT in configure.in without creating config.lt + to copy the values we already have into an early libtool script, + and then fork again to grep the content of those copies back into + configure!! (LT_OUTPUT is only necessary if you need to run + configure time compilation tests using the libtool script to + wrap the actual compiler). + * configure.ac (LT_OUTPUT): Remove. + (shrext): shrext_cmds is already set by LT_INIT, so just use it + without calling the early libtool script. + + configury: remove automake -Werror option. + This option causes automake to bail out after warning about the + use of gmake extensions. + * configure.ac (AM_INIT_AUTOMAKE): Remove -Werror. + + bootstrap: sync with upstream. + This revision fixes some small bugs, and is compatible with + non-gnu awk and non-gnu sed again. + * bootstrap: sync with upstream. + + configury: keep gnulib revision under version control. + It's important to keep the gnulib revision number used by any + particular checkout of luaposix under version control rather than + hoping that whatever the current HEAD is will work. + * .gitignore: Remove gnulib. + * gnulib: Add current master revision. + + configury: use AM_PROG_AR for automake 1.13. + * configure.ac (AM_PROG_AR): Required by recent automake releases, + but not available in very old releases. + +2012-12-24 Reuben Thomas + + configure.ac: fix regeneration of luaposix.rockspec + +2012-12-23 Reuben Thomas + + configure.ac: fix a comment + + luaposix.rockspec.in: remove redundant dir setting + +2012-12-15 Alexander V. Nikolaev + + configure.ac: bump version to 5.1.25 + + rockspec: Add missing dependency for luabitop + luaposix depends on bitop library on lua 5.1 since luaposix 5.1.16 + +2012-12-05 Alexander V. Nikolaev + + Merge pull request #48 from Keen-github/vs/2230/fix_hack_for_luaposix_compatibility + Added 'day' field for compatibility to Lua os.date(); fixed issue #32. + +2012-11-14 Valeriy Skurikhin + + Added 'day' field for compatibility to Lua os.date(); fixed issue #32. + +2012-10-25 Reuben Thomas + + Use lstat to read size of a link (for Preadlink); fixes issue #47. + +2012-10-17 Reuben Thomas + + configure.ac: bump version to 5.1.24 + + lcurses.c: don't run strlen unnecessarily; w[mv]addstr does that anyway + +2012-10-04 Reuben Thomas + + Makefile.am: now that github-upload is fixed, consolidate release into a single target + + Makefile.am: correct github_user parameter to woger (thanks, Liam) + + release: luarocks-related tweaks + + Makefile.am: make check-luarock depend on the rockspec, as github seems to work after all + + release: automatically check the rockspec before making a release + +2012-10-03 Reuben Thomas + + Make Lua 5.2-compatibility more Lua 5.2-ish. + + tree.lua: make Lua 5.2-compatible + +2012-09-26 Reuben Thomas + + rockspec: make build_command more robust + + build: install documentation with 'make install' and from luarocks + +2012-09-23 Reuben Thomas + + lposix.c: improve comment of mkstemp + +2012-09-21 Reuben Thomas + + configure.ac: bump version to 5.1.23 + +2012-09-20 Reuben Thomas + + lcurses.c: define LUA_COMPAT_ALL to get luaL_register. + +2012-09-13 Reuben Thomas + + dummy.c: fix copyright notice to be public domain + + version: bump to 5.1.22. + + gnulib: re-add dummy.c with correct license to fix Mac OS X build (issue #46) + +2012-09-11 Reuben Thomas + + configure.ac: enable automake to generate dependencies for rockspec (thanks, Hisham Muhammad). + +2012-09-07 Reuben Thomas + + Merge pull request #45 from wcmaier/fix/github-url + Update Github URL. + +2012-09-07 Will Maier + + Update Github URL. + +2012-09-03 Reuben Thomas + + Bump version to 5.1.21. + +2012-09-01 Reuben Thomas + + README: Add link to online HTML docs. + + README: Update location of repo and contact details. + +2012-08-31 Reuben Thomas + + bootstrap.conf: no longer require now-defunct `missing' script. + +2012-08-30 Reuben Thomas + + Add docstrings (using Steve Donovan's ldoc) to lposix.c + The documentation comes from from Steve Donovan and the Alpine Linux + wiki (Natanael Copa). + + Reindent Psignal, which was a bit out of order. + + Make rpoll use file descriptors, not Lua file objects, so it can be + used with both (via fileno). + +2012-06-28 Reuben Thomas + + Document dependency on bitop library with Lua 5.1 (thanks to Bernd Eggink). + + Remove documentation of configure options, one of which was obsolete. + +2012-06-22 Reuben Thomas + + Simplify Lua 5.2 compatibility + + lposix.c: revert to using MYNAME, as it is different from PACKAGE. + + build: don't unset LUA_INIT, as it may be needed to set Lua paths. + + Update bug reporting advice (thanks, Yuri Takhteyev). + +2012-06-21 Reuben Thomas + + Fix some incorrectly-named references to posix module. + + Simplify construction of messages with autoconf variables. + +2012-06-05 Reuben Thomas + + build: don't include non-MIT-licensed dummy.c from gnulib (fixes issue #42). + +2012-06-04 Reuben Thomas + + Merge pull request #41 from gvvaughan/pull-request/timer-macros + gettimeofday: change format to a table with sec and usec fields. + +2012-06-01 Gary V. Vaughan + + gettimeofday: replace C timer macros with lua equivalents. + * lposix.c (Ptimeradd, Ptimercmp, Ptimersub): Remove. + * posix.lua (timeradd, timercmp, timersub): New Lua equivalents + to removed C implementations. + +2012-05-29 Gary V. Vaughan + + gettimeofday: change format to a table with sec and usec fields. + * lposix.c (Pgettimeofday): Return a single table with sec and usec + fields, rather than a pair of numbers. + (Ptimeradd, Ptimercmp, Ptimersub): New functions to emulate the + macros timeradd, timercmp and timersub respectively. + +2012-05-29 Reuben Thomas + + Merge pull request #40 from gvvaughan/pull-request/feature-tests-not-version-checks + crypt: this function is available on darwin, but no crypt.h header is + +2012-05-29 Gary V. Vaughan + + statvfs: check for actual presence of function and header. + * configure.ac (sys/statvfs.h): Test for presence of this header. + (statvfs): Test for availability of this API. + * lposix.c (sys/statvfs.h): Include it, if configure found it. + (Pstatvfs): Wrap statvfs if configure found the API. + (R): List Pstatvfs if we wrapped it earlier. + + crypt: this function is available on darwin, but no crypt.h header is + One of the main principles of Autoconf is that you should test for + features, not for versions - exactly because of compilation problems + like this, where Apple sets _POSIX_VERSION to make us think that + crypt.h is available, but there is no crypt.h header. + * configure.ac (crypt.h): Test for presence of this header. + (crypt): If the crypt function is available, whether or not the + additional -lcrypt library is required, define HAVE_CRYPT. + * lposix.c (crypt.h): Include it if configure found it. + (Pcrypt): Define it if configure detected a system crypt API. + (R): List Pcrypt, if we defined it earlier. + +2012-05-28 Reuben Thomas + + posix.lua: update call of posix.open to match new API. + + Add missing posix suffix to a call of access. + + Merge pull request #39 from stevedonovan/master + Implement signal queue so signals arriving while in a Lua signal handler are not lost. + +2012-05-28 Steve Donovan + + signal handling queue implemented + +2012-05-23 Reuben Thomas + + Bump version to 5.1.20. + + getgroup: fix an off-by-one error (thanks, Steve Donovan) + + lposix.c: more minor whitespace fixes + + posix.lua: add a missing space (whitespace fix). + + system: Kill the fork if execp fails (thanks, Steve Donovan) + + lposix.c: require a mode for open with O_CREAT, and only then. + + tests: update for revised open API. + + lposix.c: minor whitespace fixes. + + lposix.c: make file & creation flags public; pass flags to open as an integer mask, not a table. + +2012-05-22 Reuben Thomas + + Fix some comments. + +2012-05-21 Reuben Thomas + + Remove non-POSIX crypt_r and replace function checks with POSIX version checks. + + Add a pointer to documentation and some basic coding principles. + +2012-05-13 Reuben Thomas + + Update web site URL and be more explicit about system requirements. + +2012-05-12 Alexander V. Nikolaev + + Rework test for glob() -- use temporary directory + This allow us to not depend from *.la files from build. + + Simple tests for mkdtemp and mkstemp + +2012-05-12 Your Name <7hemroc@gmail.com> + + Add mkdtemp() + +2012-05-12 Alexander V. Nikolaev + + Memory leak in mkstemp + Pmkstemp not release temporary string buffer, if mkstemp() raise an error + +2012-05-12 Reuben Thomas + + Merge pull request #35 from likema/master + Add statvfs and crypt_r. + +2012-05-02 Reuben Thomas + + lcurses.c: Remove some casts to chtype that only cause trouble. + + strlcpy.c: add prototype to squash compiler warning. + + strlcpy.c: Make function declaration ANSI. + +2012-04-30 Like Ma + + Add AC_USE_SYSTEM_EXTENSIONS to configure.ac for define _GNU_SOURCE in config.h.in + +2012-04-23 Like Ma + + Merge remote-tracking branch 'upstream/master' + +2012-04-11 Reuben Thomas + + Copy with -1 return for _PC_PATH_MAX. + +2012-04-10 Reuben Thomas + + Bump version to 5.1.19. + + Replace LGPLed strlcpy with BSD licensed strlcpy, from http://opensource.apple.com/source/OpenSSH/OpenSSH-7.1/openssh/bsd-strlcpy.c + +2012-04-08 Reuben Thomas + + Fix memory leaks introduced by fix to cope with arbitrary-length paths. + +2012-04-05 Reuben Thomas + + Add tests for dirname and basename. + + Work with arbitrary-length paths. + +2012-04-03 Reuben Thomas + + Remove XSR errno.h codes (thanks Enrico Tassi). + +2012-03-26 Reuben Thomas + + Don't use gnulib sigaction module, as its license is incompatible; don't want COPYINGv3. + + Back to using only a double fork of lunit. + +2012-03-25 Reuben Thomas + + README: Update URL to lunit: for now need my version. + + Makefile.am: tell lunit which Lua interpreter to use. + + tests-fcntl.lua: make them work with Lua 5.2. + + Improve documentation for use with Lua 5.2. + + Bump version to 5.1.18. + + posix.lua: make Lua 5.2-compatible. + + Make configure accept Lua 5.2. + + Add correct license, and refer to it in README. + +2012-02-29 Reuben Thomas + + Bump version to 5.1.17. + + Return old C handler from signal, so it can be chained; fix masking of signals during Lua handler. + +2012-02-21 Reuben Thomas + + Make curses module work with Lua 5.2 module system (patch by StarWing). + +2012-02-18 Reuben Thomas + + Makefile.am: update woger call. + + Makefile.am: Update woger call. + + Makefile.am: add lua52compat.h to EXTRA_DIST. + +2012-02-12 Reuben Thomas + + Merge pull request #28 from likema/HEAD~~ + Use AC_SEARCH_LIBS instead of AC_CHECK_LIBS in configure.ac. + +2012-02-11 Like Ma + + Use crypt_r instead of crypt if it exists for thread-safe. + + Add statvfs + + Use AC_SEARCH_LIBS instead of AC_CHECK_LIBS to fix function crypt not found when configuring. + +2012-02-11 Reuben Thomas + + Fix bug in chmod (closes issue #55). + + Update ax_with_curses.m4. + +2012-02-03 Reuben Thomas + + Remove some non-POSIX features. + + Remove non-standard memrchr. + +2012-02-02 Reuben Thomas + + Fix signal handling so all signals are handled, one at a time. + +2012-02-01 Reuben Thomas + + lposix.c: overhaul time struct functions; add mktime. + + lposix.c: fix whitespace typo. + +2012-02-01 Reuben Thomas + + Overhaul use of numeric types going to Lua. + Use lua_pushinteger rather than lua_pushnumber where it makes sense. + + In lcurses, use lua_pushboolean for all boolean quantities, and always + return Lua booleans, not C booleans. Remove some unused function + macros. + +2012-02-01 Reuben Thomas + + Fix a docstring mistake: refer to os.execute, not os.system. + +2012-01-31 Reuben Thomas + + Remove setting _POSIX_C_SOURCE on Darwin, as apparently this only restricts APIs, or instates obsolescent APIs. + Remove some pointless quotes. + + Remove SIGPROF and SIGPOLL, which are marked obsolescent. + +2012-01-27 Reuben Thomas + + curses: update ax_with_curses.m4 to latest version. + +2012-01-17 Reuben Thomas + + In strftime, make isdst optional like all other fields. + + Add strptime. + + Simplify a lua_pushlstring call to a lua_pushstring call. + + Simplify hostid, making it return a number, not a string. + + Merge pull request #23 from hishamhm/master + Add support of octal stat modes in mode_munch + +2012-01-16 Hisham Muhammad + + Make octal_mode use strtol, as requested by rrthomas. + +2011-12-29 Hisham Muhammad + + Add support of octal stat modes in mode_munch + +2011-12-28 Reuben Thomas + + Update and make precise the versions of Lua catered to. + + Move Lua 5.2 compatibility into a separate file; use it in lcurses.c. + Change version check to be “== 502” rather than “> 501” now that 5.2 + is released and we have no idea what 5.3 or later will bring. + + Remove unused lua_setenv macro. + + Add memrchr. + + Add a comment explaining that posix.signal has sensible semantics. + +2011-12-26 Reuben Thomas + + Fix an egregious bug in the previous commit which only updated a Lua handler when the previous handler was also a Lua function. + + Merge pull request #22 from gvvaughan/pull-request/expose-use_default_colors + Pull request/expose use default colors + + Merge pull request #21 from gvvaughan/pull-request/refactor-lcurses-with-cpp + refactor: use lposix-style macro splicing in lcurses. + +2011-12-26 Gary V. Vaughan + + curses: expose use_default_colors to lua. + * lcurses.c (Cuse_default_colors): Marshalling for + use_default_colors. + (curseslib): Add it. + + refactor: use lposix-style macro splicing in lcurses. + Make the style of lcurses.c more like lposix.c, with the aid of + splice and stringify macros, and judicious renaming to make + their usage pattern the same too. + * lcurses.c (LCURSES_SPLICE, LCURSES_STR, LCURSES_STR_1): + Analagous to LPOSIX_SPLICE, LPOSIX_STR and LPOSIX_STR_1 + respectively. + (LC_NUMBER, LC_NUMBER2, LC_STRING, LC_STRING2, LC_BOOL) + (LC_BOOL2, LC_BOOLOK, LC_BOOLOK2): Change prefix of generated + functions from `lc_' to `C' so that LCURSES_STR_1 can be used + idiomatically. + (LCW_BOOLOK): Likewise, only changing from `lcw_' to `W' prefix. + (LCW_BOOLOK2): New macre used when the curses symbol and the lua + api have different names. + (lcw_new, lcw_get, lcw_check, lc_checkch, lc_optch): Rename from + these... + (lc_newwin, lc_getwin, lc_checkwin, checkch, optch): ...to + these, respectively, no need to namespace static symbols so + carefully. Adjust all callers. + (CC2): Remove. + (CF): New macro for generating FN key exports into lua. Use it + to export all 64 valid FN keys. + (LCW_WIN2): New macro. + (Wsyncup, Wcursyncup, Wsyncdown): Use it to define these + functions. + (LCW_WIN2YX): New macro. + (Wgetyx, Wgetparyx, Wgetbegyx, getmaxyx): Use it to define these + functions. + (LC_ATTROK): New macro. + (Cslk_attron, Cslk_attroff, Cslk_attrset): Use it to define + these functions. + (LC_TOGGLEOK): New macro. + (Ccbreak, Cecho, Craw, Cnl): Use it to define these functions. + (LCW_WINBOOLOK): New macro. + (Wintrflush, Wmeta, Wnodelay, Widlok, Wleaveok, Wscrollok): Use + it to define these functions. + (LCW_WININTOK): New macro. + (Wattroff, Wattron, Wattrset): Use it to define these functions. + (chstrlib, windowlib, curseslib): Much simplified by naming + implementation functions more carefully, and defining temporary + MENTRY macro to expand and splice arguments that populate the + tables. + +2011-12-26 Reuben Thomas + + signal: Cope with C handler functions. + Fix a bug in setting symbolic (SIG_IGN/DFL) handlers. + + Make setting handler to nil indistinguishable from setting to SIG_DFL. + +2011-12-24 Reuben Thomas + + Explain why we don’t use an upvalue in an obvious situation. + + Redo signal API to be more conventional, allowing signal handlers to be reset (no __newindex nonsense). + + Use LPOSIX_STR_1 to prevent premature expansion of signal handler macro names. + + Merge pull request #20 from gvvaughan/pull-request/use-cpp-to-keep-symbols-in-sync + refactor: use macro splicing for more tabulation. + +2011-12-24 Gary V. Vaughan + + refactor: use macro splicing for more tabulation. + This would have prevented the recent unsynced signal tables bug, + but also use cpp metaprogramming to write more repetitive code + that needs to stay in sync between various strings and symbols. + * lposix.c (LPOSIX__STR): Remove +1 offset. + (LPOSIX__STR_1, LPOSIX_STR_1): Better name for +1 offset + stringification macros. Adjust all callers. + (sigmacros_map): New cpp table of signal symbol basenames. + (Ssigmacros, Fsigmacros): Generate from sigmacros_map. + (R): Use cpp to keep lua symbols and C implementations in sync. + (luaopen_posix_c): Replace each group of preprocessor exports with + a cpp macro call to keep C API macro values and their lua symbol + names in sync. + +2011-12-23 Reuben Thomas + + Allow signal handlers to be set to nil (unset), as well as a function or macro. + + Bump version to 5.1.16. + + Clarify a NULL pointer. + + Remove non-POSIX SIG_IGN and SIG_HOLD. + + Fix some deviant indentation. + +2011-11-18 Reuben Thomas + + Merge pull request #19 from spbnick/master + Fix corner cases in Pread and Pgetgroups. Thanks to Nikolai Kondrashov. + +2011-11-18 Nikolai Kondrashov + + Fix getgroups corner cases + Fix getgroups memory deallocation by simply using lua_newuserdata instead of + potentially mismatching lalloc/free pair. + Handle getgroups(0, NULL) returning 0 - although practically impossible, + documentation doesn't say it can't happen. + Handle getgroups returning negative values (reporting errors). + +2011-11-17 Nikolai Kondrashov + + Handle and report Pread allocation errors properly + Report Pread buffer allocation errors with pusherror, account for allocation + functions which don't modify errno. + Handle allocation of zero bytes in Pread properly: don't consider returned + NULL an error. + Add some "air" into Pread formatting. + +2011-10-28 Reuben Thomas + + Merge pull request #18 from ittner/fix-unused-var + Remove unused variable (thanks, Alexandre Ittner). + + Merge pull request #17 from ittner/add-fnmatch + Add function fnmatch() (thanks, Alexandre Ittner). + +2011-10-27 Alexandre Erwin Ittner + + Remove unused variable in the poll interface + + Add function fnmatch() + According to + http://pubs.opengroup.org/onlinepubs/9699919799/functions/fnmatch.html + plus GNU extensions (if available) + +2011-10-25 Reuben Thomas + + Merge pull request #16 from spbnick/master + Add full poll(2) interface + +2011-10-22 Nikolai Kondrashov + + Add full poll(2) interface + Rename Ppoll to Prpoll to match external name of "rpoll". + Add full poll(2) interface under name "poll". + + The arguments to the "poll" function are fd->pollfd map and an optional + timeout in milliseconds (default being -1, i.e. infinity). + + "Pollfd" is a table analogue of struct pollfd, with "event" and "revent" + fields being tables with boolean fields corresponding to bits, named without + "POLL" suffix. + + Example usage: + + local pollfd_map = { + [fd1] = {events = {IN = true}}, + [fd2] = {events = {IN = true}}, + [fd3] = {events = {IN = true}} + } + + while next(pollfd_map) ~= nil do + local ready, errmsg = posix.poll(pollfd_map) + + if ready == nil then + error(errmsg) + end + + for fd, pollfd in pairs(polfd_map) do + if pollfd.revents.IN or pollfd.revents.HUP then + local input, errmsg, errno = posix.read(fd, 8) + + if input == nil then + error(errmsg) + elseif #input == 0 then + pollfd_map[fd] = nil + else + print(tostring(fd) .. ":", input:byte(1, -1)) + end + end + end + end + +2011-10-10 Alexander V. Nikolaev + + Don't leave status uninitialized + SUSv4 states that &status is undefined if WNOHANG option is passed to + waitpid and no processes are ready to be collected at the time of call. + +2011-10-10 Alexander V. Nikolaev + + Fix bug -- posix.read returns wrong value + Pread() is documented to return a single value, and pushed only one + return value to stack, but it told Lua that it returns two values. + + Note that this change may existing workarounds and should be + explicitly mentioned in release notes. + +2011-10-10 Reuben Thomas + + Expose new fcntl function (oops!) and rewrite tests to use it. + + tests: Call fcntl tests with lunit (fixes issue #13); thanks Mikhail Gusarov. + +2011-10-09 Reuben Thomas + + Rewrite fcntl support. + * Remove fcntl table and special handlers for F_GET/SETFL. + + * Add instead a single fcntl functions, with constants for all the + standard commands except for the file-locking commands (this would + require support for struct flock). + +2011-09-29 Reuben Thomas + + rockspec: move distribution & home page to github + + Makefile.am: update to latest woger + + Bump version to 5.1.15. + + tests: rename test_fcntl.lua -> tests-fcntl.lua for consistency + + tests: fix Lua paths and xargs usage to run tests correctly + + Fix license. + + Merge pull request #11 from avnik/feature-pipe-and-dup2 + Add dup, pipe & more, from avnik. Thanks! + +2011-09-27 Mikhail Gusarov + + Tests for fcntl (untested) + +2011-09-25 Alexander V. Nikolaev + + Add setfl/getfl + Access to functionality of fcntl(fd, F_GETFL) and fcntl(fd, F_SETFL, arg) + +2011-09-23 Alexander V. Nikolaev + + Export WNOHANG to lua and pass options to wait + + Add pipe() and test + + Add dup/dup2 functions + +2011-09-23 Reuben Thomas + + Makefile.am: replace literal name of package with $(PACKAGE) once more. + +2011-09-19 Reuben Thomas + + Makefile.am: fix deps of the rockspec. + + Makefile.am: make release message shorter and more precise. + + Use $PACKAGE instead of luaposix. + + Fix distribution of rockspec source. + + Bump version to 5.1.14. + + Make some symbolic constants case-insensitive in Lua. + + configure.ac: use $PACKAGE rather than spelling out the name. + + Makefile.am: actually make rockspec on release + +2011-09-17 Reuben Thomas + + Makefile.am: fixes for building with rockspec. + Don’t put the fully expanded rockspec in EXTRA_DIST, as this creates a + recursive dependency (on the distribution archive). + + Fix the extraction of the summary description from the rockspec. + + Whitespace fixes to reminder output at end of make release. + +2011-09-17 Reuben Thomas + + rockspec: Find a remaining non-parametrized reference to the package name. + + rockspec: auto-generate (except for part of download URL, argh). + +2011-09-16 Reuben Thomas + + Bump version to 5.1.13. + + tests-posix.lua: Fix glob test again; we seem to have no .o files, so use .la files. + +2011-09-13 Reuben Thomas + + Don't build or install useless static libs or versioned symlinks. + +2011-09-11 Reuben Thomas + + Update curses documentation for luaposix integration. + +2011-09-10 Reuben Thomas + + configury: don’t try to guess install paths. + Remove machinery for guessing non-standardized install paths, and + instead expand documentation so it covers the standard Debian/Ubuntu + case. + +2011-09-09 Reuben Thomas + + .gitignore: Add distribution tarball. + + Merge pull request #10 from gvvaughan/pull-request/refactor-lookup_symbol-mappings + refactor: lookup_symbol mappings with macro splicing + +2011-09-09 Gary V. Vaughan + + refactor: lookup_symbol mappings with macro splicing + Tabulate just the basename for each mapping, and then stringify with an + offset, or splice in the prefix before macro expansion as each static + table initializer is built by the preprocessor. + +2011-09-09 Reuben Thomas + + Makefile.am: fix make distcheck. + + .gitignore: Add *.html and ChangeLog. + + Distribute tests. + + Distribute strlcpy.c. + + configury: Make building curses optional. + + Merge lcurses into luaposix. + +2011-09-08 Reuben Thomas + + Merge pull request #9 from gvvaughan/pull-request/tabulate-lookup_symbol-mappings + bugfix: tabulate lookup_symbol mappings + +2011-09-08 Gary V. Vaughan + + bugfix: tabulate lookup_symbol mappings + By keeping the map relationship explicitly in a macro expanded table, + prevent: And in this case fix a bug in the earlier changeset 58f586b + where they got out of sync. + +2011-09-08 Reuben Thomas + + Merge pull request #8 from gvvaughan/pull-request/add-libcrypt-if-required + configury: add libcrypt if required + + Merge pull request #7 from gvvaughan/pull-request/no-m4-quotes-in-configure-ac + configury: no m4 quotes in configure.ac + + Merge pull request #6 from gvvaughan/pull-request/need-dummy-incase-gnulib-has-no-objects + configury: need dummy module incase gnulib has no other objects + + Merge pull request #5 from gvvaughan/pull-request/let-bootstrap-conf-manage-gnulib-gitignore + configury: let bootstrap.conf manage gnulib .gitignore + + Merge pull request #4 from gvvaughan/pull-request/darwin-has-no-o-rsync-definition + portability: darwin has no O_RSYNC definition + +2011-09-08 Gary V. Vaughan + + configury: add libcrypt if required + When the crypt() function does not work unaided, try again by adding + libcrypt to LIBS and substituting into Makefile.in. + + portability: darwin has no O_RSYNC definition + + configury: need dummy module incase gnulib has no other objects + It's only safe to use --avoid=dummy when there will never be a libgnu.a + built, i.e there are no other modules with C code, and thus the parent + project is never linked with libgnu. + +2011-09-08 Gary V. Vaughan + + configury: let bootstrap.conf manage gnulib .gitignore + No need to check these files in when bootstrap.conf has functions to + manage them automatically without creating merge conflicts. + + For this changeset to work properly, you'll need to `git clean -f -x -d` + and then rerun bootstrap to generate a proper set of .gitignore files. + +2011-09-08 Gary V. Vaughan + + configury: no m4 quotes in configure.ac + Also, for the sake of forming good habits, keep the lvalua on the left + of a comparison, and avoid the potential for uname returning something + that test might interpret as an argument. + +2011-09-07 Reuben Thomas + + lposix.c: Include config.h. + + Rename luaopen function to match new library name. + + Add missing quotes. + + Replace previous machinery for detecting extra cc and ld flags. + + autotoolize the build system. + + Add read and write. + +2011-09-07 Reuben Thomas + + Add open and close. + Generalise get_rlimit_const to lookup_symbol, and use it for open + flags. + + Add a FIXME. + +2011-09-06 Reuben Thomas + + Tidy up whitespace and comments a bit for consistency. + +2011-06-20 Reuben Thomas + + Merge pull request #3 from jdegges/master + Add nanosleep. + +2011-06-20 Joey Degges + + Add nanosleep. + +2011-06-04 Reuben Thomas + + Remove unneeded shim for luaL_register; Lua 5.2 still has compatibility code for this. + +2011-05-11 Reuben Thomas + + Remove pushfile, which uses undocumented tricks which don’t work on LuaJIT, and hence dup, fdopen and pipe. + + Reformat test.lua a bit more consistently. + + Separate out Lua 5.2 compatibility. + +2011-05-11 David Favro + + Ported to 5.2.0-alpha. + * Lightly tested. + * Conditional compilation, so remains backwards-compatible with 5.1. + +2011-05-11 David Favro + + Makefile fix/enhancement. + * Fixed incorrect version string in library. + + * Compiles with -O2 rather than no optimization. + + * Added 'debug' target. This may not work for non-GNU makes. + +2011-05-11 David Favro + + Fixed bugs in dup(). + * Fixed bug: segfault (null pointer dereference) in dup(x,nil). + + * Fixed bug: non-conforming mode "rw" changed to "w+". POSIX specifies "w+" or + "r+" for read/write open. "rw" is incorrect and fails to open for writing + on GNU libc's fdopen(). + +2011-05-11 David Favro + + Updated test.lua and added new tests. + * Removed deprecated constructs foreach(), getn(). + * Added --no-times command-line option since that test is a bear to wait for. + * Added new tests: dup(), fdopen(). + +2011-04-27 Reuben Thomas + + Bump version to 5.1.11. + + Fix a typo which caused a buffer overrun. + + Bump version to 5.1.10. + + Fix typo in Pmkstemp. + + Fix possibly dangerous typos in mode_munch. + + Update maintainer and bump copyright year. + + Fix typo in error mesage. + + Add mkstemp. + +2011-04-03 Gary V. Vaughan + + lposix.c: Widen the _XOPEN_REALTIME guards around CLOCK_MONOTONIC et.al. + Several constants that are only defined with _XOPEN_REALTIME were + referenced even when _XOPEN_REALTIME is -1. + + Makefile: Darwin needs -D_POSIX_C_SOURCE in order to define SIGPOLL + +2011-03-30 Reuben Thomas + + Make sure _XOPEN_REALTIME is defined before testing its value. + + Remove non-POSIX rlimit resources, and as missing RLIMIT_AS. + +2011-03-29 Reuben Thomas + + Test _XOPEN_REALTIME correctly (!= -1, not merely defined). + +2011-03-24 Reuben Thomas + + Update maintainer and git repo location. + + Bump version to 5.1.9. + + Fix some Darwin problems. + + Guard realtime functions with _XOPEN_REALTIME, and remove a bogus debug line. + + Add getgroups. + + Add set_errno. + + Add _exit. + + Add signals support. + + Use lua_setfield where possible. + +2011-03-22 Natanael Copa + + release 5.1.8 + +2010-11-13 Reuben Thomas + + Add getopt_long. + +2010-11-12 Reuben Thomas + + Update maintainer and documentation information. + +2010-10-26 Natanael Copa + + isgraph/isprint: use function pointer to save a few bytes + +2010-10-26 Natanael Copa + + test: use execp instead of exec when testing fork (cherry picked from commit 42ec4caff2d4895577298f6f26156b80beacdaa6) + Conflicts: + + test.lua + +2010-10-26 Reuben Thomas + + Add isprint and isgraph. + + Add errno and stdio.h constants. + + Add abort and raise. + + Add some comments. + + Remove excess white space to aid readability, and fix some indenting. + + Remove Lua 5.0 compatibility. + + Add copyright notices for new contributors and tidy up old ones. + + Fold modemuncher.c into lposix.c, removing modesel array (same as lposix.c's M array). + + Use pushmode in Pumask, and hence remove modechopper from modemuncher.c. + + Put old ChangeLog in correct date order; remove non-ChangeLog format EOF marker. + +2010-10-26 Reuben Thomas + + Tidy up modemuncher.c. + Remove never-compiled debug code. This code is fairly well tested now. + + Fix whitespace and indentation. + + Remove camelCase name of modeLookup struct and typedef, which is only + used once, and use an anonymous struct instead. + + Rename the only remaining camelCase identifier in the entire file to a + non-camelCase one. + +2010-10-26 Reuben Thomas + + Remove unnecessary phony targets. + + Fix building with glibc (support for crypt). + + Remove non-POSIX gecos field of struct passwd. + + Improve a comment. + + Fix inconsistent indentation. + + Remove support for obsolete timezone argument of gettimeofday. + + Remove declaration of crypt; it's a build system problem. + + Add .gitignore file. + + Compile syslog functions on any system with new-enough POSIX. + + Clean up whitespace. + + Remove bogus whitespace. + +2010-10-26 Natanael Copa + + Revert "test: use execp instead of exec when testing fork" + This reverts commit 42ec4caff2d4895577298f6f26156b80beacdaa6. + + reverting so i can apply patchset + +2010-10-23 Natanael Copa + + test: use execp instead of exec when testing fork + +2010-09-15 Natanael Copa + + use integers for gettimeofday + so it works for platforms that uses float for lua numbers. + + Add note to ChangeLog that we moved to git + + rename ChangeLog to ChangeLog.old + We will only use git to provide the history from now on. + + fix bug in setrlimit + +2010-08-12 Natanael Copa + + release 5.1.7 + +2010-08-11 Tim Niemueller + + Make clock_* arguments optional + With the last change the clock id argument was no longer optional as + intended. + +2010-08-11 Natanael Copa + + set LIBVERSION=6 + should have been done before the 5.1.5 release :-( + +2010-08-10 Tim Niemueller + + Make clock_get* functions take string argument + For consistency with existing functions. + +2010-08-10 Natanael Copa + + added function definitions for 'make show-funcs' + +2010-08-09 Tim Niemueller + + Use realtime clock by default in clock_get* + + Added strftime + + Add localtime, gmtime and time + + Compilation fixes + + Fix compilation warnings (uninitialized values, signed vs. unsigned) + + if VERSION macro is not passed on command line, set to "unknown", allows + to integrate source file into other buildsystems more easily + + Add gettimeofday, clock_getres, clock_gettime + +2010-03-29 Natanael Copa + + release 5.1.5 + + use git describe to generate version string + and use cgit do distribute tarball so we dont need the tar stuff in makefile + +2009-08-11 Natanael Copa + + luafication of getrlimit/setrlimit + Use strings as parameters to select resource rather than integer + constants. + +2009-08-11 Enrico Tassi + + set/getrlimit, set/getuid and setlogmask bindings + Hi, + + while packagin the jabber server "prosody" for Debian, I noticed that + it was using a custom binding of some posix function not available in + luaposix. After asking prosody author, I wrote a patch for luaposix + that adds the missing functionalities prosody is actually shipping in a + custom .so. + + The attached patch binds the following functions: + set/getrlimit, set/getuid and setlogmask. + + I'd like it to be integrated in a future release of luaposix, if + posible. + + Cheers + -- + Enrico Tassi + +2008-07-18 Natanael Copa + + Set LIBVERSION=4 for release 5.1.4. + +2008-07-18 Natanael Copa + + support for crypt() + from openwrt. + + https://dev.openwrt.org/cgi-bin/trac.fcgi/browser/packages/lang/luaposix/patches/200-crypt.patch?rev=11585 + +2008-07-18 Natanael Copa + + ignore POLLHUP and POLLNVAL since they are only for output + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=491257 + +2008-06-03 Natanael Copa + + updated readme and changelog + + use luaL_register + + From: Felix Fietkau + here's a small patch that fixes luaposix compile on Darwin / Mac OS X + +2008-01-29 Natanael Copa + + added fdopen() + + updated changelog + + version 5.1.2 + + added syslog funcs dup() takes and returns lua files. added fileno() exec renamed to execp and new exec func uses execv(3) rather than execvp(3) + +2008-01-28 Natanael Copa + + dont run test by default + + sorted #includes, removed dead code, whitspacefixes + +2008-01-25 Natanael Copa + + cleaned up Makefile + + avoid warning on 64 bit hosts + +2008-01-24 Natanael Copa + + added poll() from http://lua-users.org/lists/lua-l/2007-11/msg00346.html + + included stuff from http://lua-users.org/lists/lua-l/2006-10/msg00448.html + + Initial revision diff --git a/GNUmakefile b/GNUmakefile new file mode 100644 index 0000000..f477d0a --- /dev/null +++ b/GNUmakefile @@ -0,0 +1,82 @@ +# Maintainer rules. +# +# Copyright (C) 2013-2015 Gary V. Vaughan +# Written by Gary V. Vaughan, 2013 +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +ME = GNUmakefile + +# If the user runs GNU make but didn't ./configure yet, do it for them. +dont-forget-to-bootstrap = $(wildcard Makefile.in) + +ifeq ($(dont-forget-to-bootstrap),) + +## Don't redo any pedantic rock version checks, incase they derail +## a subdirectory bootstrap of slingshot. + +%:: + @echo '$(ME): rebootstrap' + @test -f Makefile.in || ./bootstrap --skip-rock-checks + @test -f Makefile || ./configure + $(MAKE) $@ + +else + + +include build-aux/release.mk +include build-aux/sanity.mk + +# Run sanity checks as part of distcheck. +distcheck: $(local-check) + + +## ------------------------- ## +## Copyright Notice Updates. ## +## ------------------------- ## + +# If you want to set UPDATE_COPYRIGHT_* environment variables, +# for the build-aux/update-copyright script: set the assignments +# in this variable in local.mk. +update_copyright_env ?= + +# Run this rule once per year (usually early in January) +# to update all FSF copyright year lists in your project. +# If you have an additional project-specific rule, +# add it in local.mk along with a line 'update-copyright: prereq'. +# By default, exclude all variants of COPYING; you can also +# add exemptions (such as ChangeLog..* for rotated change logs) +# in the file .x-update-copyright. +.PHONY: update-copyright +update-copyright: + $(AM_V_GEN)grep -l -w Copyright \ + $$(export VC_LIST_EXCEPT_DEFAULT=COPYING && $(VC_LIST_EXCEPT)) \ + | $(update_copyright_env) xargs $(srcdir)/build-aux/$@ + + +## ------ ## +## Specl. ## +## ------ ## + +# Use 'make check V=1' for verbose output, or set SPECL_OPTS to +# pass alternative options to specl command. + +SPECL_OPTS ?= +SPECL_OPTS += $(specl_verbose_$(V)) +specl_verbose_ = $(specl_verbose_$(AM_DEFAULT_VERBOSITY)) +specl_verbose_0 = +specl_verbose_1 = --verbose --formatter=report + + +endif diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..4cbd15f --- /dev/null +++ b/INSTALL @@ -0,0 +1,370 @@ +Installation Instructions +************************* + +Copyright (C) 1994-1996, 1999-2002, 2004-2014 Free Software Foundation, +Inc. + + Copying and distribution of this file, with or without modification, +are permitted in any medium without royalty provided the copyright +notice and this notice are preserved. This file is offered as-is, +without warranty of any kind. + +Basic Installation +================== + + Briefly, the shell command `./configure && make && make install' +should configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. Some packages provide this +`INSTALL' file but do not implement all of the features documented +below. The lack of an optional feature in a given package is not +necessarily a bug. More recommendations for GNU packages can be found +in *note Makefile Conventions: (standards)Makefile Conventions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + + The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package, generally using the just-built uninstalled binaries. + + 4. Type `make install' to install the programs and any data files and + documentation. When installing into a prefix owned by root, it is + recommended that the package be configured and built as a regular + user, and only the `make install' phase executed with root + privileges. + + 5. Optionally, type `make installcheck' to repeat any self-tests, but + this time using the binaries in their final installed location. + This target does not install anything. Running this target as a + regular user, particularly if the prior `make install' required + root privileges, verifies that the installation completed + correctly. + + 6. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 7. Often, you can also type `make uninstall' to remove the installed + files again. In practice, not all packages have tested that + uninstallation works correctly, even though it is required by the + GNU Coding Standards. + + 8. Some packages, particularly those that use Automake, provide `make + distcheck', which can by used by developers to test that all other + targets like `make install' and `make uninstall' work correctly. + This target is generally not run by end users. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. This +is known as a "VPATH" build. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX', where PREFIX must be an +absolute file name. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. In general, the +default for these options is expressed in terms of `${prefix}', so that +specifying just `--prefix' will affect all of the other directory +specifications that were not explicitly provided. + + The most portable way to affect installation locations is to pass the +correct locations to `configure'; however, many packages provide one or +both of the following shortcuts of passing variable assignments to the +`make install' command line to change installation locations without +having to reconfigure or recompile. + + The first method involves providing an override variable for each +affected directory. For example, `make install +prefix=/alternate/directory' will choose an alternate location for all +directory configuration variables that were expressed in terms of +`${prefix}'. Any directories that were specified during `configure', +but not in terms of `${prefix}', must each be overridden at install +time for the entire installation to be relocated. The approach of +makefile variable overrides for each directory variable is required by +the GNU Coding Standards, and ideally causes no recompilation. +However, some platforms have known limitations with the semantics of +shared libraries that end up requiring recompilation when using this +method, particularly noticeable in packages that use GNU Libtool. + + The second method involves providing the `DESTDIR' variable. For +example, `make install DESTDIR=/alternate/directory' will prepend +`/alternate/directory' before all installation names. The approach of +`DESTDIR' overrides is not required by the GNU Coding Standards, and +does not work on platforms that have drive letters. On the other hand, +it does better at avoiding recompilation issues, and works well even +when some directory options were not specified in terms of `${prefix}' +at `configure' time. + +Optional Features +================= + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + Some packages offer the ability to configure how verbose the +execution of `make' will be. For these packages, running `./configure +--enable-silent-rules' sets the default to minimal output, which can be +overridden with `make V=1'; while running `./configure +--disable-silent-rules' sets the default to verbose, which can be +overridden with `make V=0'. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + HP-UX `make' updates targets which have the same time stamps as +their prerequisites, which makes it generally unusable when shipped +generated files such as `configure' are involved. Use GNU `make' +instead. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS + KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf limitation. Until the limitation is lifted, you can use +this workaround: + + CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--prefix=DIR' + Use DIR as the installation prefix. *note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..4ade870 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,109 @@ +# Non-recursive Make rules. +# +# Copyright (C) 2013-2015 Gary V. Vaughan +# Written by Gary V. Vaughan, 2013 +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +## ------------ ## +## Environment. ## +## ------------ ## + +LUA_PATH ?= ; +LUA_CPATH ?= ; + +SPECL_ENV = +CHECK_ENV = +INSTALLCHECK_ENV = + + +## ---------- ## +## Bootstrap. ## +## ---------- ## + +ACLOCAL_AMFLAGS = -I m4 + +AM_CPPFLAGS = $(LUA_INCLUDE) + + +## ------------- ## +## Declarations. ## +## ------------- ## + +EXTRA_DIST = +EXTRA_LTLIBRARIES = +CLEANFILES = +DISTCLEANFILES = +MAINTAINERCLEANFILES = +NOTHING_ELSE = + +bin_SCRIPTS = +check_local = +dist_bin_SCRIPTS = +dist_lua_DATA = +doc_DATA = +installcheck_local = +install_exec_hooks = remove-luaexec-lafiles +uninstall_hooks = uninstall-luaexec-modules +lib_LTLIBRARIES = +luaexec_LTLIBRARIES = +man_MANS = +save_release_files = + +include local.mk +include build-aux/rockspecs.mk + + +## ------------ ## +## Local Tests. ## +## ------------ ## + +check-local: $(check_local) + + +## ------------- ## +## Installation. ## +## ------------- ## + +installcheck-local: $(installcheck_local) + +install-exec-hook: $(install_exec_hooks) + +# Neither Lua itself, nor LuaRocks can use .la files, and LuaRocks +# actually moves such files aside anyway, so we just remove them from +# the installation directory. +remove-luaexec-lafiles: + @for la in $(luaexec_LTLIBRARIES); do \ + f=`echo "$$la" |sed 's|^.*/||'`; \ + echo rm -f $(DESTDIR)$(luaexecdir)/$$f; \ + rm -f $(DESTDIR)$(luaexecdir)/$$f; \ + done + + +## --------------- ## +## Uninstallation. ## +## --------------- ## + +uninstall-hook: $(uninstall_hooks) + +# We removed the .la files from luaexecdir, so the standard uninstall, +# with libtool --mode=uninstall, can't find everything anymore. +uninstall-luaexec-modules: + @for la in $(luaexec_LTLIBRARIES); do \ + base=`echo "$$la" \ + |sed 's|^.*/\(.*\)\.la|\1|'`; \ + echo rm -f $(DESTDIR)$(luaexecdir)/$$base.so; \ + rm -f $(DESTDIR)$(luaexecdir)/$$base.so; \ + done diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..3976e2d --- /dev/null +++ b/Makefile.in @@ -0,0 +1,2113 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Non-recursive Make rules. +# +# Copyright (C) 2013-2015 Gary V. Vaughan +# Written by Gary V. Vaughan, 2013 +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Local Make rules. +# Written by Gary V. Vaughan, 2013 + +# Copyright (C) 2013-2015 Gary V. Vaughan + +# This file is part of luaposix. +# See README for license. + +# Specl specs make rules. + +# Slingshot specl rules for make. + +# This file is distributed with Slingshot, and licensed under the +# terms of the MIT license reproduced below. + +# ==================================================================== # +# Copyright (C) 2013-2015 Gary V. Vaughan # +# # +# Permission is hereby granted, free of charge, to any person # +# obtaining a copy of this software and associated documentation # +# files (the "Software"), to deal in the Software without restriction, # +# including without limitation the rights to use, copy, modify, merge, # +# publish, distribute, sublicense, and/or sell copies of the Software, # +# and to permit persons to whom the Software is furnished to do so, # +# subject to the following conditions: # +# # +# The above copyright notice and this permission notice shall be # +# included in all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGE- # +# MENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE # +# FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF # +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # +# ==================================================================== # + +# To use this file create a list of your spec files in specl_SPECS +# and then include this make fragment. + +# Slingshot rockspec rules for make. + +# This file is distributed with Slingshot, and licensed under the +# terms of the MIT license reproduced below. + +# ==================================================================== # +# Copyright (C) 2013-2015 Reuben Thomas and Gary V. Vaughan # +# # +# Permission is hereby granted, free of charge, to any person # +# obtaining a copy of this software and associated documentation # +# files (the "Software"), to deal in the Software without restriction, # +# including without limitation the rights to use, copy, modify, merge, # +# publish, distribute, sublicense, and/or sell copies of the Software, # +# and to permit persons to whom the Software is furnished to do so, # +# subject to the following conditions: # +# # +# The above copyright notice and this permission notice shall be # +# included in all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGE- # +# MENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE # +# FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF # +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # +# ==================================================================== # + +# This file is suitable for use from a portable Makefile, you might +# include it into the top-level Makefile.am with: +# +# include build-aux/rockspecs.mk + + + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/00gnulib.m4 \ + $(top_srcdir)/m4/ax_lua.m4 $(top_srcdir)/m4/ax_with_curses.m4 \ + $(top_srcdir)/m4/gnulib-common.m4 \ + $(top_srcdir)/m4/gnulib-comp.m4 $(top_srcdir)/m4/libtool.m4 \ + $(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \ + $(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \ + $(top_srcdir)/m4/manywarnings.m4 $(top_srcdir)/m4/onceonly.m4 \ + $(top_srcdir)/m4/warnings.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(dist_bin_SCRIPTS) $(dist_classes_DATA) \ + $(dist_data_DATA) $(dist_doc_DATA) $(dist_examples_DATA) \ + $(dist_lua_DATA) $(dist_luaposix_DATA) $(dist_modules_DATA) \ + $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = build-aux/config.ld lib/posix/init.lua +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(luaexecdir)" \ + "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" \ + "$(DESTDIR)$(classesdir)" "$(DESTDIR)$(datadir)" \ + "$(DESTDIR)$(docdir)" "$(DESTDIR)$(examplesdir)" \ + "$(DESTDIR)$(luadir)" "$(DESTDIR)$(luaposixdir)" \ + "$(DESTDIR)$(modulesdir)" "$(DESTDIR)$(docdir)" +LTLIBRARIES = $(lib_LTLIBRARIES) $(luaexec_LTLIBRARIES) +ext_posix_ctype_la_LIBADD = +ext_posix_ctype_la_SOURCES = ext/posix/ctype.c +am__dirstamp = $(am__leading_dot)dirstamp +ext_posix_ctype_la_OBJECTS = ext/posix/ctype.lo +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +ext_posix_ctype_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_ctype_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_curses_la_LIBADD = +ext_posix_curses_la_SOURCES = ext/posix/curses.c +ext_posix_curses_la_OBJECTS = ext/posix/curses.lo +ext_posix_curses_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_curses_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_curses_chstr_la_LIBADD = +ext_posix_curses_chstr_la_SOURCES = ext/posix/curses/chstr.c +ext_posix_curses_chstr_la_OBJECTS = ext/posix/curses/chstr.lo +ext_posix_curses_window_la_LIBADD = +ext_posix_curses_window_la_SOURCES = ext/posix/curses/window.c +ext_posix_curses_window_la_OBJECTS = ext/posix/curses/window.lo +ext_posix_dirent_la_LIBADD = +ext_posix_dirent_la_SOURCES = ext/posix/dirent.c +ext_posix_dirent_la_OBJECTS = ext/posix/dirent.lo +ext_posix_dirent_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_dirent_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_errno_la_LIBADD = +ext_posix_errno_la_SOURCES = ext/posix/errno.c +ext_posix_errno_la_OBJECTS = ext/posix/errno.lo +ext_posix_errno_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_errno_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_fcntl_la_LIBADD = +ext_posix_fcntl_la_SOURCES = ext/posix/fcntl.c +ext_posix_fcntl_la_OBJECTS = ext/posix/fcntl.lo +ext_posix_fcntl_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_fcntl_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_fnmatch_la_LIBADD = +ext_posix_fnmatch_la_SOURCES = ext/posix/fnmatch.c +ext_posix_fnmatch_la_OBJECTS = ext/posix/fnmatch.lo +ext_posix_fnmatch_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_fnmatch_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_getopt_la_LIBADD = +ext_posix_getopt_la_SOURCES = ext/posix/getopt.c +ext_posix_getopt_la_OBJECTS = ext/posix/getopt.lo +ext_posix_getopt_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_getopt_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_glob_la_LIBADD = +ext_posix_glob_la_SOURCES = ext/posix/glob.c +ext_posix_glob_la_OBJECTS = ext/posix/glob.lo +ext_posix_glob_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_glob_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +ext_posix_grp_la_LIBADD = +ext_posix_grp_la_SOURCES = ext/posix/grp.c +ext_posix_grp_la_OBJECTS = ext/posix/grp.lo +ext_posix_grp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_grp_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +ext_posix_libgen_la_LIBADD = +ext_posix_libgen_la_SOURCES = ext/posix/libgen.c +ext_posix_libgen_la_OBJECTS = ext/posix/libgen.lo +ext_posix_libgen_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_libgen_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_poll_la_LIBADD = +ext_posix_poll_la_SOURCES = ext/posix/poll.c +ext_posix_poll_la_OBJECTS = ext/posix/poll.lo +ext_posix_poll_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_poll_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +ext_posix_posix_la_LIBADD = +am__objects_1 = +am_ext_posix_posix_la_OBJECTS = ext/posix/posix.lo $(am__objects_1) +ext_posix_posix_la_OBJECTS = $(am_ext_posix_posix_la_OBJECTS) +ext_posix_posix_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_posix_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_pwd_la_LIBADD = +ext_posix_pwd_la_SOURCES = ext/posix/pwd.c +ext_posix_pwd_la_OBJECTS = ext/posix/pwd.lo +ext_posix_pwd_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_pwd_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +ext_posix_sched_la_LIBADD = +ext_posix_sched_la_SOURCES = ext/posix/sched.c +ext_posix_sched_la_OBJECTS = ext/posix/sched.lo +ext_posix_sched_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_sched_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_signal_la_LIBADD = +ext_posix_signal_la_SOURCES = ext/posix/signal.c +ext_posix_signal_la_OBJECTS = ext/posix/signal.lo +ext_posix_signal_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_signal_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_stdio_la_LIBADD = +ext_posix_stdio_la_SOURCES = ext/posix/stdio.c +ext_posix_stdio_la_OBJECTS = ext/posix/stdio.lo +ext_posix_stdio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_stdio_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_stdlib_la_LIBADD = +ext_posix_stdlib_la_SOURCES = ext/posix/stdlib.c +ext_posix_stdlib_la_OBJECTS = ext/posix/stdlib.lo +ext_posix_stdlib_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_stdlib_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_sys_msg_la_LIBADD = +ext_posix_sys_msg_la_SOURCES = ext/posix/sys/msg.c +ext_posix_sys_msg_la_OBJECTS = ext/posix/sys/msg.lo +ext_posix_sys_msg_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_sys_msg_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_sys_resource_la_LIBADD = +ext_posix_sys_resource_la_SOURCES = ext/posix/sys/resource.c +ext_posix_sys_resource_la_OBJECTS = ext/posix/sys/resource.lo +ext_posix_sys_resource_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_sys_resource_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_sys_socket_la_LIBADD = +ext_posix_sys_socket_la_SOURCES = ext/posix/sys/socket.c +ext_posix_sys_socket_la_OBJECTS = ext/posix/sys/socket.lo +ext_posix_sys_socket_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_sys_socket_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_sys_stat_la_LIBADD = +ext_posix_sys_stat_la_SOURCES = ext/posix/sys/stat.c +ext_posix_sys_stat_la_OBJECTS = ext/posix/sys/stat.lo +ext_posix_sys_stat_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_sys_stat_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_sys_statvfs_la_LIBADD = +ext_posix_sys_statvfs_la_SOURCES = ext/posix/sys/statvfs.c +ext_posix_sys_statvfs_la_OBJECTS = ext/posix/sys/statvfs.lo +ext_posix_sys_statvfs_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_sys_statvfs_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_sys_time_la_LIBADD = +ext_posix_sys_time_la_SOURCES = ext/posix/sys/time.c +ext_posix_sys_time_la_OBJECTS = ext/posix/sys/time.lo +ext_posix_sys_time_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_sys_time_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_sys_times_la_LIBADD = +ext_posix_sys_times_la_SOURCES = ext/posix/sys/times.c +ext_posix_sys_times_la_OBJECTS = ext/posix/sys/times.lo +ext_posix_sys_times_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_sys_times_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_sys_utsname_la_LIBADD = +ext_posix_sys_utsname_la_SOURCES = ext/posix/sys/utsname.c +ext_posix_sys_utsname_la_OBJECTS = ext/posix/sys/utsname.lo +ext_posix_sys_utsname_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_sys_utsname_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_sys_wait_la_LIBADD = +ext_posix_sys_wait_la_SOURCES = ext/posix/sys/wait.c +ext_posix_sys_wait_la_OBJECTS = ext/posix/sys/wait.lo +ext_posix_sys_wait_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_sys_wait_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_syslog_la_LIBADD = +ext_posix_syslog_la_SOURCES = ext/posix/syslog.c +ext_posix_syslog_la_OBJECTS = ext/posix/syslog.lo +ext_posix_syslog_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_syslog_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_termio_la_LIBADD = +ext_posix_termio_la_SOURCES = ext/posix/termio.c +ext_posix_termio_la_OBJECTS = ext/posix/termio.lo +ext_posix_termio_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_termio_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_time_la_LIBADD = +ext_posix_time_la_SOURCES = ext/posix/time.c +ext_posix_time_la_OBJECTS = ext/posix/time.lo +ext_posix_time_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_time_la_LDFLAGS) $(LDFLAGS) \ + -o $@ +ext_posix_unistd_la_LIBADD = +ext_posix_unistd_la_SOURCES = ext/posix/unistd.c +ext_posix_unistd_la_OBJECTS = ext/posix/unistd.lo +ext_posix_unistd_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_unistd_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +ext_posix_utime_la_LIBADD = +ext_posix_utime_la_SOURCES = ext/posix/utime.c +ext_posix_utime_la_OBJECTS = ext/posix/utime.lo +ext_posix_utime_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ + $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ + $(AM_CFLAGS) $(CFLAGS) $(ext_posix_utime_la_LDFLAGS) \ + $(LDFLAGS) -o $@ +SCRIPTS = $(bin_SCRIPTS) $(dist_bin_SCRIPTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = ext/posix/ctype.c ext/posix/curses.c \ + ext/posix/curses/chstr.c ext/posix/curses/window.c \ + ext/posix/dirent.c ext/posix/errno.c ext/posix/fcntl.c \ + ext/posix/fnmatch.c ext/posix/getopt.c ext/posix/glob.c \ + ext/posix/grp.c ext/posix/libgen.c ext/posix/poll.c \ + $(ext_posix_posix_la_SOURCES) \ + $(EXTRA_ext_posix_posix_la_SOURCES) ext/posix/pwd.c \ + ext/posix/sched.c ext/posix/signal.c ext/posix/stdio.c \ + ext/posix/stdlib.c ext/posix/sys/msg.c \ + ext/posix/sys/resource.c ext/posix/sys/socket.c \ + ext/posix/sys/stat.c ext/posix/sys/statvfs.c \ + ext/posix/sys/time.c ext/posix/sys/times.c \ + ext/posix/sys/utsname.c ext/posix/sys/wait.c \ + ext/posix/syslog.c ext/posix/termio.c ext/posix/time.c \ + ext/posix/unistd.c ext/posix/utime.c +DIST_SOURCES = ext/posix/ctype.c ext/posix/curses.c \ + ext/posix/curses/chstr.c ext/posix/curses/window.c \ + ext/posix/dirent.c ext/posix/errno.c ext/posix/fcntl.c \ + ext/posix/fnmatch.c ext/posix/getopt.c ext/posix/glob.c \ + ext/posix/grp.c ext/posix/libgen.c ext/posix/poll.c \ + $(ext_posix_posix_la_SOURCES) \ + $(EXTRA_ext_posix_posix_la_SOURCES) ext/posix/pwd.c \ + ext/posix/sched.c ext/posix/signal.c ext/posix/stdio.c \ + ext/posix/stdlib.c ext/posix/sys/msg.c \ + ext/posix/sys/resource.c ext/posix/sys/socket.c \ + ext/posix/sys/stat.c ext/posix/sys/statvfs.c \ + ext/posix/sys/time.c ext/posix/sys/times.c \ + ext/posix/sys/utsname.c ext/posix/sys/wait.c \ + ext/posix/syslog.c ext/posix/termio.c ext/posix/time.c \ + ext/posix/unistd.c ext/posix/utime.c +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +DATA = $(dist_classes_DATA) $(dist_data_DATA) $(dist_doc_DATA) \ + $(dist_examples_DATA) $(dist_lua_DATA) $(dist_luaposix_DATA) \ + $(dist_modules_DATA) $(doc_DATA) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +AM_RECURSIVE_TARGETS = cscope +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(srcdir)/build-aux/rockspecs.mk $(srcdir)/build-aux/specl.mk \ + $(srcdir)/config.h.in $(srcdir)/local.mk \ + $(srcdir)/specs/specs.mk $(top_srcdir)/build-aux/ar-lib \ + $(top_srcdir)/build-aux/compile \ + $(top_srcdir)/build-aux/config.guess \ + $(top_srcdir)/build-aux/config.ld.in \ + $(top_srcdir)/build-aux/config.sub \ + $(top_srcdir)/build-aux/depcomp \ + $(top_srcdir)/build-aux/install-sh \ + $(top_srcdir)/build-aux/ltmain.sh \ + $(top_srcdir)/build-aux/missing $(top_srcdir)/lib/posix.lua.in \ + AUTHORS COPYING ChangeLog INSTALL NEWS README build-aux/ar-lib \ + build-aux/compile build-aux/config.guess build-aux/config.sub \ + build-aux/depcomp build-aux/install-sh build-aux/ltmain.sh \ + build-aux/missing +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +DIST_TARGETS = dist-gzip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +ARFLAGS = @ARFLAGS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CURSES_LIB = @CURSES_LIB@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LDOC = @LDOC@ +LIBCRYPT = @LIBCRYPT@ +LIBOBJS = @LIBOBJS@ +LIBRT = @LIBRT@ +LIBS = @LIBS@ +LIBSOCKET = @LIBSOCKET@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +LUA = @LUA@ +LUA_EXEC_PREFIX = @LUA_EXEC_PREFIX@ +LUA_INCLUDE = @LUA_INCLUDE@ +LUA_PLATFORM = @LUA_PLATFORM@ +LUA_PREFIX = @LUA_PREFIX@ +LUA_SHORT_VERSION = @LUA_SHORT_VERSION@ +LUA_VERSION = @LUA_VERSION@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PERL = @PERL@ +POSIX_EXTRA_CPPFLAGS = @POSIX_EXTRA_CPPFLAGS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SPECL = @SPECL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +WARN_CFLAGS = @WARN_CFLAGS@ +WERROR_CFLAGS = @WERROR_CFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +gl_LIBOBJS = @gl_LIBOBJS@ +gl_LTLIBOBJS = @gl_LTLIBOBJS@ +gltests_LIBOBJS = @gltests_LIBOBJS@ +gltests_LTLIBOBJS = @gltests_LTLIBOBJS@ +gltests_WITNESS = @gltests_WITNESS@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +luadir = @luadir@ +luaexecdir = @luaexecdir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +objdir = @objdir@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +pkgluadir = @pkgluadir@ +pkgluaexecdir = @pkgluaexecdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shrext = @shrext@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SPECL_ENV = +CHECK_ENV = LUA='$(LUA)' PACKAGE_STRING='$(PACKAGE_STRING)' \ + abs_top_builddir='$(abs_top_builddir)' \ + abs_top_srcdir='$(abs_top_srcdir)' \ + top_builddir='$(top_builddir)' top_srcdir='$(top_srcdir)' \ + $(NOTHING_ELSE) +INSTALLCHECK_ENV = LUA='$(LUA)' PACKAGE_STRING='$(PACKAGE_STRING)' \ + installcheck='true' $(NOTHING_ELSE) +ACLOCAL_AMFLAGS = -I m4 +AM_CPPFLAGS = $(LUA_INCLUDE) -I $(srcdir)/ext/include -I \ + $(srcdir)/ext/posix $(POSIX_EXTRA_CPPFLAGS) +EXTRA_DIST = $(srcdir)/specs/spec_helper.lua $(NOTHING_ELSE) \ + $(specl_SPECS) $(NOTHING_ELSE) build-aux/config.ld.in \ + examples/dir.lua examples/fork.lua examples/fork2.lua \ + examples/getopt.lua examples/glob.lua examples/limit.lua \ + examples/lock.lua examples/netlink-uevent.lua \ + examples/ping.lua examples/poll.lua examples/signal.lua \ + examples/socket.lua examples/termios.lua examples/tree.lua \ + ext/include/_helpers.c ext/include/compat-5.2.c \ + ext/include/compat-5.2.h ext/include/strlcpy.c $(NOTHING_ELSE) \ + $(mkrockspecs) $(package_rockspec) $(rockspec_conf) \ + $(NOTHING_ELSE) +EXTRA_LTLIBRARIES = $(posix_submodules) +CLEANFILES = +DISTCLEANFILES = $(luarocks_config) $(NOTHING_ELSE) +MAINTAINERCLEANFILES = doc/index.html doc/ldoc.css \ + $(dist_examples_DATA) $(dist_modules_DATA) $(NOTHING_ELSE) +NOTHING_ELSE = +bin_SCRIPTS = +check_local = specl-check-local $(posix_submodules) +dist_bin_SCRIPTS = +dist_lua_DATA = lib/curses.lua $(NOTHING_ELSE) +doc_DATA = +installcheck_local = specl-installcheck-local +install_exec_hooks = remove-luaexec-lafiles +uninstall_hooks = uninstall-luaexec-modules +lib_LTLIBRARIES = +luaexec_LTLIBRARIES = ext/posix/posix.la +man_MANS = +save_release_files = $(scm_rockspec) +posix_cpath = $(abs_builddir)/ext/posix/$(objdir)/?$(shrext) +std_cpath = $(posix_cpath);$(LUA_CPATH) +std_path = $(abs_srcdir)/lib/?.lua;$(LUA_PATH) +LUA_ENV = LUA_PATH="$(std_path)" LUA_CPATH="$(std_cpath)" +AM_CFLAGS = $(WERROR_CFLAGS) $(WARN_CFLAGS) +AM_LDFLAGS = -module -avoid-version +old_NEWS_hash = d41d8cd98f00b204e9800998ecf8427e +update_copyright_env = \ + UPDATE_COPYRIGHT_HOLDER='(Gary V. Vaughan|Reuben Thomas|luaposix authors)' \ + UPDATE_COPYRIGHT_USE_INTERVALS=1 \ + UPDATE_COPYRIGHT_FORCE=1 + +examplesdir = $(docdir)/examples +modulesdir = $(docdir)/modules +classesdir = $(docdir)/classes +dist_data_DATA = +dist_doc_DATA = doc/index.html doc/ldoc.css $(NOTHING_ELSE) +dist_examples_DATA = doc/examples/curses.lua.html \ + doc/examples/dir.lua.html doc/examples/fork.lua.html \ + doc/examples/fork2.lua.html doc/examples/getopt.lua.html \ + doc/examples/glob.lua.html doc/examples/limit.lua.html \ + doc/examples/lock.lua.html \ + doc/examples/netlink-uevent.lua.html \ + doc/examples/ping.lua.html doc/examples/poll.lua.html \ + doc/examples/signal.lua.html doc/examples/socket.lua.html \ + doc/examples/termios.lua.html doc/examples/tree.lua.html \ + $(NOTHING_ELSE) +dist_modules_DATA = doc/modules/posix.ctype.html \ + doc/modules/posix.curses.html doc/modules/posix.dirent.html \ + doc/modules/posix.errno.html doc/modules/posix.fcntl.html \ + doc/modules/posix.fnmatch.html doc/modules/posix.getopt.html \ + doc/modules/posix.glob.html doc/modules/posix.grp.html \ + doc/modules/posix.html doc/modules/posix.libgen.html \ + doc/modules/posix.poll.html doc/modules/posix.pwd.html \ + doc/modules/posix.sched.html doc/modules/posix.signal.html \ + doc/modules/posix.stdio.html doc/modules/posix.stdlib.html \ + doc/modules/posix.sys.msg.html \ + doc/modules/posix.sys.resource.html \ + doc/modules/posix.sys.socket.html \ + doc/modules/posix.sys.stat.html \ + doc/modules/posix.sys.statvfs.html \ + doc/modules/posix.sys.time.html \ + doc/modules/posix.sys.times.html \ + doc/modules/posix.sys.utsname.html \ + doc/modules/posix.sys.wait.html doc/modules/posix.syslog.html \ + doc/modules/posix.termio.html doc/modules/posix.time.html \ + doc/modules/posix.unistd.html doc/modules/posix.utime.html \ + $(NOTHING_ELSE) +dist_classes_DATA = doc/classes/posix.curses.chstr.html \ + doc/classes/posix.curses.window.html $(NOTHING_ELSE) +specl_SPECS = \ + $(srcdir)/specs/posix_version_spec.yaml \ + $(srcdir)/specs/curses_spec.yaml \ + $(srcdir)/specs/lposix_spec.yaml \ + $(srcdir)/specs/posix_compat_spec.yaml \ + $(srcdir)/specs/posix_ctype_spec.yaml \ + $(srcdir)/specs/posix_deprecated_spec.yaml \ + $(srcdir)/specs/posix_dirent_spec.yaml \ + $(srcdir)/specs/posix_fcntl_spec.yaml \ + $(srcdir)/specs/posix_fnmatch_spec.yaml \ + $(srcdir)/specs/posix_grp_spec.yaml \ + $(srcdir)/specs/posix_pwd_spec.yaml \ + $(srcdir)/specs/posix_signal_spec.yaml \ + $(srcdir)/specs/posix_stdio_spec.yaml \ + $(srcdir)/specs/posix_stdlib_spec.yaml \ + $(srcdir)/specs/posix_sys_msg_spec.yaml \ + $(srcdir)/specs/posix_sys_resource_spec.yaml \ + $(srcdir)/specs/posix_sys_socket_spec.yaml \ + $(srcdir)/specs/posix_sys_stat_spec.yaml \ + $(srcdir)/specs/posix_sys_statvfs_spec.yaml \ + $(srcdir)/specs/posix_sys_time_spec.yaml \ + $(srcdir)/specs/posix_sys_times_spec.yaml \ + $(srcdir)/specs/posix_sys_utsname_spec.yaml \ + $(srcdir)/specs/posix_syslog_spec.yaml \ + $(srcdir)/specs/posix_time_spec.yaml \ + $(srcdir)/specs/posix_unistd_spec.yaml \ + $(srcdir)/specs/posix_spec.yaml \ + $(NOTHING_ELSE) + +luaposixdir = $(luadir)/posix +dist_luaposix_DATA = \ + lib/posix/init.lua \ + lib/posix/_argcheck.lua \ + lib/posix/compat.lua \ + lib/posix/deprecated.lua \ + lib/posix/sys.lua \ + lib/posix/util.lua \ + $(NOTHING_ELSE) + +ext_posix_posix_la_SOURCES = \ + ext/posix/posix.c \ + $(NOTHING_ELSE) + +EXTRA_ext_posix_posix_la_SOURCES = \ + ext/posix/ctype.c \ + ext/posix/curses.c \ + ext/posix/curses/chstr.c \ + ext/posix/curses/window.c \ + ext/posix/dirent.c \ + ext/posix/errno.c \ + ext/posix/fcntl.c \ + ext/posix/fnmatch.c \ + ext/posix/getopt.c \ + ext/posix/glob.c \ + ext/posix/grp.c \ + ext/posix/libgen.c \ + ext/posix/poll.c \ + ext/posix/pwd.c \ + ext/posix/sched.c \ + ext/posix/signal.c \ + ext/posix/stdio.c \ + ext/posix/stdlib.c \ + ext/posix/sys/msg.c \ + ext/posix/sys/resource.c \ + ext/posix/sys/socket.c \ + ext/posix/sys/stat.c \ + ext/posix/sys/statvfs.c \ + ext/posix/sys/time.c \ + ext/posix/sys/times.c \ + ext/posix/sys/utsname.c \ + ext/posix/sys/wait.c \ + ext/posix/syslog.c \ + ext/posix/termio.c \ + ext/posix/time.c \ + ext/posix/unistd.c \ + ext/posix/utime.c \ + $(NOTHING_ELSE) + +ext_posix_posix_la_LDFLAGS = $(AM_LDFLAGS) $(LIBCRYPT) $(LIBSOCKET) $(LIBRT) $(CURSES_LIB) +luaexecposixdir = $(luaexecdir)/posix +luaexecposixsysdir = $(luaexecposixdir)/sys + +# EXTRA_LTLIBRARIES don't have an RPATH by default. +luaexecposix_LDFLAGS = $(AM_LDFLAGS) -rpath '$(luaexecposixdir)' +luaexecposixsys_LDFLAGS = $(AM_LDFLAGS) -rpath '$(luaexecposixsysdir)' + +# We don't install these, but we do need to make sure they compile +# for people who want to copy some of the sources into their own +# projects for custom interpreters/libraries. +posix_submodules = \ + ext/posix/ctype.la \ + ext/posix/curses.la \ + ext/posix/curses/chstr.la \ + ext/posix/curses/window.la \ + ext/posix/dirent.la \ + ext/posix/errno.la \ + ext/posix/fcntl.la \ + ext/posix/fnmatch.la \ + ext/posix/getopt.la \ + ext/posix/glob.la \ + ext/posix/grp.la \ + ext/posix/libgen.la \ + ext/posix/poll.la \ + ext/posix/pwd.la \ + ext/posix/sched.la \ + ext/posix/signal.la \ + ext/posix/stdio.la \ + ext/posix/stdlib.la \ + ext/posix/sys/msg.la \ + ext/posix/sys/resource.la \ + ext/posix/sys/socket.la \ + ext/posix/sys/stat.la \ + ext/posix/sys/statvfs.la \ + ext/posix/sys/time.la \ + ext/posix/sys/times.la \ + ext/posix/sys/utsname.la \ + ext/posix/sys/wait.la \ + ext/posix/syslog.la \ + ext/posix/termio.la \ + ext/posix/time.la \ + ext/posix/unistd.la \ + ext/posix/utime.la \ + $(NOTHING_ELSE) + +ext_posix_ctype_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_curses_la_LDFLAGS = $(luaexecposix_LDFLAGS) $(CURSES_LIB) +ext_posix_dirent_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_errno_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_fcntl_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_fnmatch_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_getopt_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_glob_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_grp_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_libgen_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_poll_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_pwd_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_sched_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_signal_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_stdio_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_stdlib_la_LDFLAGS = $(luaexecposix_LDFLAGS) $(LIBCRYPT) +ext_posix_syslog_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_termio_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_time_la_LDFLAGS = $(luaexecposix_LDFLAGS) $(LIBRT) +ext_posix_unistd_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_utime_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_sys_msg_la_LDFLAGS = $(luaexecposixsys_LDFLAGS) +ext_posix_sys_resource_la_LDFLAGS = $(luaexecposixsys_LDFLAGS) +ext_posix_sys_socket_la_LDFLAGS = $(luaexecposixsys_LDFLAGS) +ext_posix_sys_stat_la_LDFLAGS = $(luaexecposixsys_LDFLAGS) +ext_posix_sys_statvfs_la_LDFLAGS = $(luaexecposixsys_LDFLAGS) +ext_posix_sys_time_la_LDFLAGS = $(luaexecposixsys_LDFLAGS) +ext_posix_sys_times_la_LDFLAGS = $(luaexecposixsys_LDFLAGS) +ext_posix_sys_utsname_la_LDFLAGS = $(luaexecposixsys_LDFLAGS) +ext_posix_sys_wait_la_LDFLAGS = $(luaexecposixsys_LDFLAGS) +allhtml = $(dist_doc_DATA) $(dist_examples_DATA) $(dist_modules_DATA) $(dist_classes_DATA) +luarocks_config = build-aux/luarocks-config.lua +rockspec_conf = $(srcdir)/rockspec.conf +mkrockspecs = $(srcdir)/build-aux/mkrockspecs +package_rockspec = $(srcdir)/$(PACKAGE)-$(VERSION)-$(rockspec_revision).rockspec +scm_rockspec = $(PACKAGE)-git-$(rockspec_revision).rockspec + +# If you need a different rockspec revision, override this on the make +# command line: +# +# make rockspecs rockspec_revision=2 +rockspec_revision = 1 +LUAROCKS = luarocks +MKROCKSPECS = $(MKROCKSPECS_ENV) $(LUA) $(mkrockspecs) +ROCKSPECS_DEPS = \ + $(luarocks_config) \ + $(mkrockspecs) \ + $(rockspec_conf) \ + $(NOTHING_ELSE) + +set_LUA_BINDIR = LUA_BINDIR=`which $(LUA) |$(SED) 's|/[^/]*$$||'` +LUA_INCDIR = `cd $$LUA_BINDIR/../include && pwd` +LUA_LIBDIR = `cd $$LUA_BINDIR/../lib && pwd` +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/local.mk $(srcdir)/specs/specs.mk $(srcdir)/build-aux/specl.mk $(srcdir)/build-aux/rockspecs.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; +$(srcdir)/local.mk $(srcdir)/specs/specs.mk $(srcdir)/build-aux/specl.mk $(srcdir)/build-aux/rockspecs.mk $(am__empty): + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +build-aux/config.ld: $(top_builddir)/config.status $(top_srcdir)/build-aux/config.ld.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +lib/posix/init.lua: $(top_builddir)/config.status $(top_srcdir)/lib/posix.lua.in + cd $(top_builddir) && $(SHELL) ./config.status $@ + +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } + +install-luaexecLTLIBRARIES: $(luaexec_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(luaexec_LTLIBRARIES)'; test -n "$(luaexecdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(luaexecdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(luaexecdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(luaexecdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(luaexecdir)"; \ + } + +uninstall-luaexecLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(luaexec_LTLIBRARIES)'; test -n "$(luaexecdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(luaexecdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(luaexecdir)/$$f"; \ + done + +clean-luaexecLTLIBRARIES: + -test -z "$(luaexec_LTLIBRARIES)" || rm -f $(luaexec_LTLIBRARIES) + @list='$(luaexec_LTLIBRARIES)'; \ + locs=`for p in $$list; do echo $$p; done | \ + sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ + sort -u`; \ + test -z "$$locs" || { \ + echo rm -f $${locs}; \ + rm -f $${locs}; \ + } +ext/posix/$(am__dirstamp): + @$(MKDIR_P) ext/posix + @: > ext/posix/$(am__dirstamp) +ext/posix/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ext/posix/$(DEPDIR) + @: > ext/posix/$(DEPDIR)/$(am__dirstamp) +ext/posix/ctype.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) + +ext/posix/ctype.la: $(ext_posix_ctype_la_OBJECTS) $(ext_posix_ctype_la_DEPENDENCIES) $(EXTRA_ext_posix_ctype_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_ctype_la_LINK) $(ext_posix_ctype_la_OBJECTS) $(ext_posix_ctype_la_LIBADD) $(LIBS) +ext/posix/curses.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) + +ext/posix/curses.la: $(ext_posix_curses_la_OBJECTS) $(ext_posix_curses_la_DEPENDENCIES) $(EXTRA_ext_posix_curses_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_curses_la_LINK) $(ext_posix_curses_la_OBJECTS) $(ext_posix_curses_la_LIBADD) $(LIBS) +ext/posix/curses/$(am__dirstamp): + @$(MKDIR_P) ext/posix/curses + @: > ext/posix/curses/$(am__dirstamp) +ext/posix/curses/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ext/posix/curses/$(DEPDIR) + @: > ext/posix/curses/$(DEPDIR)/$(am__dirstamp) +ext/posix/curses/chstr.lo: ext/posix/curses/$(am__dirstamp) \ + ext/posix/curses/$(DEPDIR)/$(am__dirstamp) + +ext/posix/curses/chstr.la: $(ext_posix_curses_chstr_la_OBJECTS) $(ext_posix_curses_chstr_la_DEPENDENCIES) $(EXTRA_ext_posix_curses_chstr_la_DEPENDENCIES) ext/posix/curses/$(am__dirstamp) + $(AM_V_CCLD)$(LINK) $(ext_posix_curses_chstr_la_OBJECTS) $(ext_posix_curses_chstr_la_LIBADD) $(LIBS) +ext/posix/curses/window.lo: ext/posix/curses/$(am__dirstamp) \ + ext/posix/curses/$(DEPDIR)/$(am__dirstamp) + +ext/posix/curses/window.la: $(ext_posix_curses_window_la_OBJECTS) $(ext_posix_curses_window_la_DEPENDENCIES) $(EXTRA_ext_posix_curses_window_la_DEPENDENCIES) ext/posix/curses/$(am__dirstamp) + $(AM_V_CCLD)$(LINK) $(ext_posix_curses_window_la_OBJECTS) $(ext_posix_curses_window_la_LIBADD) $(LIBS) +ext/posix/dirent.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) + +ext/posix/dirent.la: $(ext_posix_dirent_la_OBJECTS) $(ext_posix_dirent_la_DEPENDENCIES) $(EXTRA_ext_posix_dirent_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_dirent_la_LINK) $(ext_posix_dirent_la_OBJECTS) $(ext_posix_dirent_la_LIBADD) $(LIBS) +ext/posix/errno.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) + +ext/posix/errno.la: $(ext_posix_errno_la_OBJECTS) $(ext_posix_errno_la_DEPENDENCIES) $(EXTRA_ext_posix_errno_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_errno_la_LINK) $(ext_posix_errno_la_OBJECTS) $(ext_posix_errno_la_LIBADD) $(LIBS) +ext/posix/fcntl.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) + +ext/posix/fcntl.la: $(ext_posix_fcntl_la_OBJECTS) $(ext_posix_fcntl_la_DEPENDENCIES) $(EXTRA_ext_posix_fcntl_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_fcntl_la_LINK) $(ext_posix_fcntl_la_OBJECTS) $(ext_posix_fcntl_la_LIBADD) $(LIBS) +ext/posix/fnmatch.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) + +ext/posix/fnmatch.la: $(ext_posix_fnmatch_la_OBJECTS) $(ext_posix_fnmatch_la_DEPENDENCIES) $(EXTRA_ext_posix_fnmatch_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_fnmatch_la_LINK) $(ext_posix_fnmatch_la_OBJECTS) $(ext_posix_fnmatch_la_LIBADD) $(LIBS) +ext/posix/getopt.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) + +ext/posix/getopt.la: $(ext_posix_getopt_la_OBJECTS) $(ext_posix_getopt_la_DEPENDENCIES) $(EXTRA_ext_posix_getopt_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_getopt_la_LINK) $(ext_posix_getopt_la_OBJECTS) $(ext_posix_getopt_la_LIBADD) $(LIBS) +ext/posix/glob.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) + +ext/posix/glob.la: $(ext_posix_glob_la_OBJECTS) $(ext_posix_glob_la_DEPENDENCIES) $(EXTRA_ext_posix_glob_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_glob_la_LINK) $(ext_posix_glob_la_OBJECTS) $(ext_posix_glob_la_LIBADD) $(LIBS) +ext/posix/grp.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) + +ext/posix/grp.la: $(ext_posix_grp_la_OBJECTS) $(ext_posix_grp_la_DEPENDENCIES) $(EXTRA_ext_posix_grp_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_grp_la_LINK) $(ext_posix_grp_la_OBJECTS) $(ext_posix_grp_la_LIBADD) $(LIBS) +ext/posix/libgen.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) + +ext/posix/libgen.la: $(ext_posix_libgen_la_OBJECTS) $(ext_posix_libgen_la_DEPENDENCIES) $(EXTRA_ext_posix_libgen_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_libgen_la_LINK) $(ext_posix_libgen_la_OBJECTS) $(ext_posix_libgen_la_LIBADD) $(LIBS) +ext/posix/poll.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) + +ext/posix/poll.la: $(ext_posix_poll_la_OBJECTS) $(ext_posix_poll_la_DEPENDENCIES) $(EXTRA_ext_posix_poll_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_poll_la_LINK) $(ext_posix_poll_la_OBJECTS) $(ext_posix_poll_la_LIBADD) $(LIBS) +ext/posix/posix.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) +ext/posix/pwd.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) +ext/posix/sched.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) +ext/posix/signal.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) +ext/posix/stdio.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) +ext/posix/stdlib.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) +ext/posix/sys/$(am__dirstamp): + @$(MKDIR_P) ext/posix/sys + @: > ext/posix/sys/$(am__dirstamp) +ext/posix/sys/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) ext/posix/sys/$(DEPDIR) + @: > ext/posix/sys/$(DEPDIR)/$(am__dirstamp) +ext/posix/sys/msg.lo: ext/posix/sys/$(am__dirstamp) \ + ext/posix/sys/$(DEPDIR)/$(am__dirstamp) +ext/posix/sys/resource.lo: ext/posix/sys/$(am__dirstamp) \ + ext/posix/sys/$(DEPDIR)/$(am__dirstamp) +ext/posix/sys/socket.lo: ext/posix/sys/$(am__dirstamp) \ + ext/posix/sys/$(DEPDIR)/$(am__dirstamp) +ext/posix/sys/stat.lo: ext/posix/sys/$(am__dirstamp) \ + ext/posix/sys/$(DEPDIR)/$(am__dirstamp) +ext/posix/sys/statvfs.lo: ext/posix/sys/$(am__dirstamp) \ + ext/posix/sys/$(DEPDIR)/$(am__dirstamp) +ext/posix/sys/time.lo: ext/posix/sys/$(am__dirstamp) \ + ext/posix/sys/$(DEPDIR)/$(am__dirstamp) +ext/posix/sys/times.lo: ext/posix/sys/$(am__dirstamp) \ + ext/posix/sys/$(DEPDIR)/$(am__dirstamp) +ext/posix/sys/utsname.lo: ext/posix/sys/$(am__dirstamp) \ + ext/posix/sys/$(DEPDIR)/$(am__dirstamp) +ext/posix/sys/wait.lo: ext/posix/sys/$(am__dirstamp) \ + ext/posix/sys/$(DEPDIR)/$(am__dirstamp) +ext/posix/syslog.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) +ext/posix/termio.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) +ext/posix/time.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) +ext/posix/unistd.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) +ext/posix/utime.lo: ext/posix/$(am__dirstamp) \ + ext/posix/$(DEPDIR)/$(am__dirstamp) + +ext/posix/posix.la: $(ext_posix_posix_la_OBJECTS) $(ext_posix_posix_la_DEPENDENCIES) $(EXTRA_ext_posix_posix_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_posix_la_LINK) -rpath $(luaexecdir) $(ext_posix_posix_la_OBJECTS) $(ext_posix_posix_la_LIBADD) $(LIBS) + +ext/posix/pwd.la: $(ext_posix_pwd_la_OBJECTS) $(ext_posix_pwd_la_DEPENDENCIES) $(EXTRA_ext_posix_pwd_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_pwd_la_LINK) $(ext_posix_pwd_la_OBJECTS) $(ext_posix_pwd_la_LIBADD) $(LIBS) + +ext/posix/sched.la: $(ext_posix_sched_la_OBJECTS) $(ext_posix_sched_la_DEPENDENCIES) $(EXTRA_ext_posix_sched_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_sched_la_LINK) $(ext_posix_sched_la_OBJECTS) $(ext_posix_sched_la_LIBADD) $(LIBS) + +ext/posix/signal.la: $(ext_posix_signal_la_OBJECTS) $(ext_posix_signal_la_DEPENDENCIES) $(EXTRA_ext_posix_signal_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_signal_la_LINK) $(ext_posix_signal_la_OBJECTS) $(ext_posix_signal_la_LIBADD) $(LIBS) + +ext/posix/stdio.la: $(ext_posix_stdio_la_OBJECTS) $(ext_posix_stdio_la_DEPENDENCIES) $(EXTRA_ext_posix_stdio_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_stdio_la_LINK) $(ext_posix_stdio_la_OBJECTS) $(ext_posix_stdio_la_LIBADD) $(LIBS) + +ext/posix/stdlib.la: $(ext_posix_stdlib_la_OBJECTS) $(ext_posix_stdlib_la_DEPENDENCIES) $(EXTRA_ext_posix_stdlib_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_stdlib_la_LINK) $(ext_posix_stdlib_la_OBJECTS) $(ext_posix_stdlib_la_LIBADD) $(LIBS) + +ext/posix/sys/msg.la: $(ext_posix_sys_msg_la_OBJECTS) $(ext_posix_sys_msg_la_DEPENDENCIES) $(EXTRA_ext_posix_sys_msg_la_DEPENDENCIES) ext/posix/sys/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_sys_msg_la_LINK) $(ext_posix_sys_msg_la_OBJECTS) $(ext_posix_sys_msg_la_LIBADD) $(LIBS) + +ext/posix/sys/resource.la: $(ext_posix_sys_resource_la_OBJECTS) $(ext_posix_sys_resource_la_DEPENDENCIES) $(EXTRA_ext_posix_sys_resource_la_DEPENDENCIES) ext/posix/sys/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_sys_resource_la_LINK) $(ext_posix_sys_resource_la_OBJECTS) $(ext_posix_sys_resource_la_LIBADD) $(LIBS) + +ext/posix/sys/socket.la: $(ext_posix_sys_socket_la_OBJECTS) $(ext_posix_sys_socket_la_DEPENDENCIES) $(EXTRA_ext_posix_sys_socket_la_DEPENDENCIES) ext/posix/sys/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_sys_socket_la_LINK) $(ext_posix_sys_socket_la_OBJECTS) $(ext_posix_sys_socket_la_LIBADD) $(LIBS) + +ext/posix/sys/stat.la: $(ext_posix_sys_stat_la_OBJECTS) $(ext_posix_sys_stat_la_DEPENDENCIES) $(EXTRA_ext_posix_sys_stat_la_DEPENDENCIES) ext/posix/sys/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_sys_stat_la_LINK) $(ext_posix_sys_stat_la_OBJECTS) $(ext_posix_sys_stat_la_LIBADD) $(LIBS) + +ext/posix/sys/statvfs.la: $(ext_posix_sys_statvfs_la_OBJECTS) $(ext_posix_sys_statvfs_la_DEPENDENCIES) $(EXTRA_ext_posix_sys_statvfs_la_DEPENDENCIES) ext/posix/sys/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_sys_statvfs_la_LINK) $(ext_posix_sys_statvfs_la_OBJECTS) $(ext_posix_sys_statvfs_la_LIBADD) $(LIBS) + +ext/posix/sys/time.la: $(ext_posix_sys_time_la_OBJECTS) $(ext_posix_sys_time_la_DEPENDENCIES) $(EXTRA_ext_posix_sys_time_la_DEPENDENCIES) ext/posix/sys/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_sys_time_la_LINK) $(ext_posix_sys_time_la_OBJECTS) $(ext_posix_sys_time_la_LIBADD) $(LIBS) + +ext/posix/sys/times.la: $(ext_posix_sys_times_la_OBJECTS) $(ext_posix_sys_times_la_DEPENDENCIES) $(EXTRA_ext_posix_sys_times_la_DEPENDENCIES) ext/posix/sys/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_sys_times_la_LINK) $(ext_posix_sys_times_la_OBJECTS) $(ext_posix_sys_times_la_LIBADD) $(LIBS) + +ext/posix/sys/utsname.la: $(ext_posix_sys_utsname_la_OBJECTS) $(ext_posix_sys_utsname_la_DEPENDENCIES) $(EXTRA_ext_posix_sys_utsname_la_DEPENDENCIES) ext/posix/sys/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_sys_utsname_la_LINK) $(ext_posix_sys_utsname_la_OBJECTS) $(ext_posix_sys_utsname_la_LIBADD) $(LIBS) + +ext/posix/sys/wait.la: $(ext_posix_sys_wait_la_OBJECTS) $(ext_posix_sys_wait_la_DEPENDENCIES) $(EXTRA_ext_posix_sys_wait_la_DEPENDENCIES) ext/posix/sys/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_sys_wait_la_LINK) $(ext_posix_sys_wait_la_OBJECTS) $(ext_posix_sys_wait_la_LIBADD) $(LIBS) + +ext/posix/syslog.la: $(ext_posix_syslog_la_OBJECTS) $(ext_posix_syslog_la_DEPENDENCIES) $(EXTRA_ext_posix_syslog_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_syslog_la_LINK) $(ext_posix_syslog_la_OBJECTS) $(ext_posix_syslog_la_LIBADD) $(LIBS) + +ext/posix/termio.la: $(ext_posix_termio_la_OBJECTS) $(ext_posix_termio_la_DEPENDENCIES) $(EXTRA_ext_posix_termio_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_termio_la_LINK) $(ext_posix_termio_la_OBJECTS) $(ext_posix_termio_la_LIBADD) $(LIBS) + +ext/posix/time.la: $(ext_posix_time_la_OBJECTS) $(ext_posix_time_la_DEPENDENCIES) $(EXTRA_ext_posix_time_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_time_la_LINK) $(ext_posix_time_la_OBJECTS) $(ext_posix_time_la_LIBADD) $(LIBS) + +ext/posix/unistd.la: $(ext_posix_unistd_la_OBJECTS) $(ext_posix_unistd_la_DEPENDENCIES) $(EXTRA_ext_posix_unistd_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_unistd_la_LINK) $(ext_posix_unistd_la_OBJECTS) $(ext_posix_unistd_la_LIBADD) $(LIBS) + +ext/posix/utime.la: $(ext_posix_utime_la_OBJECTS) $(ext_posix_utime_la_DEPENDENCIES) $(EXTRA_ext_posix_utime_la_DEPENDENCIES) ext/posix/$(am__dirstamp) + $(AM_V_CCLD)$(ext_posix_utime_la_LINK) $(ext_posix_utime_la_OBJECTS) $(ext_posix_utime_la_LIBADD) $(LIBS) +install-binSCRIPTS: $(bin_SCRIPTS) + @$(NORMAL_INSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n' \ + -e 'h;s|.*|.|' \ + -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) { files[d] = files[d] " " $$1; \ + if (++n[d] == $(am__install_max)) { \ + print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ + else { print "f", d "/" $$4, $$1 } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 's,.*/,,;$(transform)'`; \ + dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) +install-dist_binSCRIPTS: $(dist_bin_SCRIPTS) + @$(NORMAL_INSTALL) + @list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n' \ + -e 'h;s|.*|.|' \ + -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) { files[d] = files[d] " " $$1; \ + if (++n[d] == $(am__install_max)) { \ + print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ + else { print "f", d "/" $$4, $$1 } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-dist_binSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(dist_bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 's,.*/,,;$(transform)'`; \ + dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f ext/posix/*.$(OBJEXT) + -rm -f ext/posix/*.lo + -rm -f ext/posix/curses/*.$(OBJEXT) + -rm -f ext/posix/curses/*.lo + -rm -f ext/posix/sys/*.$(OBJEXT) + -rm -f ext/posix/sys/*.lo + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/ctype.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/curses.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/dirent.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/errno.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/fcntl.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/fnmatch.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/getopt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/glob.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/grp.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/libgen.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/poll.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/posix.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/pwd.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/sched.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/signal.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/stdio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/stdlib.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/syslog.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/termio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/time.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/unistd.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/$(DEPDIR)/utime.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/curses/$(DEPDIR)/chstr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/curses/$(DEPDIR)/window.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/sys/$(DEPDIR)/msg.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/sys/$(DEPDIR)/resource.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/sys/$(DEPDIR)/socket.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/sys/$(DEPDIR)/stat.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/sys/$(DEPDIR)/statvfs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/sys/$(DEPDIR)/time.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/sys/$(DEPDIR)/times.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/sys/$(DEPDIR)/utsname.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@ext/posix/sys/$(DEPDIR)/wait.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + -rm -rf ext/posix/.libs ext/posix/_libs + -rm -rf ext/posix/curses/.libs ext/posix/curses/_libs + -rm -rf ext/posix/sys/.libs ext/posix/sys/_libs + +distclean-libtool: + -rm -f libtool config.lt +install-dist_classesDATA: $(dist_classes_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_classes_DATA)'; test -n "$(classesdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(classesdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(classesdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(classesdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(classesdir)" || exit $$?; \ + done + +uninstall-dist_classesDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_classes_DATA)'; test -n "$(classesdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(classesdir)'; $(am__uninstall_files_from_dir) +install-dist_dataDATA: $(dist_data_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_data_DATA)'; test -n "$(datadir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(datadir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(datadir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(datadir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(datadir)" || exit $$?; \ + done + +uninstall-dist_dataDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_data_DATA)'; test -n "$(datadir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(datadir)'; $(am__uninstall_files_from_dir) +install-dist_docDATA: $(dist_doc_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ + done + +uninstall-dist_docDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) +install-dist_examplesDATA: $(dist_examples_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_examples_DATA)'; test -n "$(examplesdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(examplesdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(examplesdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(examplesdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(examplesdir)" || exit $$?; \ + done + +uninstall-dist_examplesDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_examples_DATA)'; test -n "$(examplesdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(examplesdir)'; $(am__uninstall_files_from_dir) +install-dist_luaDATA: $(dist_lua_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_lua_DATA)'; test -n "$(luadir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(luadir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(luadir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(luadir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(luadir)" || exit $$?; \ + done + +uninstall-dist_luaDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_lua_DATA)'; test -n "$(luadir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(luadir)'; $(am__uninstall_files_from_dir) +install-dist_luaposixDATA: $(dist_luaposix_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_luaposix_DATA)'; test -n "$(luaposixdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(luaposixdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(luaposixdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(luaposixdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(luaposixdir)" || exit $$?; \ + done + +uninstall-dist_luaposixDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_luaposix_DATA)'; test -n "$(luaposixdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(luaposixdir)'; $(am__uninstall_files_from_dir) +install-dist_modulesDATA: $(dist_modules_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_modules_DATA)'; test -n "$(modulesdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(modulesdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(modulesdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(modulesdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(modulesdir)" || exit $$?; \ + done + +uninstall-dist_modulesDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_modules_DATA)'; test -n "$(modulesdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(modulesdir)'; $(am__uninstall_files_from_dir) +install-docDATA: $(doc_DATA) + @$(NORMAL_INSTALL) + @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ + done + +uninstall-docDATA: + @$(NORMAL_UNINSTALL) + @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile $(LTLIBRARIES) $(SCRIPTS) $(DATA) config.h +installdirs: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(luaexecdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(classesdir)" "$(DESTDIR)$(datadir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(examplesdir)" "$(DESTDIR)$(luadir)" "$(DESTDIR)$(luaposixdir)" "$(DESTDIR)$(modulesdir)" "$(DESTDIR)$(docdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f ext/posix/$(DEPDIR)/$(am__dirstamp) + -rm -f ext/posix/$(am__dirstamp) + -rm -f ext/posix/curses/$(DEPDIR)/$(am__dirstamp) + -rm -f ext/posix/curses/$(am__dirstamp) + -rm -f ext/posix/sys/$(DEPDIR)/$(am__dirstamp) + -rm -f ext/posix/sys/$(am__dirstamp) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool clean-local \ + clean-luaexecLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf ext/posix/$(DEPDIR) ext/posix/curses/$(DEPDIR) ext/posix/sys/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-dist_classesDATA install-dist_dataDATA \ + install-dist_docDATA install-dist_examplesDATA \ + install-dist_luaDATA install-dist_luaposixDATA \ + install-dist_modulesDATA install-docDATA + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binSCRIPTS install-dist_binSCRIPTS \ + install-libLTLIBRARIES install-luaexecLTLIBRARIES + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: installcheck-local + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf ext/posix/$(DEPDIR) ext/posix/curses/$(DEPDIR) ext/posix/sys/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binSCRIPTS uninstall-dist_binSCRIPTS \ + uninstall-dist_classesDATA uninstall-dist_dataDATA \ + uninstall-dist_docDATA uninstall-dist_examplesDATA \ + uninstall-dist_luaDATA uninstall-dist_luaposixDATA \ + uninstall-dist_modulesDATA uninstall-docDATA \ + uninstall-libLTLIBRARIES uninstall-luaexecLTLIBRARIES + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) uninstall-hook +.MAKE: all check-am install-am install-exec-am install-strip \ + uninstall-am + +.PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-am \ + check-local clean clean-cscope clean-generic \ + clean-libLTLIBRARIES clean-libtool clean-local \ + clean-luaexecLTLIBRARIES cscope cscopelist-am ctags ctags-am \ + dist dist-all dist-bzip2 dist-gzip dist-lzip dist-shar \ + dist-tarZ dist-xz dist-zip distcheck distclean \ + distclean-compile distclean-generic distclean-hdr \ + distclean-libtool distclean-tags distcleancheck distdir \ + distuninstallcheck dvi dvi-am html html-am info info-am \ + install install-am install-binSCRIPTS install-data \ + install-data-am install-dist_binSCRIPTS \ + install-dist_classesDATA install-dist_dataDATA \ + install-dist_docDATA install-dist_examplesDATA \ + install-dist_luaDATA install-dist_luaposixDATA \ + install-dist_modulesDATA install-docDATA install-dvi \ + install-dvi-am install-exec install-exec-am install-exec-hook \ + install-html install-html-am install-info install-info-am \ + install-libLTLIBRARIES install-luaexecLTLIBRARIES install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installcheck-local \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ + uninstall-am uninstall-binSCRIPTS uninstall-dist_binSCRIPTS \ + uninstall-dist_classesDATA uninstall-dist_dataDATA \ + uninstall-dist_docDATA uninstall-dist_examplesDATA \ + uninstall-dist_luaDATA uninstall-dist_luaposixDATA \ + uninstall-dist_modulesDATA uninstall-docDATA uninstall-hook \ + uninstall-libLTLIBRARIES uninstall-luaexecLTLIBRARIES + +.PRECIOUS: Makefile + + +LUA_PATH ?= ; +LUA_CPATH ?= ; +specl-check-local: $(specl_SPECS) + $(CHECK_ENV) $(SPECL_ENV) $(SPECL) $(SPECL_OPTS) $(specl_SPECS) +specl-installcheck-local: $(specl_SPECS) + $(INSTALLCHECK_ENV) $(SPECL_ENV) $(SPECL) $(SPECL_OPTS) $(specl_SPECS) + +clean-local: + rm -f $(posix_submodules) + +$(allhtml): $(EXTRA_ext_posix_posix_la_SOURCES) $(ext_posix_posix_la_SOURCES) + test -d $(builddir)/doc || mkdir $(builddir)/doc +@HAVE_LDOC_TRUE@ $(LDOC) -c build-aux/config.ld -d $(abs_srcdir)/doc . +@HAVE_LDOC_FALSE@ $(MKDIR_P) doc +@HAVE_LDOC_FALSE@ touch doc/index.html doc/ldoc.css + +doc: $(allhtml) + +$(luarocks_config): Makefile.am + @test -d build-aux || mkdir build-aux + $(AM_V_GEN){ \ + $(set_LUA_BINDIR); \ + echo 'rocks_trees = { "$(abs_srcdir)/luarocks" }'; \ + echo 'variables = {'; \ + echo ' LUA = "$(LUA)",'; \ + echo ' LUA_BINDIR = "'$$LUA_BINDIR'",'; \ + echo ' LUA_INCDIR = "'$(LUA_INCDIR)'",'; \ + echo ' LUA_LIBDIR = "'$(LUA_LIBDIR)'",'; \ + echo '}'; \ + } > '$@' + +$(package_rockspec): $(ROCKSPECS_DEPS) + $(AM_V_at)rm -f '$@' 2>/dev/null || : + $(AM_V_GEN)test -f '$@' || \ + $(MKROCKSPECS) $(mkrockspecs_args) \ + $(PACKAGE) $(VERSION) $(rockspec_revision) > '$@' + $(AM_V_at)$(LUAROCKS) lint '$@' + +$(scm_rockspec): $(ROCKSPECS_DEPS) + $(AM_V_at)rm '$@' 2>/dev/null || : + $(AM_V_GEN)test -f '$@' || \ + $(MKROCKSPECS) $(mkrockspecs_args) \ + $(PACKAGE) git 1 > '$@' + $(AM_V_at)$(LUAROCKS) lint '$@' + +.PHONY: rockspecs +rockspecs: + $(AM_V_at)rm -f *.rockspec + $(AM_V_at)$(MAKE) $(package_rockspec) $(scm_rockspec) + +check-local: $(check_local) + +installcheck-local: $(installcheck_local) + +install-exec-hook: $(install_exec_hooks) + +# Neither Lua itself, nor LuaRocks can use .la files, and LuaRocks +# actually moves such files aside anyway, so we just remove them from +# the installation directory. +remove-luaexec-lafiles: + @for la in $(luaexec_LTLIBRARIES); do \ + f=`echo "$$la" |sed 's|^.*/||'`; \ + echo rm -f $(DESTDIR)$(luaexecdir)/$$f; \ + rm -f $(DESTDIR)$(luaexecdir)/$$f; \ + done + +uninstall-hook: $(uninstall_hooks) + +# We removed the .la files from luaexecdir, so the standard uninstall, +# with libtool --mode=uninstall, can't find everything anymore. +uninstall-luaexec-modules: + @for la in $(luaexec_LTLIBRARIES); do \ + base=`echo "$$la" \ + |sed 's|^.*/\(.*\)\.la|\1|'`; \ + echo rm -f $(DESTDIR)$(luaexecdir)/$$base.so; \ + rm -f $(DESTDIR)$(luaexecdir)/$$base.so; \ + done + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..0c360c2 --- /dev/null +++ b/NEWS @@ -0,0 +1,658 @@ +# luaposix NEWS - User visible changes + +## Noteworthy changes in release 33.3.1 (2015-03-01) [stable] + +### Incompatible Changes + + - The briefly lived `posix.system` API has been removed. It was renamed + to `posix.spawn` shortly after introduction, and can still be accessed + by the new symbol name. + +### Bugs Fixed + + - `local posix = require "posix"` works again, fixing the regression + introduced in the last release. The automated Travis checks have been + improved to catch this sort of bug in future. + + +## Noteworthy changes in release 33.3.0 (2015-02-28) [stable] + +### New Features + + - Improved documentation of `sockaddr` tables for `posix.sys.socket` calls. + + - New `posix.sys.socket.getsockname` binding. + + - Remove the `posix.bit32` library, and use Lua’s built-in `bit32` library. + + - Can now be linked against NetBSD curses, albeit with several functions + not implemented by that library returning a "not implemented" error as + a consequence. + + - New functions `popen`, `popen_pipeline` and `pclose` mimic the POSIX + functions of the same name while allowing tasks to be Lua functions. + + - `fdopen` has been re-added, working on all supported Lua versions. + + - `execx` allows a Lua function or command to be exec’d; `spawn` is now + implemented in terms of it. + +### Incompatible Changes + + - The ncurses-only `KEY_MOUSE` definition has been removed from + `posix.curses`. + +### Bugs Fixed + + - `posix.sys.resource` only provides RLIM_SAVED_CUR and RLIM_SAVED_MAX if + they are defined by the C library (which FreeBSD 10 does not). + + - `posix.dirent.dir` and `posix.dirent.files` now raise a Lua `error()` + when unable to open the path argument, for orthogonality with `io.lines`. + + - Workaround for manifest key clash between `posix.so` and `posix.lua` in + LuaRocks. + + +## Noteworthy changes in release 33.2.1 (2015-01-04) [stable] + +### Bugs Fixed + + - Install posix.curses.html documentation file correctly. + + +## Noteworthy changes in release 33.2.0 (2015-01-03) [stable] + +### New Features + + - QNX support. + +### Bugs Fixed + + - `posix.time.gmtime` and `posix.time.localtime` specifications now + work correctly in January too! + + +## Noteworthy changes in release 33.1.0 (2014-12-19) [stable] + +### New Features + + - New `posix.bit32` module with band, bnot and bor functions that can be + used from any supported Lua release, without worrying about loading an + external bit operations library. + + - Preliminary Lua 5.3.0 compatibility. + +### Bugs Fixed + + - No more 'Bad Hints' errors from `posix.sys.socket.getaddrinfo` on many + hosts. + + - `stdlib.setenv` accepts a 3rd argument again. + + +## Noteworthy changes in release 33.0.0 (2014-11-04) [stable] + +### New Features + + - The curses library is fully integrated into luaposix, including reasonably + comprehensive LDoc documentation (certainly much better than the single + wooly web-page in previous releases). For backwards compatibility, all + APIs are re-exported from the `curses` module. + + - Most constants available through luaposix are now listed in the LDocs of + the submodule that defines them. + + - For backwards compatibility, everything is still lumped together in the + `posix.???` namespace, but, now raw APIs have been reorganised according to + the POSIX header files they belong to: + + ```lua + local posix = require "posix" + local fcntl = require "posix.fcntl" + local unistd = require "posix.unistd" + + local fd = fcntl.open ("x", + bit32.bor (posix.O_WRONLY, posix.O_CREAT), "u=rw") + unistd.write (fd, "Hello, World!\n") + unistd.close (fd) + ``` + + This makes the documentation easier to navigate, and for a better mapping + between luaposix APIs and the C functions they wrap, so translating from + C is now easier than ever. + + - Each of the newly separated submodules is self-contained, and can be copied + to another project for compiling and/or loading in a custom Lua runtime. If + you want to make use of this, in addition to the source for the modules you + copy, you'll also need at least the files `ext/posix/_helpers.c` and + `ext/include/lua52compat.c`, and also `ext/include/strlcat.c` for one or + two of them. + + - Where submodule calls return a table representation of a similar C struct + from a POSIX API, the Lua return tables have an appropriate `_type` field + metatable entry compatible with lua-stdlib `std.object.type`. + + - `posix.signal.signal` now accepts the constants `posix.signal.SIG_DFL` or + `posix.signal.SIG_IGN` in place of the strings "SIG_DFL" and "SIG_IGN". + + - The submodule bindings `posix.time.gmtime`, `posix.time.localtime`, + `posix.time.mktime`, `posix.time.strftime` and `posix.time.strptime` now + accept or create PosixTm tables with 1-to-1 field name mappings with the + POSIX `struct tm`. The old APIs with custom field names is still available + as `posix.gmtime`, `posix.localtime`, `posix.mktime`, `posix.strftime` and + `posix.strptime`. + + - Similarly, `posix.time.nanosleep` now takes and returns a PosixTimespec + table. The old API is still available as `posix.nanosleep`. + + - Where supported by the underlying system, `posix.time.clock_getres` and + `posix.time.clock_gettime` now require a constant inte argument (newly + defined in the `posix.time` submodule), and returns a PosixTimespec table. + The old APIs are still available as `posix.clock_getres` and + `posix.clock_gettime`. + + - Add `posix.unistd.gethostid`. The old `posix.hostid` API is still available + as an alias. + + - Add group APIs from grp.h: `posix.grp.endgrent`, `posix.grp.getgrent`, + `posix.grp.getgrgid`, `posix.grp.getgrnam` and `posix.grp.setgrent`. + Consequently, `posix.getgroup` is now reimplemented in Lua over the POSIX + APIs. + + - `posix.getgroup` defaults to current effective group when called with no + arguments, for consistency with `posix.getpasswd` API. + + - Add pwd APIs from pwd.h: `posix.pwd.endpwent`, `posix.grp.getpwent`, + `posix.pwd.getpwnam`, `posix.pwd.getpwuid` and `posix.pwd.setpwent`. + Consequently, `posix.getpasswd` is now reimplemented in Lua over the POSIX + APIs. + + - Add missing constants from sys/resource.h: + `posix.sys.resource.RLIM_INFINITY`, `posix.sys.resource.RLIM_SAVED_CUR`, + `posix.sys.resource.RLIM_SAVED_MAX`, `posix.sys.resource.RLIMIT_CORE`, + `posix.sys.resource.RLIMIT_CPU`, `posix.sys.resource.RLIMIT_DATA`, + `posix.sys.resource.RLIMIT_FSIZE`, `posix.sys.resource.RLIMIT_NOFILE`, + `posix.sys.resource.RLIMIT_STACK`, `posix.sys.resource.RLIMIT_AS`. + + - Add missing APIs from unistd.h: `posix.unistd.getegid`, + `posix.unistd.geteuid`, `posix.unistd.getgid`, `posix.unistd.getuid`, + `posix.unistd.getpgrp`, `posix.unistd.getpid`, `posix.unistd.getppid`. + Consequently, `posix.getpid` is now reimplemented in Lua over the POSIX + APIs. + + - Add missing constants from signal.h; `posix.signal.SIG_DFL` and + `posix.signal.SIG_IGN'. + + - Add missing APIs from sys/stat.h: `posix.sys.stat.S_ISBLK`, + `posix.sys.stat.S_ISCHR`, `posix.sys.stat.S_ISDIR`, + `posix.sys.stat.S_ISFIFO`, `posix.sys.stat.S_ISLNK`, + `posix.sys.stat.S_ISREG`, `posix.sys.stat.S_ISSOCK`. + + - Add missing constants from sys/stat.h: `posix.sys.stat.S_IFMT`, + `posix.sys.stat.S_IFBLK`, `posix.sys.stat.S_IFCHR`, + `posix.sys.stat.S_IFDIR`, `posix.sys.stat.S_IFIFO`, + `posix.sys.stat.S_IFLNK`, `posix.sys.stat.S_IFREG`, + `posix.sys.stat.S_IRWXU`, `posix.sys.stat.S_IRUSR`, + `posix.sys.stat.S_IWUSR`, `posix.sys.stat.S_IXUSR`, + `posix.sys.stat.S_IRWXG`, `posix.sys.stat.S_IRGRP`, + `posix.sys.stat.S_IWGRP`, `posix.sys.stat.S_IXGRP`, + `posix.sys.stat.S_IRWXO`, `posix.sys.stat.S_IROTH`, + `posix.sys.stat.S_IWOTH`, `posix.sys.stat.S_IXOTH`, + `posix.sys.stat.S_ISGID`, `posix.sys.stat.S_ISUID`. + + - Add missing constants from syslog.h: `posix.syslog.LOG_CONS`, + `posix.syslog.LOG_NDELAY` and `posix.syslog.LOG_PID`. + + - Add missing API from syslog.h: `posix.syslog.LOG_MASK`. Use this to + convert syslog priority constants into mask bits suitable for bitwise + ORing as the argument to `posix.syslog.setlogmask`. + + - Add missing constants from time.h: `posix.time.CLOCK_MONOTONIC`, + `posix.time.CLOCK_PROCESS_CPUTIME_ID`, `posix.time.CLOCK_REALTIME` and + `posix.time.CLOCK_THREAD_CPUTIME_ID`. + + - New `posix.unistd.exec` and `posix.unistd.execp` require a table of + arguments, with [0] defaulting to the command name. The old string + tuple passing API is still available as `posix.exec` and `posix.execp`. + + - `posix.util.openpty` has moved to `posix.openpty`. The old API is still + available as an alias. + + - All posix APIs now fully and correctly diagnose extraneous and wrong + type arguments with an error. + + - Add `posix.IPC_NOWAIT`, `posix.MSG_EXCEPT` and `posix.MSG_NOERROR` + constants for message queues. + + - Add `posix.IPPROTO_UDP` for socket programming. + + - Add `posix.AI_NUMERICSERV` for posix.getaddrinfo hints flags. + + - Add `posix.WUNTRACED` for posix.wait flags. + + - Add `curses.A_COLOR` (where supported by the underlying curses library) for + extracting color pair assignments from the results of `curses.window.winch`. + + - Add missing `curses.KEY_F31` constant. + +### Bugs Fixed + + - `posix.fadvise` is now spelled `posix.fcntl.posix_fadvise` and takes a + file descriptor first argument rather than a Lua file handle. The old + misspelled bad argument type version is undocumented but still works. + + - `posix.getpasswd`, `posix.getpid`, `posix.pathconf`, `posix.stat`, + `posix.statvfs`, `posix.sysconf` and `posix.times` process a single table + argument with a list of types correctly. + + - `posix.syslog.openlog` now takes the bitwise OR of those constants. The + old string option specified API is still available as `posix.openlog`. + + - `posix.syslog.setlogmask` now takes the bitwise OR of bits returned by + passing priority constants to `posix.syslog.LOG_MASK`. The old API will + continue to be available as `posix.setlogmask`. + + - `posix.readlink` is much more robust, and reports errors accurately. + + - configured installation installs `posix.so` into the lua cpath directory + correctly. + + - fixed a long-standing bug where the stdio buffers were not restored after + some posix.fcntl() examples, resulting in the `make check` output being + truncated -- often before terminal colors were returned to normal. + + +## Noteworthy changes in release 32 (2014-05-30) [stable] + +### New Features + + - Support for posix.socketpair call and posix.AF_UNIX constant. + + - Previously undocumented spawn, pipeline, pipeline_iterator, pipeline_slurp, + euidaccess, timeradd, timercmp and timersub have been moved from the posix + table, which is reserved for strictly POSIX APIs to the posix.sys subtable. + The sys submodule automatically loads on first reference, so no need to + require it manually if you already have the main posix module loaded. + + - posix api documentation is separated into groups for better discovery. + +### Bugs Fixed + + - Builds correctly on hosts with no IPV6 capability. + + - Small improvements in organisation of generated html docs. + + - posix.openpty doesn't crash. + + - configure now detects Lua correctly with busybox grep. + + - Many fine portability fixes from latest gnulib. + + - Missing docs for accept, bind, connect, getaddrinfo, listen, recv, + recvfrom, send, sendto, setsockopt, shutdown, socket and socketpair apis + is now provided. + + - Missng docs for tcdrain, tcflow, tcflush, tcgetattr, tcsendbreak and + tcsetattr terminal apis are now provided. + + - Docs for apis implemented in Lua are now shown correctly. + + +## Noteworthy changes in release 31 (2013-09-09) [stable] + +### New Features + + - Missing termios cc flags are now available. + +### Bugs Fixed + + - posix.tcgetattr and posix.tcsetattr no save and restore all flags, + regardless of whether they are local extensions to POSIX. + + +## Noteworthy changes in release 30 (2013-08-29) [stable] + +### New Features + + - Support for file locks with fcntl() using F_SETLK, F_SETLKW, F_GETLK, + F_RDLCK, F_WRLCK and F_UNLCK. + + - Preliminary support for GNU Hurd, and OpenBSD. + +### Bugs Fixed + + - posix.shutdown can actually be called now. + + - Report the correct argument number in posix function error messages. + + - Much reduced compiler warning noise. + + - Many small typos and inconsistencies, see ChangeLog for details. + + +## Noteworthy changes in release 29 (2013-06-28) [stable] + + - This release adds wresize to curses, and sync, fsync, fdatasync, nice, + lseek as well as socket programming functions. Several small improvements + to the documentation were also added. + + - luaposix is compatible with Lua 5.1, Lua 5.2 and luajit 2.0, so the + 5.1 prefix to the release version has become an anachronism and has + been dropped from this release onwards. + +### New Features + + - Move to the Slingshot release system, which (among many other improvements) + fixes release tarballs from github to work with the standard GNU-style: + `./configure, make, make install`. `bootstrap` is still distributed for + those who need to re-bootstrap with a different version of gnulib and/or + slingshot. + + - Much improved former lunit and ad-hoc test scripts to Specl. + + +## Noteworthy changes in release 5.1.28 (2013-03-23) [stable] + + - This release fixes the previously unannounced posix.pipeline_iterator and + posix.pipeline_slurp functions, and adds a test for them. A workaround for + having LUA_INIT_5_2 set has been added to the build system. + + +## Noteworthy changes in release 5.1.27 (2013-03-17) [stable] + + - This release fixes broken Lua 5.1 compatibility in release 5.1.26 + (sorry! And thanks to Nick McVeity for the bug report and patch); renames + posix.system to posix.spawn (the old name is available for backwards + compatibility), generalizing it to take a shell command, file and + arguments, or Lua function; and adds posix.pipeline, which makes it easy + to run a pipeline of processes, each a shell command, program, or Lua + function. + + +## Noteworthy changes in release 5.1.26 (2013-03-04) [stable] + + - This release adds killpg, realpath and openpty, adds a flags parameter to + signal, and improves some documentation. + + +## Noteworthy changes in release 5.1.25 (2013-02-20) [stable] + + - This release adds support for message queues and UNIX 98 pseudoterminals + (thanks very much to the respective contributors), and allows argv[0] to + be set in exec calls. + + +## Noteworthy changes in release 5.1.24 (2013-02-15) [stable] + + - This release adds isatty and constants STDIN_FILENO, STDOUT_FILENO and + STDERR_FILENO, fixes a bug in readlink, adds a day field to time tables + for compatibility with os.date, and overhauls the build and release system. + + +## Noteworthy changes in release 5.1.23 (2012-10-04) [stable] + + - This release fixes the curses module for Lua 5.2; previously it would not + load with an unknown symbol error. The build process for luarocks has been + made more robust. + + +## Noteworthy changes in release 5.1.22 (2012-09-13) [stable] + + - This release fixes building on Mac OS X and some other OSes which don't + like building empty libraries. Thanks to Robert McLay for the bug report. + + +## Noteworthy changes in release 5.1.21 (2012-09-10) [stable] + + - This release adds comprehensive documentation for the posix module, from + Steve Donovan and Natanael Copa. + + - It makes one small change: rpoll now uses file descriptors, not Lua file + objects (hence, via fileno, it can use both). + + - Perhaps most importantly, it marks a change of maintainer, from + Reuben Thomas to Alexander Nikolaev. Thanks very much to Alexander for + agreeing to take over. Luaposix has garnered considerable interest in + recent months, and more contributors have stepped forwards with patches. + Alexander will help to oversee a maturing API, coordinate ongoing + improvements and additions, and help ensure that luaposix doesn't fall + back into disrepair as it has several times in the past. + + +## Noteworthy changes in release 5.1.20 (2012-06-22) [stable] + +### New Features + + - Improves signal handling. + - Improves the posix.system and creat functions (all thanks to Steve Donovan). + - Adds mkdtemp (thanks, 7hemroc). + - Adds statvfs (thanks to Like Ma). + - improves the tests. + - Adds some code guidelines. + +### Bugs Fixed + + - Fixes a bug in getgroup. + - Fixes some space leaks (thanks, Alexander Nikolaev), + - Copes with sysconf for _PC_PATH_MAX returning -1. + +### Incompatible Changes + + - The API of posix.open has changed to be more like the C version: the file + creation and status flags are now constants in the POSIX namespace. This + enables them to be used outside calls to open, and makes posix.open less + magic. posix.open will now raise an error if no creation flags are given + when O_CREAT is used. + + +## Noteworthy changes in release 5.1.19 (2012-04-10) [stable] + + - This release avoids the use of PATH_MAX, and copes with arbitrarily-long + paths. The implementation of strlcpy is changed to a BSD-licensed + implementation; the previously-used implementation was LGPL-licensed, which + is not MIT-compatible; thanks to Alexander Gladysh for bringing this + problem to my attention. (This was just mis-released as 5.1.18; sorry!) + + +## Noteworthy changes in release 5.1.18 (2012-03-26) [stable] + + - This release implements full Lua 5.2 compatibility; thanks to Enrico Tassi + for poking me to get this done. + + +## Noteworthy changes in release 5.1.17 (2012-02-29) [stable] + + - This release improves support for Lua 5.2; the curses module should now + work fine (the posix module still needs updating). Signal handling has been + improved to make it possible to chain to a C signal handler, and a bug in + resetting the process's signal mask after running a Lua handler has been + fixed. + + +## Noteworthy changes in release 5.1.16 (2012-02-18) [stable] + + - This release includes rewritten fcntl and signals support, and bug fixes + for read, chmod, getgroups and waitpid. curses boolean return values are + now Lua booleans rather than 0 for OK or ERR for not OK. fnmatch, strptime + and mktime are now supported, chmod now supports octal modes, thereâs + much expanded poll support, and some non-POSIX and obsolete features have + been removed. There are more tests and the build system has been improved. + Thanks go to the many contributors to this release. + + +## Noteworthy changes in release 5.1.15 (2011-09-29) [stable] + + - This release adds dup, pipe, pipe2 and more fcntl support (thanks to + Alexander V. Nikolaev and Alexander Gladysh for the patches). Two bugs in + the test code which used incorrect paths and caused only one set of tests + to run have been fixed. + + +## Noteworthy changes in release 5.1.14 (2011-09-19) [stable] + + - This release allows some constants to be case-insensitive in Lua, and fixes + a small build-system bug. + + +## Noteworthy changes in release 5.1.13 (2011-09-17) [stable] + +This release adds a rockspec. + + +## Noteworthy changes in release 5.1.12 (2011-09-09) [stable] + + - This release adds some basic functions such as open, close, read and write, + and integrates the pure Lua module which was previously in Lua stdlib. It + also adds a whole new module, curses, which was previously in the separate + lcurses project (curses is part of the POSIX standard). + +### Incompatible Changes + + - Note that the C part of the POSIX module is now called posix_c.so (or + similar), so if you have an old posix.so (or similar) you should delete it + to avoid clashing with the new posix.lua. + + +## Noteworthy changes in release 5.1.11 (2011-04-27) [stable] + + - Apologies, 5.1.10, released earlier today, had a buffer overflow bug + in the new mkstemp function. 5.1.11, just out, fixes it. + + +## Noteworthy changes in release 5.1.10 (2011-04-27) [stable] + +### This release adds mkstemp, adds some fixes for building on Mac OS X + (thanks to Gary Vaughan), removes some non-POSIX rlimit constants, + guards some functions that were not correctly guarded, so that they + will not be compiled on systems that don't support them, and makes + other minor fixes. + + +## Noteworthy changes in release 5.1.9 (2011-03-24) [stable] + +### New Features + + - support for signals and for getopt. See below for details. + + - Equally, there is still only the barest documentation: to use the various + APIs you have to grep to see if the one you want is there and then read the + C comment which gives the Lua API. If anyone is interested in adding better + documentation, I'd be delighted to hear from them. (My work on luaposix is + purely aimed at getting the support I need for GNU Zile, but as usual I + welcome patches from others. luaposix is still far from complete, so please + send patches for your favourite POSIX APIs!) + + - luaposix 5.1.9 improves compatibility with Darwin/Mac OS X, and adds + various new API bindings, for signals, getgroups, setting errno and + _exit, as well as some slight code cleanup. + + +## Noteworthy changes in release 5.1.8 (2013-03-23) [stable] + +### Bugs Fixed + + - fix bugs for setrlimit and gettimeofday. + - an improvement to test.lua. + - better use of POSIX feature macros to determine what APIs to support. + - removal of the obsolete timezone argument to gettimeofday, + - remove the non-POSIX gecos field of struct passwd + - improvements to the build system + - some code tidy-up, + - removal of Lua 5.0 compatibility + +### New APIs + + - abort, raise, isprint, isgraph, errno and stdio.h constants, and getopt_long. + + +## Noteworthy changes in release 5.1.7 (2013-03-23) [stable] + +A new minor bugfix release of luaposix is out. + +### Bugs Fixed + + - make clock_* functions' argument optional + - fixes posix.version string + + +## Noteworthy changes in release 5.1.6 (2010-08-11) [stable] + + - This release adds time functions: gettimeofday, clock_getres, + clock_gettime, localtime, gmtime, time, strftime. + + +## Noteworthy changes in release 5.1.5 (20??-??-??) [stable] + +The release notes for this release were lost in the mists of thyme. + + +## Noteworthy changes in release 5.1.4 (2008-07-18) [stable] + + - Includes a fix for rpoll() from debian[1] and a patch from openwrt[2] + that adds crypt(). + + +## Noteworthy changes in release 5.1.3 (2013-03-23) [stable] + +No changes. + + +## Noteworthy changes in release 5.1.2 (2008-01-29) [stable] + +### Incompatible changes + + - Please note that this release breakes the API for dup() and exec() + +### New Features + + - dup() now takes and returns lua files rather than file descriptors + (int). + + - exec() uses now execv(3) rather than execvp(3). This means that the + PATH environment variable is no longer used which means that all scripts + currently using exec() without an absolute path will break. If you need + the PATH variable, use the new execp() function. + + - Added openlog(), syslog() and closelog() functions. + + - The openlog(ident, [option], [facility]) function differs from the + recently released luasyslog by giving the user possibility to set + "option". The "option" parameter is a string containing one or more of + the chars: + + ``` + 'c' - LOG_CONS + 'n' - LOG_NDELAY + 'e' - LOG_PERROR + 'p' - LOG_PID + ``` + + It is possible to disable those funcs compile time by setting the + ENABLE_SYSLOG define to 0. + + - fileno() function was added. + + +## Noteworthy changes in release 5.1.1 (2008-01-25) [stable] + + - I have forked lposix. First release includes some patches submitted on + this list. + + This first release is basicly lposix with a cleaned up Makefile + the + patches found here: + + http://lua-users.org/lists/lua-l/2006-10/msg00448.html + http://lua-users.org/lists/lua-l/2007-11/msg00346.html + + - When the promised extened OS library[1] arrives I will most likely + remove the overlapping functions in luaposix. posix specific functions + that does not overlap will still be maintained and added. (e.g dup()) + + - Releases numbered 5.1.x[.y] will work with lua-5.1 series. The 'x' will + add/change features and .y releases will be strict bugfixes (no new + features). + + - I had planned to add syslog functions and fix dup() to handle lua files + (FILE*) rather than file descriptors (int). Now that luasyslog just + released I will have to re-evaluate that. diff --git a/README b/README new file mode 100644 index 0000000..6da3fb2 --- /dev/null +++ b/README @@ -0,0 +1,96 @@ +luaposix +======== + +By the [luaposix project][GitHub] + +[![travis-ci status](https://secure.travis-ci.org/luaposix/luaposix.png?branche=master)](http://travis-ci.org/luaposix/luaposix/builds) +[![Stories in Ready](https://badge.waffle.io/luaposix/luaposix.png?label=ready&title=Ready)](https://waffle.io/luaposix/luaposix) + +luaposix is a POSIX binding, including curses, for [Lua] 5.1, 5.2 and +5.3; like most libraries it simply binds to C APIs on the underlying +system, so it won't work on non-POSIX systems. However, it does try +to detect the level of POSIX conformance of the underlying system and +bind only available APIs. + +luaposix is released under the MIT license, like Lua (see [COPYING]; +it's basically the same as the BSD license). There is no warranty. + +Please report bugs and make suggestions by opening an issue on the +github tracker. + +Installation +------------ + +The simplest way to install luaposix is with [LuaRocks]. To install the +latest release (recommended): + + luarocks install luaposix + +To install current git master (for testing): + + luarocks install https://raw.github.com/luaposix/luaposix/release/luaposix-git-1.rockspec + +To install without LuaRocks, check out the sources from the +[repository][GitHub] and run the following commands: + + cd luaposix + ./bootstrap + ./configure --prefix=INSTALLATION-ROOT-DIRECTORY + make all check install + +Dependencies are listed in the dependencies entry of the file +`rockspec.conf`. You will also need Autoconf and Automake. + +See [INSTALL] for `configure` instructions and `configure --help` +for details of available command-line switches. + +Use +--- + +The library is split into submodules according to the POSIX header file +API declarations. + +HTML documentation can be generated with [LDoc] by running `make doc` +or viewed online at . + +The authoritative online POSIX reference is at +. + +Example code +------------ + +See the example program `tree.lua`, along with the many small +examples in the generated documentation and BDD `specs/*_spec.yaml`. + +For a complete application, see the [GNU Zile]. + +Bugs reports & patches +---------------------- + +Bug reports and patches are most welcome. Please use the github issue +tracker (see URL at top). There is no strict coding style, but please +bear in mind the following points when writing new code: + +0. Follow existing code. There are a lot of useful patterns and + avoided traps there. + +1. 8-character indentation using TABs in C sources; 2-character + indentation using SPACEs in Lua sources. + +2. No non-POSIX APIs; no platform-specific code. When wrapping APIs + introduced in POSIX 2001 or later, add an appropriate #if. If your + platform isn't quite POSIX, you may find a gnulib module to bridge + the gap. If absolutely necessary, use autoconf feature tests. + +3. Thin wrappers: although some existing code contradicts this, wrap + POSIX APIs in the simplest way possible. If necessary, more + convenient wrappers can be added in Lua (posix.lua). + + +[Lua]: http://www.lua.org/ +[GitHub]: https://github.com/luaposix/luaposix +[LuaRocks]: http://www.luarocks.org "Lua package manager" +[LDoc]: https://github.com/stevedonovan/LDoc "Lua documentation generator" +[COPYING]: https://raw.github.com/luaposix/luaposix/release/COPYING +[INSTALL]: https://raw.github.com/luaposix/luaposix/release/INSTALL +[GNU Zile]: http://git.savannah.gnu.org/cgit/zile.git/log/?h=lua "A cut-down Emacs clone" diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..1314b38 --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,1225 @@ +# generated automatically by aclocal 1.15 -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Copyright (C) 2002-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.15' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.15], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.15])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# Copyright (C) 2011-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_AR([ACT-IF-FAIL]) +# ------------------------- +# Try to determine the archiver interface, and trigger the ar-lib wrapper +# if it is needed. If the detection of archiver interface fails, run +# ACT-IF-FAIL (default is to abort configure with a proper error message). +AC_DEFUN([AM_PROG_AR], +[AC_BEFORE([$0], [LT_INIT])dnl +AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl +AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([ar-lib])dnl +AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) +: ${AR=ar} + +AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], + [AC_LANG_PUSH([C]) + am_cv_ar_interface=ar + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], + [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([am_ar_try]) + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + ]) + AC_LANG_POP([C])]) + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + m4_default([$1], + [AC_MSG_ERROR([could not determine $AR interface])]) + ;; +esac +AC_SUBST([AR])dnl +]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2014 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([m4/00gnulib.m4]) +m4_include([m4/ax_lua.m4]) +m4_include([m4/ax_with_curses.m4]) +m4_include([m4/gnulib-common.m4]) +m4_include([m4/gnulib-comp.m4]) +m4_include([m4/libtool.m4]) +m4_include([m4/ltoptions.m4]) +m4_include([m4/ltsugar.m4]) +m4_include([m4/ltversion.m4]) +m4_include([m4/lt~obsolete.m4]) +m4_include([m4/manywarnings.m4]) +m4_include([m4/onceonly.m4]) +m4_include([m4/warnings.m4]) diff --git a/bootstrap b/bootstrap new file mode 100755 index 0000000..0b70e37 --- /dev/null +++ b/bootstrap @@ -0,0 +1,5796 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from build-aux/bootstrap.in +## by inline-source v2014-01-03.01 + +# Bootstrap an Autotooled package from checked-out sources. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Originally written by Paul Eggert. The canonical version of this +# script is maintained as build-aux/bootstrap in gnulib, however, to +# be useful to your project, you should place a copy of it under +# version control in the top-level directory of your project. The +# intent is that all customization can be done with a bootstrap.conf +# file also maintained in your version control; gnulib comes with a +# template build-aux/bootstrap.conf to get you started. + +# Please report bugs or propose patches to bug-gnulib@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Most GNUish projects do not keep all of the generated Autotool +# files under version control, but running all of the right tools +# with the right arguments, in the correct order to regenerate +# all of those files in readiness for configuration and building +# can be surprisingly involved! Many projects have a 'bootstrap' +# script under version control to invoke Autotools and perform +# other assorted book-keeping with version numbers and the like. +# +# This bootstrap script aims to probe the configure.ac and top +# Makefile.am of your project to automatically determine what +# the correct ordering and arguments are and then run the tools for +# you. In order to use it, you can generate an initial standalone +# script with: +# +# gl/build-aux/inline-source gl/build-aux/bootstrap.in > bootstrap +# +# You should then store than script in version control for other +# developers in you project. It will give you instructions about +# how to keep it up to date if the sources change. +# +# See gl/doc/bootstrap.texi for documentation on how to write +# a bootstrap.conf to customize it for your project's +# idiosyncracies. + + +## ================================================================== ## +## ## +## DO NOT EDIT THIS FILE, CUSTOMIZE IT USING A BOOTSTRAP.CONF ## +## ## +## ================================================================== ## + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase denotes values stored in the environment. These +# variables should generally be overridden by the user - however, we do +# set them to 'true' in some parts of this script to prevent them being +# called at the wrong time by other tools that we call ('autoreconf', +# for example). +# +# We also allow 'LIBTOOLIZE', 'M4', 'SHA1SUM' and some others to be +# overridden, and export the result for child processes, but they are +# handled by the function 'func_find_tool' and not defaulted in this +# section. + +: ${ACLOCAL="aclocal"} +: ${AUTOCONF="autoconf"} +: ${AUTOHEADER="autoheader"} +: ${AUTOM4TE="autom4te"} +: ${AUTOHEADER="autoheader"} +: ${AUTOMAKE="automake"} +: ${AUTOPOINT="autopoint"} +: ${AUTORECONF="autoreconf"} +: ${CMP="cmp"} +: ${CONFIG_SHELL="/bin/sh"} +: ${DIFF="diff"} +: ${GIT="git"} +: ${LN_S="ln -s"} +: ${RM="rm"} + +export ACLOCAL +export AUTOCONF +export AUTOHEADER +export AUTOM4TE +export AUTOHEADER +export AUTOMAKE +export AUTOPOINT +export AUTORECONF +export CONFIG_SHELL + + +: ${LUAROCKS="luarocks"} + +export LUAROCKS + + +## -------------- ## +## Configuration. ## +## -------------- ## + +# A newline delimited list of triples of programs (that respond to +# --version), the minimum version numbers required (or just '-' in the +# version field if any version will be sufficient) and homepage URLs +# to help locate missing packages. +buildreq= + +# Name of a file containing instructions on installing missing packages +# required in 'buildreq'. +buildreq_readme=README-hacking + +# These are extracted from AC_INIT in configure.ac, though you can +# override those values in 'bootstrap.conf' if you prefer. +build_aux= +macro_dir= +package= +package_name= +package_version= +package_bugreport= + +# These are extracted from 'gnulib-cache.m4', or else fall-back +# automatically on the gnulib defaults; unless you set the values +# manually in 'bootstrap.conf'. +doc_base= +gnulib_mk= +gnulib_name= +local_gl_dir= +source_base= +tests_base= + +# The list of gnulib modules required at 'gnulib-tool' time. If you +# check 'gnulib-cache.m4' into your repository, then this list will be +# extracted automatically. +gnulib_modules= + +# Extra gnulib files that are not in modules, which override files of +# the same name installed by other bootstrap tools. +gnulib_non_module_files=" + build-aux/compile + build-aux/install-sh + build-aux/mdate-sh + build-aux/texinfo.tex + build-aux/depcomp + build-aux/config.guess + build-aux/config.sub + doc/INSTALL +" + +# Relative path to the local gnulib submodule, and url to the upstream +# git repository. If you have a gnulib entry in your .gitmodules file, +# these values are ignored. +gnulib_path= +gnulib_url= + +# Additional gnulib-tool options to use. +gnulib_tool_options=" + --no-changelog +" + +# bootstrap removes any macro-files that are not included by aclocal.m4, +# except for files listed in this variable that are always kept. +gnulib_precious=" + gnulib-tool.m4 +" + +# When truncating long commands for display, always allow at least this +# many characters before truncating. +min_cmd_len=160 + +# The command to download all .po files for a specified domain into +# a specified directory. Fill in the first %s is the domain name, and +# the second with the destination directory. Use rsync's -L and -r +# options because the latest/%s directory and the .po files within are +# all symlinks. +po_download_command_format=\ +"rsync --delete --exclude '*.s1' -Lrtvz \ +'translationproject.org::tp/latest/%s/' '%s'" + +# Other locale categories that need message catalogs. +extra_locale_categories= + +# Additional xgettext options to use. Gnulib might provide you with an +# extensive list of additional options to append to this, but gettext +# 0.16.1 and newer appends them automaticaly, so you can safely ignore +# the complaints from 'gnulib-tool' if your $configure_ac states: +# +# AM_GNU_GETTEXT_VERSION([0.16.1]) +xgettext_options=" + --flag=_:1:pass-c-format + --flag=N_:1:pass-c-format +" + +# Package copyright holder for gettext files. Defaults to FSF if unset. +copyright_holder= + +# File that should exist in the top directory of a checked out hierarchy, +# but not in a distribution tarball. +checkout_only_file= + +# Whether to use copies instead of symlinks by default (if set to true, +# the --copy option has no effect). +copy=false + +# Set this to ".cvsignore .gitignore" in 'bootstrap.conf' if you want +# those files to be generated in directories like 'lib/', 'm4/', and 'po/', +# or set it to "auto" to make this script select what to use based +# on what version control system (if any) is used in the source directory. +# Or set it to "none" to ignore VCS ignore files entirely. Default is +# "auto". +vc_ignore= + + +# List of slingshot files to link into stdlib tree before autotooling. +slingshot_files=$slingshot_files + +# Relative path to the local slingshot submodule, and url to the upsream +# git repository. If you have a slingshot entry in your .gitmodules file, +# these values are ignored. +slingshot_path=$slingshot_path +slingshot_url=$slingshot_url + +# NOTE: slingshot bootstrap will check rockspecs listed in $buildreq, +# according to the URL part of a specification triple ending in +# `.rockspec`. + + +## ------------------- ## +## External Libraries. ## +## ------------------- ## + +# Source required external libraries: +# Set a version string for this script. +scriptversion=2014-01-03.01; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=$PATH_SEPARATOR + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +# require_rockspecs_req +# --------------------- +# Remove rockspecs from $buildreq, and add them to $rockspecs_req. +require_rockspecs_req=slingshot_require_rockspecs_req +slingshot_require_rockspecs_req () +{ + $debug_cmd + + test -n "$rockspecs_req" || { + _G_non_rockspecs= + + set dummy $buildreq; shift + + while test $# -gt 2; do + case $3 in + *.rockspec) + func_append rockspecs_req " $1 $2 $3" + ;; + [a-z]*://*) + func_append _G_non_rockspecs " $1 $2 $3" + ;; + *) func_fatal_error "\ +'$3' from the buildreq table in +'bootstrap.conf' does not look like the URL for downloading +$1. Please ensure that buildreq is a strict newline +delimited list of triples; 'program min-version url'." + ;; + esac + shift; shift; shift + done + + buildreq=$_G_non_rockspecs + } + + require_rockspecs_req=: +} + + +# require_slingshot_dotgitmodules +# ------------------------------- +# Ensure we have a '.gitmodules' file, with appropriate 'slingshot' settings. +require_slingshot_dotgitmodules=slingshot_require_slingshot_dotgitmodules +slingshot_require_slingshot_dotgitmodules () +{ + $debug_cmd + + $require_git + + test true = "$GIT" || { + # A slingshot entry in .gitmodules always takes precedence. + _G_path=`$GIT config --file .gitmodules submodule.slingshot.path 2>/dev/null` + + test -n "$_G_path" || { + $require_vc_ignore_files + + func_verbose "adding slingshot entries to '.gitmodules'" + + test -n "$slingshot_path" || slingshot_path=slingshot + test -n "$slingshot_url" || slingshot_url=git://github.com/gvvaughan/slingshot.git + + { + echo '[submodule "slingshot"]' + echo " path=$slingshot_path" + echo " url=$slingshot_url" + } >> .gitmodules + + test -n "$vc_ignore_files" \ + || func_insert_if_absent ".gitmodules" $vc_ignore_files + } + } + + require_slingshot_dotgitmodules=: +} + + +# require_slingshot_path +# require_slingshot_url +# ---------------------- +# Ensure 'slingshot_path' and 'slingshot_url' are set. +require_slingshot_path=slingshot_require_slingshot_dotgitmodules_parameters +require_slingshot_url=slingshot_require_slingshot_dotgitmodules_parameters +slingshot_require_slingshot_dotgitmodules_parameters () +{ + $debug_cmd + + $require_git + $require_slingshot_dotgitmodules + + test -f .gitmodules \ + || func_fatal_error "Unable to update '.gitmodules' with slingshot submodule" + + test true = "$GIT" || { + slingshot_path=`$GIT config --file=.gitmodules --get submodule.slingshot.path` + slingshot_url=`$GIT config --file=.gitmodules --get submodule.slingshot.url` + + func_verbose "slingshot_path='$slingshot_path'" + func_verbose "slingshot_url='$slingshot_url'" + } + + require_slingshot_path=: + require_slingshot_url=: +} + + +# require_slingshot_submodule +# --------------------------- +# Ensure that there is a current slingshot submodule. +require_slingshot_submodule=slingshot_require_slingshot_submodule +slingshot_require_slingshot_submodule () +{ + $debug_cmd + + $require_git + + if test true = "$GIT"; then + func_warning recommend \ + "No 'git' found; imported slingshot modules may be missing." + else + $require_slingshot_dotgitmodules + + if test -f .gitmodules; then + $require_slingshot_path + $require_slingshot_url + + if test -f "slingshot/src/mkrockspecs.in"; then + : All present and correct. + + else + trap slingshot_cleanup 1 2 13 15 + + shallow= + $GIT clone -h 2>&1 |func_grep_q -- --depth \ + && shallow='--depth 365' + + func_show_eval "$GIT clone $shallow '$slingshot_url' '$slingshot_path'" \ + slingshot_cleanup + + # FIXME: Solaris /bin/sh will try to execute '-' if any of + # these signals are caught after this. + trap - 1 2 13 15 + fi + + # Make sure we've checked out the correct revision of slingshot. + func_show_eval "$GIT submodule init -- $slingshot_path" \ + && func_show_eval "$GIT submodule update -- $slingshot_path" \ + || func_fatal_error "Unable to update slingshot submodule." + fi + fi + + require_slingshot_submodule=: +} + + +# require_bootstrap_uptodate +# -------------------------- +# Complain if the version of bootstrap in the build-aux directory differs +# from the one we are running. +require_bootstrap_uptodate=slingshot_require_bootstrap_uptodate +slingshot_require_bootstrap_uptodate () +{ + $debug_cmd + + $require_slingshot_submodule + + _G_slingshot_bootstrap=slingshot/bootstrap + + rm -f $progname.new + + if test -f "$_G_slingshot_bootstrap"; then + if func_cmp_s "$progpath" "$_G_slingshot_bootstrap"; then + func_verbose "bootstrap script up to date" + else + cp -f $_G_slingshot_bootstrap $progname.new + func_warning upgrade "\ +An updated slingshot bootstrap script is ready for you in +'$progname.new'. After you've verified that you want the +changes, you can update with: + mv -f $progname.new $progname + ./$progname + +Or you can disable this check permanently by adding the +following to 'bootstrap.conf': + require_bootstrap_uptodate=:" + fi + else + func_warning upgrade "\ +Your slingshot submodule appears to be damagedi, so I can't tell +whether your bootstrap has gone out of sync. Please check for +and undo any local changes, or revert to the slingshot revision +you were using previously, and rerun this script." + fi + + require_bootstrap_uptodate=: +} + + +# slingshot_cleanup +# ----------------- +# Recursively delete everything at $slingshot_path. +slingshot_cleanup () +{ + $debug_cmd + + $require_slingshot_path + + _G_status=$? + $RM -fr $slingshot_path + exit $_G_status +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2014-01-07.03; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + eval $_G_hook '"$@"' + + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + done + + func_quote_for_eval ${1+"$@"} + func_run_hooks_result=$func_quote_for_eval_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, remove any +# options that you action, and then pass back the remaining unprocessed +# options in '_result', escaped suitably for +# 'eval'. Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# +# func_quote_for_eval ${1+"$@"} +# my_options_prep_result=$func_quote_for_eval_result +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# ;; +# *) set dummy "$_G_opt" "$*"; shift; break ;; +# esac +# done +# +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# func_quote_for_eval ${1+"$@"} +# my_option_validation_result=$func_quote_for_eval_result +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll alse need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + func_options_prep ${1+"$@"} + eval func_parse_options \ + ${func_options_prep_result+"$func_options_prep_result"} + eval func_validate_options \ + ${func_parse_options_result+"$func_parse_options_result"} + + eval func_run_hooks func_options \ + ${func_validate_options_result+"$func_validate_options_result"} + + # save modified positional parameters for caller + func_options_result=$func_run_hooks_result +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propogate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + + # Adjust func_parse_options positional parameters to match + eval set dummy "$func_run_hooks_result"; shift + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + test $# = 0 && func_missing_arg $_G_opt && break + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result +} + + + + +# slingshot_options_prep +# ---------------------- +# Preparation for additional slingshot option parsing. +slingshot_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_skip_rock_checks=false + # opt_luarocks_tree default in *unset*! + + # Extend the existing usage message. + usage_message=$usage_message' +Slingshot Options: + + --luarocks-tree=DIR + check a non-default tree for prerequisite rocks + --skip-rock-checks + ignore Lua rocks in bootstrap.conf:buildreq' + + func_quote_for_eval ${1+"$@"} + slingshot_options_prep_result=$func_quote_for_eval_result +} +func_add_hook func_options_prep slingshot_options_prep + + +# slingshot_parse_options OPT... +# ------------------------------ +# Called at the end of each main option parse loop to process any +# additional slingshot options. +slingshot_parse_options () +{ + $debug_cmd + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt=$1 + shift + case $_G_opt in + --luarocks-tree) + test $# = 0 && func_missing_arg $_G_opt && break + opt_luarocks_tree=$1 + shift + ;; + + --skip-rock-checks) + opt_skip_rock_checks=: + ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + slingshot_parse_options_result=$func_quote_for_eval_result +} +func_add_hook func_parse_options slingshot_parse_options + + +# slingshot_option_validation +# --------------------------- +# Flag any inconsistencies in users' selection of slingshot options. +slingshot_option_validation () +{ + $debug_cmd + + test -z "$opt_luarocks_tree" \ + || test -d "$opt_luarocks_tree" \ + || func_fatal_help "$opt_luarocks_tree: not a directory" +} +func_add_hook func_validate_options slingshot_option_validation + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Extract macro arguments from autotools input with GNU M4. +# Written by Gary V. Vaughan, 2010 +# +# Copyright (C) 2010-2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# Make sure we've evaluated scripts we depend on. +test -z "$progpath" && . `echo "$0" |${SED-sed} 's|[^/]*$||'`/funclib.sh +test extract-trace = "$progname" && . `echo "$0" |${SED-sed} 's|[^/]*$||'`/options-parser + +# Set a version string. +scriptversion=2014-12-03.16; # UTC + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +# slingshot_copy FILENAME SRCDIR DESTDIR +# -------------------------------------- +# If option '--copy' was specified, or soft-linking SRCFILE to DESTFILE +# fails, then try to copy SRCFILE to DESTFILE (making sure to update the +# timestamp so that a series of files with dependencies can be copied +# in the right order that their timestamps won't trigger rebuilds). +slingshot_copy () +{ + $debug_cmd + + slingshot_srcfile=`echo "$2/$1" |sed -e 's|/\./|/|g'` + slingshot_destfile=`echo "$3/$1" |sed -e 's|/\./|/|g'` + + $opt_force || { + # Nothing to do if the files are already identical. + if func_cmp_s "$slingshot_srcfile" "$slingshot_destfile"; then + func_verbose "'$slingshot_destfile' is up to date." + return 0 + fi + } + + # Require --force to remove existing $slingshot_destfile. + $opt_force && $RM "$slingshot_destfile" + test -f "$slingshot_destfile" && { + func_warn_and_continue "'$slingshot_destfile' exists: use '--force' to overwrite" + return 0 + } + + # Be careful to support 'func_copy dir/target srcbase destbase'. + func_dirname "$slingshot_destfile" + func_mkdir_p "$func_dirname_result" + + # Copy or link according to '--copy' option. + if $opt_copy; then + slingshot_copycmd=$CP + slingshot_copy_type=copying + else + slingshot_copycmd=$LN_S + slingshot_copy_type=linking + + func_relative_path "$3" "$2" + slingshot_srcfile=$func_relative_path_result/$1 + fi + slingshot_copy_msg="$slingshot_copy_type file '$slingshot_destfile'" + $opt_verbose && \ + slingshot_copy_msg="$slingshot_copy_type $slingshot_srcfile $3" + + if $opt_dry_run || { + ( umask 0 + $slingshot_copycmd "$slingshot_srcfile" "$slingshot_destfile" + ) >/dev/null 2>&1 + } + then + echo "$slingshot_copy_msg" + else + func_error "$slingshot_copy_type '$2/$1' to '$3/' failed" + return 1 + fi +} + + +# slingshot_rockspec_error +# ------------------------ +# Called by zile_check_rockspecs for missing rocks. +slingshot_rockspec_error () +{ + $debug_cmd + + _G_strippedver=`expr "$_G_reqver" : '=*\(.*\)'` + func_error "\ +Prerequisite LuaRock '$_G_rock $_G_strippedver' not found. Please install it." + + rockspecs_uptodate_result=false +} + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './extract-trace --help' for help with using this script from the +# command line. +# +# Or source first 'options-parser' and then this file into your own +# scripts in order to make use of the function and variable framework +# they define, and also to avoid the overhead of forking to run this +# script in its own process on every call. + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of +# 'extract-trace'. + + +# func_autoconf_configure MAYBE-CONFIGURE-FILE +# -------------------------------------------- +# Ensure that MAYBE-CONFIGURE-FILE is the name of a file in the current +# directory that contains an uncommented call to AC_INIT. +func_autoconf_configure () +{ + $debug_cmd + + _G_sed_no_comment=' + s|#.*$|| + s|^dnl .*$|| + s| dnl .*$||' + _G_ac_init= + + # If we were passed a genuine file, make sure it calls AC_INIT. + test -f "$1" \ + && _G_ac_init=`$SED "$_G_sed_no_comment" "$1" |$GREP AC_INIT` + + # Otherwise it is not a genuine Autoconf input file. + test -n "$_G_ac_init" + _G_status=$? + + test 0 -ne "$_G_status" \ + && func_verbose "'$1' not using Autoconf" + + (exit $_G_status) +} + + +# func_tool_version_output CMD [FATAL-ERROR-MSG] +# ---------------------------------------------- +# Attempt to run 'CMD --version', discarding errors. The output can be +# ignored by redirecting stdout, and this function used simply to test +# whether the command exists and exits normally when passed a +# '--version' argument. +# When FATAL-ERROR-MSG is given, then this function will display the +# message and exit if running 'CMD --version' returns a non-zero exit +# status. +func_tool_version_output () +{ + $debug_cmd + + _G_cmd=$1 + _G_fatal_error_msg=$2 + + # Some tools, like 'git2cl' produce thousands of lines of output + # unless stdin is /dev/null - in that case we want to return + # successfully without saving all of that output. Other tools, + # such as 'help2man' exit with a non-zero status when stdin comes + # from /dev/null, so we re-execute without /dev/null if that + # happens. This means that occasionally, the output from both calls + # ends up in the result, but the alternative would be to discard the + # output from one call, and hope the other produces something useful. + { $_G_cmd --version /dev/null + _G_status=$? + + test 0 -ne "$_G_status" && test -n "$_G_fatal_error_msg" \ + && func_fatal_error "$_G_fatal_error_msg" + + (exit $_G_status) +} + + +# func_tool_version_number CMD [FATAL-ERROR-MSG] +# ---------------------------------------------- +# Pass arguments to func_tool_version_output, but set +# $func_tool_version_number_result to the last dot delimited digit string +# on the first line of output. +func_tool_version_number () +{ + $debug_cmd + + _G_verout=`func_tool_version_output "$@"` + _G_status=$? + + # A version number starts with a digit following a space on the first + # line of output from `--version`. + _G_verout=`echo "$_G_verout" |sed 1q` + if test -n "$_G_verout"; then + _G_vernum=`expr "$_G_verout" : '.* \([0-9][^ ]*\)'` + fi + + if test -n "$_G_vernum"; then + printf '%s\n' "$_G_vernum" + else + printf '%s\n' "$_G_verout" + fi + + (exit $_G_status) +} + + +# func_find_tool ENVVAR NAMES... +# ------------------------------ +# Search for a required program. Use the value of ENVVAR, if set, +# otherwise find the first of the NAMES that can be run (i.e., +# supports --version). If found, set ENVVAR to the program name, +# die otherwise. +func_find_tool () +{ + $debug_cmd + + _G_find_tool_envvar=$1 + shift + _G_find_tool_names=$@ + eval "_G_find_tool_res=\$$_G_find_tool_envvar" + if test -n "$_G_find_tool_res"; then + _G_find_tool_error_prefix="\$$find_tool_envvar: " + else + _G_find_tool_res= + _G_bestver= + for _G_prog + do + _G_find_tool_save_IFS=$IFS + IFS=: + for _G_dir in $PATH; do + IFS=$_G_find_tool_save_IFS + _G_progpath=$_G_dir/$_G_prog + test -r "$_G_progpath" && { + _G_curver=`func_tool_version_number $_G_progpath` + case $_G_bestver,$_G_curver in + ,) + # first non--version responsive prog sticks! + test -n "$_G_progpath" || _G_find_tool_res=$_G_progpath + ;; + ,*) + # first --version responsive prog beats non--version responsive! + _G_find_tool_res=$_G_progpath + _G_bestver=$_G_curver + ;; + *,*) + # another --version responsive prog must be newer to beat previous one! + test "x$_G_curver" = "x$_G_bestver" \ + || func_lt_ver "$_G_curver" "$_G_bestver" \ + || { + _G_find_tool_res=$_G_progpath + _G_bestver=$_G_curver + } + ;; + esac + } + done + IFS=$_G_find_tool_save_IFS + done + fi + if test -n "$_G_find_tool_res"; then + func_tool_version_number >/dev/null $_G_find_tool_res "\ +${_G_find_tool_error_prefix}Cannot run '$_G_find_tool_res --version'" + + # Make sure the result is exported to the environment for children + # to use. + eval "$_G_find_tool_envvar=\$_G_find_tool_res" + eval "export $_G_find_tool_envvar" + else + func_error "\ +One of these is required: + $_G_find_tool_names" + fi +} + + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Where a variable already has a non- +# empty value (as set by the package's 'bootstrap.conf'), that value is +# used in preference to deriving the default. Call them using their +# associated 'require_*' variable to ensure that they are executed, at +# most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_configure_ac +# -------------------- +# Ensure that there is a 'configure.ac' or 'configure.in' file in the +# current directory that contains an uncommented call to AC_INIT, and +# that '$configure_ac' contains its name. +require_configure_ac=func_require_configure_ac +func_require_configure_ac () +{ + $debug_cmd + + test -z "$configure_ac" \ + && func_autoconf_configure configure.ac && configure_ac=configure.ac + test -z "$configure_ac" \ + && func_autoconf_configure configure.in && configure_ac=configure.in + test -z "$configure_ac" \ + || func_verbose "found '$configure_ac'" + + require_configure_ac=: +} + + +# require_gnu_m4 +# -------------- +# Search for GNU M4, and export it in $M4. +require_gnu_m4=func_require_gnu_m4 +func_require_gnu_m4 () +{ + $debug_cmd + + test -n "$M4" || { + # Find the first m4 binary that responds to --version. + func_find_tool M4 gm4 gnum4 m4 + } + + test -n "$M4" || func_fatal_error "\ +Please install GNU M4, or 'export M4=/path/to/gnu/m4'." + + func_verbose "export M4='$M4'" + + # Make sure the search result is visible to subshells + export M4 + + require_gnu_m4=: +} + + +## --------------- ## +## Core functions. ## +## --------------- ## + +# This section contains the high level functions used when calling this +# file as a script. 'func_extract_trace' is probably the only one that you +# won't want to replace if you source this file into your own script. + + +# func_extract_trace MACRO_NAMES [FILENAME]... +# -------------------------------------------- +# set '$func_extract_trace_result' to a colon delimited list of arguments +# to any of the comma separated list of MACRO_NAMES in FILENAME. If no +# FILENAME is given, then '$configure_ac' is assumed. +func_extract_trace () +{ + $debug_cmd + + $require_configure_ac + $require_gnu_m4 + + _G_m4_traces=`$ECHO "--trace=$1" |$SED 's%,% --trace=%g'` + _G_re_macros=`$ECHO "($1)" |$SED 's%,%|%g'` + _G_macros="$1"; shift + test $# -gt 0 || { + set dummy $configure_ac + shift + } + + # Generate an error if the first file is missing + <"$1" + + # Sadly, we can't use 'autom4te' tracing to extract macro arguments, + # because it complains about things we want to ignore at bootstrap + # time - like missing m4_include files; AC_PREREQ being newer than + # the installed autoconf; and returns nothing when tracing + # 'AM_INIT_AUTOMAKE' when aclocal hasn't been generated yet. + # + # The following tries to emulate a less persnickety version of (and + # due to not having to wait for Perl startup on every invocation, + # it's probably faster too): + # + # autom4te --language=Autoconf --trace=$my_macro:\$% "$@" + # + # First we give a minimal set of macro declarations to M4 to prime + # it for reading Autoconf macros, while still providing some of the + # functionality generally used at m4-time to supply dynamic + # arguments to Autocof functions, but without following + # 'm4_s?include' files. + _G_mini=' + # Initialisation. + m4_changequote([,]) + m4_define([m4_copy], [m4_define([$2], m4_defn([$1]))]) + m4_define([m4_rename], [m4_copy([$1], [$2])m4_undefine([$1])]) + + # Disable these macros. + m4_undefine([m4_dnl]) + m4_undefine([m4_include]) + m4_undefine([m4_m4exit]) + m4_undefine([m4_m4wrap]) + m4_undefine([m4_maketemp]) + + # Copy and rename macros not handled by "m4 --prefix". + m4_define([dnl], [m4_builtin([dnl])]) + m4_copy([m4_define], [m4_defun]) + m4_rename([m4_ifelse], [m4_if]) + m4_ifdef([m4_mkstemp], [m4_undefine([m4_mkstemp])]) + m4_rename([m4_patsubst], [m4_bpatsubst]) + m4_rename([m4_regexp], [m4_bregexp]) + + # "m4sugar.mini" - useful m4-time macros for dynamic arguments. + # If we discover packages that need more m4 macros defined in + # order to bootstrap correctly, add them here: + m4_define([m4_bmatch], + [m4_if([$#], 0, [], [$#], 1, [], [$#], 2, [$2], + [m4_if(m4_bregexp([$1], [$2]), -1, + [$0([$1], m4_shift3($@))], [$3])])]) + m4_define([m4_ifndef], [m4_ifdef([$1], [$3], [$2])]) + m4_define([m4_ifset], + [m4_ifdef([$1], [m4_ifval(m4_defn([$1]), [$2], [$3])], [$3])]) + m4_define([m4_require], [$1]) + m4_define([m4_shift3], [m4_shift(m4shift(m4shift($@)))]) + + # "autoconf.mini" - things from autoconf macros we care about. + m4_copy([m4_defun], [AC_DEFUN]) + + # Dummy definitions for the macros we want to trace. + # AM_INIT_AUTOMAKE at least produces no trace without this. + ' + + _G_save=$IFS + IFS=, + for _G_macro in $_G_macros; do + IFS=$_G_save + func_append _G_mini "AC_DEFUN([$_G_macro])$nl" + done + IFS=$_G_save + + # We discard M4's stdout, but the M4 trace output from reading our + # "autoconf.mini" followed by any other files passed to this + # function is then scanned by sed to transform it into a colon + # delimited argument list assigned to a shell variable. + _G_transform='s|#.*$||; s|^dnl .*$||; s| dnl .*$||;' + + # Unfortunately, alternation in regexp addresses doesn't work in at + # least BSD (and hence Mac OS X) sed, so we have to append a capture + # and print block for each traced macro to the sed transform script. + _G_save=$IFS + IFS=, + for _G_macro in $_G_macros; do + IFS=$_G_save + func_append _G_transform ' + /^m4trace: -1- '"$_G_macro"'/ { + s|^m4trace: -1- '"$_G_macro"'[([]*|| + s|], [[]|:|g + s|[])]*$|:| + s|\(.\):$|\1| + p + }' + done + IFS=$_G_save + + # Save the command pipeline results for further use by callers of + # this function. + func_extract_trace_result=`$ECHO "$_G_mini" \ + |$M4 -daq --prefix $_G_m4_traces - "$@" 2>&1 1>/dev/null \ + |$SED -n -e "$_G_transform"` +} + + +# func_extract_trace_first MACRO_NAMES [FILENAME]... +# -------------------------------------------------- +# Exactly like func_extract_trace, except that only the first argument +# to the first invocation of one of the comma separated MACRO_NAMES is +# returned in '$func_extract_trace_first_result'. +func_extract_trace_first () +{ + $debug_cmd + + func_extract_trace ${1+"$@"} + func_extract_trace_first_result=`$ECHO "$func_extract_trace_result" \ + |$SED -e 's|:.*$||g' -e 1q` +} + + +# func_main [ARG]... +# ------------------ +func_main () +{ + $debug_cmd + + # Configuration. + usage='$progname MACRO_NAME FILE [...]' + + long_help_message=' +The first argument to this program is the name of an autotools macro +whose arguments you want to extract by examining the files listed in the +remaining arguments using the same tool that Autoconf and Automake use, +GNU M4. + +The arguments are returned separated by colons, with each traced call +on a separate line.' + + # Option processing. + func_options "$@" + eval set dummy "$func_options_result"; shift + + # Validate remaining non-option arguments. + test $# -gt 1 \ + || func_fatal_help "not enough arguments" + + # Pass non-option arguments to extraction function. + func_extract_trace "$@" + + # Display results. + test -n "$func_extract_trace_result" \ + && $ECHO "$func_extract_trace_result" + + # The End. + exit $EXIT_SUCCESS +} + + +## --------------------------- ## +## Actually perform the trace. ## +## --------------------------- ## + +# Only call 'func_main' if this script was called directly. +test extract-trace = "$progname" && func_main "$@" + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "20/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string for *this* script. +scriptversion=2014-11-04.13; # UTC + + +## ------------------- ## +## Hookable functions. ## +## ------------------- ## + +# After 'bootstrap.conf' has been sourced, execution proceeds by calling +# 'func_bootstrap'. Wherever a function is decorated with +# 'func_hookable func_name', you will find a matching 'func_run_hooks +# func_name', which executes all functions added with 'func_add_hook +# func_name my_func'. +# +# You might notice that many of these functions begin with a series of +# '$require_foo' lines. See the docu-comments at the start of the +# 'Resource management' section for a description of what these are. + + +# func_bootstrap [ARG]... +# ----------------------- +# All the functions called inside func_bootstrap are hookable. See the +# the individual implementations for details. +func_bootstrap () +{ + $debug_cmd + + # Save the current positional parameters to prevent them being + # corrupted by calls to 'set' in 'func_init'. + func_quote_for_eval ${1+"$@"} + _G_saved_positional_parameters=$func_quote_for_eval_result + + # Initialisation. + func_init + + # Option processing. + eval func_options "$_G_saved_positional_parameters" + + # Post-option preparation. + func_prep + + # Reconfigure the package. + func_reconfigure + + # Ensure .version is up-to-date. + func_update_dotversion + + # Finalisation. + func_fini +} + + +# func_init +# --------- +# Any early initialisations can be hooked to this function. Consider +# whether you can hook onto 'func_prep' instead, because if you hook +# any slow to execute code in here, it will also add to the time before +# './bootstrap --version' can respond. +func_hookable func_init +func_init () +{ + $debug_cmd + + func_run_hooks func_init +} + + +# func_prep +# --------- +# Function to perform preparation for remaining bootstrap process. If +# your hooked code relies on the outcome of 'func_options' hook it here +# rather than to 'func_init'. +# +# All the functions called inside func_prep are hookable. See the +# individual implementations for details. +func_hookable func_prep +func_prep () +{ + $debug_cmd + + $require_buildtools_uptodate + $require_checkout_only_file + + $require_gnulib_merge_changelog + + # Report the results of SED and GREP searches from funclib.sh. + func_verbose "GREP='$GREP'" + func_verbose "SED='$SED'" + + # fetch update files from the translation project + func_update_translations + + func_run_hooks func_prep +} + + +# func_update_translations +# ------------------------ +# Update package po files and translations. +func_hookable func_update_translations +func_update_translations () +{ + $debug_cmd + + $opt_skip_po || { + test -d po && { + $require_package + + func_update_po_files po $package || exit $? + } + + func_run_hooks func_update_translations + } +} + + +# func_reconfigure +# ---------------- +# Reconfigure the current package by running the appropriate autotools in a +# suitable order. +func_hookable func_reconfigure +func_reconfigure () +{ + $debug_cmd + + $require_automake_options + + # Automake (without 'foreign' option) requires that NEWS & README exist. + case " $automake_options " in + " foreign ") ;; + *) + func_ensure_NEWS + func_ensure_README + ;; + esac + + # Ensure ChangeLog presence. + if test -n "$gnulib_modules"; then + func_ifcontains "$gnulib_modules" gitlog-to-changelog \ + func_ensure_changelog + else + $require_gnulib_cache + if $SED -n '/^gl_MODULES(\[/,/^])$/p' $gnulib_cache 2>/dev/null | + func_grep_q gitlog-to-changelog + then + func_ensure_changelog + fi + fi + + # Released 'autopoint' has the tendency to install macros that have + # been obsoleted in current 'gnulib', so run this before 'gnulib-tool'. + func_autopoint + + # Autoreconf runs 'aclocal' before 'libtoolize', which causes spurious + # warnings if the initial 'aclocal' is confused by the libtoolized + # (or worse: out-of-date) macro directory. + func_libtoolize + + # If you need to do anything after 'gnulib-tool' is done, but before + # 'autoreconf' runs, you don't need to override this whole function, + # because 'func_gnulib_tool' is hookable. + func_gnulib_tool + + func_autoreconf + + func_run_hooks func_reconfigure +} + + +# func_gnulib_tool +# ---------------- +# Run 'gnulib-tool' to fetch gnulib modules into the current package. +# +# It's assumed that since you are using gnulib's 'bootstrap' script, +# you're also using gnulib elsewhere in your package. If not, then +# you can replace this function in 'bootstrap.conf' with: +# +# func_gnulib_tool () { :; } +# +# (although the function returns immediately if $gnulib_tool is set to +# true in any case). +func_hookable func_gnulib_tool +func_gnulib_tool () +{ + $debug_cmd + + $require_gnulib_tool + $require_libtoolize + + test true = "$gnulib_tool" || { + # bootstrap.conf written for gnulib bootstrap expects + # gnulib_tool_option_extras to which --no-changelog is appended, + # but libtool bootstrap expects you to append to gnulib_tool_options + # so that you can override the --no-changelog default: make sure we + # support both styles so users can migrate between them easily. + gnulib_tool_all_options="$gnulib_tool_options $gnulib_tool_option_extras" + + if test -n "$gnulib_modules"; then + $require_gnulib_cache + $require_gnulib_tool_base_options + + gnulib_mode=--import + + # Try not to pick up any stale values from 'gnulib-cache.m4'. + rm -f "$gnulib_cache" + + test -n "$gnulib_tool_base_options" \ + && func_append_uniq gnulib_tool_all_options " $gnulib_tool_base_options" + test -n "$gnulib_mk" \ + && func_append_uniq gnulib_tool_all_options " --makefile-name=$gnulib_mk" + test -n "$tests_base" && { + func_append_uniq gnulib_tool_all_options " --tests-base=$tests_base" + func_append_uniq gnulib_tool_all_options " --with-tests" + } + else + + # 'gnulib_modules' and others are cached in 'gnulib-cache.m4': + # Use 'gnulib --update' to fetch gnulib modules. + gnulib_mode=--update + fi + + # Add a sensible default libtool option to gnulib_tool_options. + # The embedded echo is to squash whitespace before globbing. + case `echo " "$gnulib_tool_all_options" "` in + *" --no-libtool "*|*" --libtool "*) ;; + *) if test true = "$LIBTOOLIZE"; then + func_append_uniq gnulib_tool_all_options " --no-libtool" + else + func_append_uniq gnulib_tool_all_options " --libtool" + fi + ;; + esac + + $opt_copy || func_append_uniq gnulib_tool_all_options " --symlink" + + func_append_uniq gnulib_tool_all_options " $gnulib_mode" + func_append gnulib_tool_all_options " $gnulib_modules" + + # The embedded echo is to squash whitespace before display. + gnulib_cmd=`echo $gnulib_tool $gnulib_tool_all_options` + + func_show_eval "$gnulib_cmd" 'exit $?' + + # Use 'gnulib-tool --copy-file' to install non-module files. + func_install_gnulib_non_module_files + } + + func_run_hooks func_gnulib_tool +} + + +# func_fini +# --------- +# Function to perform all finalisation for the bootstrap process. +func_hookable func_fini +func_fini () +{ + $debug_cmd + + func_gettext_configuration + func_clean_dangling_symlinks + func_clean_unused_macros + func_skip_po_recommendation + + func_run_hooks func_fini + + $require_bootstrap_uptodate + + func_echo "Done. Now you can run './configure'." +} + + +# func_gettext_configuration +# -------------------------- +# Edit configuration values into po/Makevars. +func_hookable func_gettext_configuration +func_gettext_configuration () +{ + $debug_cmd + + $require_autopoint + + test true = "$AUTOPOINT" || { + $require_copyright_holder + $require_extra_locale_categories + $require_package_bugreport + + # Escape xgettext options for sed Makevars generation below. + # We have to delete blank lines in a separate script so that we don't + # append \\\ to the penultimate line, and then delete the last empty + # line, which messes up the variable substitution later in this + # function. Note that adding a literal \\\ requires double escaping + # here, once for the execution subshell, and again for the assignment, + # which is why there are actually 12 (!!) backslashes in the script. + _G_xgettext_options=`echo "$xgettext_options$nl" |$SED '/^$/d' |$SED ' + $b + s|$| \\\\\\\\\\\\|'` + + # Create gettext configuration. + func_echo "Creating po/Makevars from po/Makevars.template ..." + $RM -f po/Makevars + $SED ' + /^EXTRA_LOCALE_CATEGORIES *=/s|=.*|= '"$extra_locale_categories"'| + /^COPYRIGHT_HOLDER *=/s|=.*|= '"$copyright_holder"'| + /^MSGID_BUGS_ADDRESS *=/s|=.*|= '"$package_bugreport"'| + /^XGETTEXT_OPTIONS *=/{ + s|$| \\| + a\ + '"$_G_xgettext_options"' \\\ + $${end_of_xgettext_options+} + } + ' po/Makevars.template >po/Makevars || exit 1 + } + + func_run_hooks func_gettext_configuration +} + + + +## The section title above is chosen for what section of bootstrap +## these functions will be merged to, so that the invocations of +## `func_add_hook` are guaranteed not to be executed until after +## the hook management functions are defined. + + +# slingshot_split_buildreq +# ------------------------ +# For convenience, let the user add rockspec requirements to $buildreq. +# Note that this is for *build-time* requirements (e.g. ldoc), so that +# make can complete without error. You should add *run-time* rockspec +# requirements (e.g. stdlib) to rockspec.conf. +slingshot_split_buildreq () +{ + $debug_cmd + + $require_rockspecs_req +} +func_add_hook func_init slingshot_split_buildreq + + +# slingshot_check_rockspecs +# ------------------------- +# Check build-time rockspecs from $buildreq are uptodate. +# It would be nice if we could rely on luarock binaries to respond to +# `--version` like GNU apps, but there is no reliable consensus, so we +# have to check installed luarock versions directly, and warn the user +# if the apps we're checking for are not somewhere along PATH. +slingshot_check_rockspecs () +{ + $debug_cmd + + $opt_skip_rock_checks && return + + $require_rockspecs_req + + _G_req= + rockspecs_uptodate_result=: + + set dummy $rockspecs_req; shift + while test $# -gt 0; do + _G_rock=$1; shift + _G_reqver=$1; shift + _G_url=$1; shift + + func_append _G_req " $_G_rock $_G_url" + + # Honor $APP variables ($LDOC, $SPECL, etc.) + _G_appvar=`echo $_G_rock |tr '[a-z]' '[A-Z]'` + eval "_G_rock=\${$_G_appvar-$_G_rock}" + + # Trust the user will ensure the binaries will arive at the + # specified location before they are needed if they set these. + if eval 'test -n "${'$_G_appvar'+set}"'; then + eval test -f '"${'$_G_appvar'}"' \ + || eval 'func_warning settings "\ +not checking whether $'$_G_appvar' has version $_G_reqver; +configure or make may fail because you set $_G_appvar, but +$'$_G_appvar' does not yet exist!"' + else + _G_instver=`$LUAROCKS ${opt_luarocks_tree+--tree=$opt_luarocks_tree} \ + show $_G_rock 2>/dev/null \ + |sed -n '/^'"$_G_rock"' .* - /{s/^'"$_G_rock"' \(.*\) - .*$/\1/p;}'` + + if test -z "$_G_instver"; then + slingshot_rockspec_error + else + func_verbose "found '$_G_rock' version $_G_instver." + + case $_G_reqver in + =*) + test "x$_G_reqver" = "x=$_G_instver" || slingshot_rockspec_error + ;; + *) + func_lt_ver "$_G_reqver" "$_G_instver" || slingshot_rockspec_error + ;; + esac + fi + fi + done + + $rockspecs_uptodate_result || { + func_strtable 0 10 48 \ + "Program" "Rockspec_URL" $_G_req + func_fatal_error "Missing rocks: +$func_strtable_result +Install missing rockspecs with: + $LUAROCKS ${opt_luarocks_tree+--tree=$opt_luarocks_tree }install \$Rockspec_URL +and then rerun bootstrap with the --luarocks-tree option set +appropriately, or if you're sure that the missing rocks will +be installed before running make by exporting: + APPNAME=/path/to/app. +" + } +} +func_add_hook func_prep slingshot_check_rockspecs + + +# slingshot_copy_files +# -------------------- +# Update files from slingshot subproject. +slingshot_copy_files () +{ + $debug_cmd + + $require_package + + test slingshot = "$package" || { + func_check_configuration slingshot_files + + $require_slingshot_submodule + + # Make sure we have the latest mkrockspecs + # (the rebootstrap rule in slingshot/GNUmakefile autoruns). + make -C slingshot build-aux/mkrockspecs + + # Update in-tree links. + for file in $slingshot_files; do + func_dirname_and_basename "./$file" + slingshot_copy "$func_basename_result" \ + "slingshot/$func_dirname_result" "$func_dirname_result" + done + } +} +func_add_hook func_prep slingshot_copy_files + + +# slingshot_ensure_changelog +# -------------------------- +# Slingshot project probably won't have a gnulib_modules list. +# So we redo the ChangeLog check against slingshot_files. +slingshot_ensure_changelog () +{ + $debug_cmd + + if test -n "$slingshot_files"; then + func_ifcontains "$slingshot_files" build-aux/gitlog-to-changelog \ + func_ensure_changelog + fi + + return 0 +} +func_add_hook func_prep slingshot_ensure_changelog + + +# slingshot_update_travis_yml +# --------------------------- +# When 'travis.yml.in' is listed in $slingshot_files, complain if +# regenerating '.travis.yml' would change it. +slingshot_update_travis_yml () +{ + $debug_cmd + + $require_git + + _G_travis_yml_in=travis.yml.in + _G_travis_yml_out=.travis.yml + + rm -f "$_G_travis_yml_out.new" + + test true = "$GIT" || { + case " "`echo $slingshot_files`" " in + *" travis.yml.in "*) + # Remove trailing blanks so as not to trip sc_trailing_blank in syntax check + test -f "$_G_travis_yml_in" && { + $slingshot_require_travis_extra_rocks + + eval `grep '^ *PACKAGE=' configure | sed 1q` + eval `grep '^ *VERSION=' configure | sed 1q` + + cat "$_G_travis_yml_in" | + sed 's| *$||' | + sed "s|@EXTRA_ROCKS@|`echo $travis_extra_rocks`|g" | + sed "s|@PACKAGE@|$PACKAGE|g" | + sed "s|@VERSION@|$VERSION|g" + + if test -f .slackid; then + read slackid < .slackid + printf '%s\n' '' 'notifications:' " slack: $slackid" + fi + } > "$_G_travis_yml_out.new" + + if test -f "$_G_travis_yml_out"; then + if func_cmp_s "$_G_travis_yml_out" "$_G_travis_yml_out.new"; then + func_verbose "$_G_travis_yml_out is up to date" + rm -f "$_G_travis_yml_out.new" + else + func_warning upgrade "\ +An updated $_G_travis_yml_out script is ready for you in +'$_G_travis_yml_out.new'. After you've verified that you want +the changes, you can update with: + mv -f $_G_travis_yml_out.new $_G_travis_yml_out" + fi + else + func_verbose "creating '$_G_travis_yml_out'" + mv -f "$_G_travis_yml_out.new" "$_G_travis_yml_out" + fi + ;; + esac + } +} +func_add_hook func_fini slingshot_update_travis_yml + + +# slingshot_check_rockstree_path +# ------------------------------ +# Show a warning at the end of bootstrap if --luarocks-tree was passed +# set, but $opt_luarocks_tree/bin is not in the command PATH. +slingshot_check_rockstree_path () +{ + $debug_cmd + + test -z "$rockspecs_req" || { + case :$PATH: in + *:$opt_luarocks_tree/bin:*) ;; + *) func_warning recommend \ + "If configure or make fail, try adding $opt_luarocks_tree/bin to PATH" ;; + esac + } +} +func_add_hook func_fini slingshot_check_rockstree_path + + +## --------------- ## +## Core functions. ## +## --------------- ## + +# This section contains the main functions called from the 'Hookable +# functions' (shown above), and are the ones you're most likely +# to want to replace with your own implementations in 'bootstrap.conf'. + + +# func_autopoint +# -------------- +# If this package uses gettext, then run 'autopoint'. +func_autopoint () +{ + $debug_cmd + + $require_autopoint + + test true = "$AUTOPOINT" \ + || func_show_eval "$AUTOPOINT --force" 'exit $?' +} + + +# func_libtoolize +# --------------- +# If this package uses libtool, then run 'libtoolize'. +func_libtoolize () +{ + $debug_cmd + + $require_libtoolize + + test true = "$LIBTOOLIZE" || { + _G_libtoolize_options= + $opt_copy && func_append _G_libtoolize_options " --copy" + $opt_force && func_append _G_libtoolize_options " --force" + $opt_verbose || func_append _G_libtoolize_options " --quiet" + func_show_eval "$LIBTOOLIZE$_G_libtoolize_options" 'exit $?' + } +} + + +# func_gnulib_tool_copy_file SRC DEST +# ----------------------------------- +# Copy SRC, a path relative to the gnulib sub-tree, to DEST, a path +# relative to the top-level source directory using gnulib-tool so that +# any patches or replacements in $local_gl_dir are applied. +func_gnulib_tool_copy_file () +{ + $debug_cmd + + $require_gnulib_tool + $require_patch + + if test true = "$gnulib_tool"; then + # If gnulib-tool is not available (e.g. bootstrapping in a + # distribution tarball), make sure that at least we have some + # version of the required file already in place. + test -f "$2" || func_fatal_error "\ +Can't find, copy or download '$2', a required +gnulib supplied file, please provide the location of a +complete 'gnulib' tree by setting 'gnulib_path' in your +'bootstrap.conf' or with the '--gnulib-srcdir' option - +or else specify the location of your 'git' binary by +setting 'GIT' in the environment so that a fresh +'gnulib' submodule can be cloned." + else + $require_gnulib_copy_cmd + + $gnulib_copy_cmd $1 $2 2>/dev/null || { + $require_gnulib_path + + func_error "'$gnulib_path/$1' does not exist" + return 1 + } + fi +} + + +# func_install_gnulib_non_module_files +# ------------------------------------ +# Get additional non-module files from gnulib, overriding existing files. +func_install_gnulib_non_module_files () +{ + $debug_cmd + + $require_build_aux + $require_gnulib_tool + + test -n "$gnulib_non_module_files" && { + maybe_exit_cmd=: + + for file in $gnulib_non_module_files; do + case $file in + */COPYING*) dest=COPYING;; + */INSTALL) dest=INSTALL;; + build-aux/missing) dest= + func_warning settings "\ +Please remove build-aux/missing from gnulib_module_files in +'bootstrap.conf', as it may clash with Automake's version." + ;; + build-aux/*) dest=$build_aux/`expr "$file" : 'build-aux/\(.*\)'`;; + *) dest=$file;; + esac + + # Be sure to show all copying errors before bailing out + test -z "$dest" \ + || func_gnulib_tool_copy_file "$file" "$dest" \ + || maybe_exit_cmd="exit $EXIT_FAILURE" + done + + $maybe_exit_cmd + } +} + + +# func_ensure_changelog +# --------------------- +# Even with 'gitlog-to-changelog' generated ChangeLogs, automake +# will not run to completion with no ChangeLog file. +func_ensure_changelog () +{ + $debug_cmd + + test -f ChangeLog && mv -f ChangeLog ChangeLog~ + + cat >ChangeLog <<'EOT' +## ---------------------- ## +## DO NOT EDIT THIS FILE! ## +## ---------------------- ## + +ChangeLog is generated by gitlog-to-changelog. +EOT + + _G_message="creating dummy 'ChangeLog'" + test -f ChangeLog~ \ + && func_append _G_message ' (backup in ChangeLog~)' + func_verbose "$_G_message" + + return 0 +} + + +# func_ensure_NEWS +# ---------------- +# Without AM_INIT_AUTOMAKE([foreign]), automake will not run to +# completion with no NEWS file, even though NEWS.md or NEWS.txt +# is often preferable. +func_ensure_NEWS () +{ + $debug_cmd + + test -f NEWS || { + _G_NEWS= + for _G_news in NEWS.txt NEWS.md NEWS.rst; do + test -f "$_G_news" && break + done + + test -f "$_G_news" && $LN_S $_G_news NEWS + func_verbose "$LN_S $_G_news NEWS" + } + + return 0 +} + + +# func_ensure_README +# ------------------ +# Without AM_INIT_AUTOMAKE([foreign]), automake will not run to +# completion with no README file, even though README.md or README.txt +# is often preferable. +func_ensure_README () +{ + $debug_cmd + + test -f README || { + _G_README= + for _G_readme in README.txt README.md README.rst; do + test -f "$_G_readme" && break + done + + test -f "$_G_readme" && $LN_S $_G_readme README + func_verbose "$LN_S $_G_readme README" + } + + return 0 +} + + +# func_autoreconf [SUBDIR] +# ------------------------ +# Being careful not to re-run 'autopoint' or 'libtoolize', and not to +# try to run 'autopoint', 'libtoolize' or 'autoheader' on packages that +# don't use them, defer to 'autoreconf' for execution of the remaining +# autotools to bootstrap this package. +# +# Projects with multiple trees to reconfigure can hook another call to +# this function onto func_reconfigure: +# +# my_autoreconf_foo () +# { +# func_autoreconf foo +# } +# func_add_hook func_reconfigure my_autoreconf_foo +func_autoreconf () +{ + $debug_cmd + + $require_autoheader + $require_build_aux # automake and others put files in here + $require_macro_dir # aclocal and others put files in here + + # We ran these manually already, and autoreconf won't exec ':' + save_AUTOPOINT=$AUTOPOINT; AUTOPOINT=true + save_LIBTOOLIZE=$LIBTOOLIZE; LIBTOOLIZE=true + + _G_autoreconf_options= + $opt_copy || func_append _G_autoreconf_options " --symlink" + $opt_force && func_append _G_autoreconf_options " --force" + $opt_verbose && func_append _G_autoreconf_options " --verbose" + func_show_eval "$AUTORECONF$_G_autoreconf_options --install${1+ $1}" 'exit $?' + + AUTOPOINT=$save_AUTOPOINT + LIBTOOLIZE=$save_LIBTOOLIZE +} + + +# func_check_configuration VARNAME [CONFIGURE_MACRO] +# -------------------------------------------------- +# Exit with a suitable diagnostic for an important configuration change +# that needs to be made before bootstrap can run correctly. +func_check_configuration () +{ + $debug_cmd + + $require_configure_ac + + eval 'test -n "$'$1'"' || { + _G_error_msg="please set '$1' in 'bootstrap.conf'" + if test -n "$configure_ac" && test -n "$2"; then + func_append _G_error_msg " +or add the following (or similar) to your '$configure_ac': +$2" + fi + + func_fatal_error "$_G_error_msg" + } +} + + +# func_clean_dangling_symlinks +# ---------------------------- +# Remove any dangling symlink matching "*.m4" or "*.[ch]" in some +# gnulib-populated directories. Such .m4 files would cause aclocal to +# fail. The following requires GNU find 4.2.3 or newer. Considering +# the usual portability constraints of this script, that may seem a very +# demanding requirement, but it should be ok. Ignore any failure, +# which is fine, since this is only a convenience to help developers +# avoid the relatively unusual case where a symlinked-to .m4 file is +# git-removed from gnulib between successive runs of this script. +func_clean_dangling_symlinks () +{ + $debug_cmd + + $require_macro_dir + $require_source_base + + func_verbose "cleaning dangling symlinks" + + find "$macro_dir" "$source_base" \ + -depth \( -name '*.m4' -o -name '*.[ch]' \) \ + -type l -xtype l -delete > /dev/null 2>&1 +} + + +# func_clean_unused_macros +# ------------------------ +# Autopoint can result in over-zealously adding macros into $macro_dir +# even though they are not actually used, for example tests to help +# build the 'intl' directory even though you have specified +# 'AM_GNU_GETTEXT([external])' in your configure.ac. This function +# looks removes any macro files that can be found in gnulib, but +# are not 'm4_include'd by 'aclocal.m4'. +func_clean_unused_macros () +{ + $debug_cmd + + $require_gnulib_path + $require_macro_dir + + test -n "$gnulib_path" && test -f aclocal.m4 && { + aclocal_m4s=`find . -name aclocal.m4 -print` + + # We use 'ls|grep' instead of 'ls *.m4' to avoid exceeding + # command line length limits in some shells. + for file in `cd "$macro_dir" && ls -1 |$GREP '\.m4$'`; do + + # Remove a macro file when aclocal.m4 does not m4_include it... + func_grep_q 'm4_include([[]'$macro_dir/$file'])' $aclocal_m4s \ + || test ! -f "$gnulib_path/m4/$file" || { + + # ...and there is an identical file in gnulib... + if func_cmp_s "$gnulib_path/m4/$file" "$macro_dir/$file"; then + + # ...and it's not in the precious list ('echo' is needed + # here to squash whitespace for the match expression). + case " "`echo $gnulib_precious`" " in + *" $file "*) ;; + *) rm -f "$macro_dir/$file" + func_verbose \ + "removing unused gnulib file '$macro_dir/$file'" + esac + fi + } + done + } +} + + +# func_skip_po_recommendation +# --------------------------- +# If there is a po directory, and '--skip-po' wasn't passed, let the +# user know that they can use '--skip-po' on subsequent invocations. +func_skip_po_recommendation () +{ + $debug_cmd + + test ! -d po \ + || $opt_skip_po \ + || func_warning recommend "\ +If your pofiles are up-to-date, you can rerun bootstrap +as '$progname --skip-po' to avoid redownloading." +} + + +# func_update_dotversion +# ---------------------- +# Even with 'gitlog-to-changelog' generated ChangeLogs, automake +# will not run to completion with no ChangeLog file. +func_update_dotversion () +{ + $debug_cmd + + test -f "$build_aux/git-version-gen" && { + _G_message="updating .version" + test -f .version && { + mv .version .version~ + func_append _G_message " (backup in .version~)" + } + func_verbose "updating .version" + + $build_aux/git-version-gen dummy-arg > .version + } +} + + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Where a variable already has a non- +# empty value (as set by the package's 'bootstrap.conf'), that value is +# used in preference to deriving the default. Call them using their +# associated 'require_*' variable to ensure that they are executed, at +# most, once. + + +# require_checkout_only_file +# -------------------------- +# Bail out if this package only bootstraps properly from a repository +# checkout. +require_checkout_only_file=func_require_checkout_only_file +func_require_checkout_only_file () +{ + $debug_cmd + + $opt_force || { + test -n "$checkout_only_file" && test ! -f "$checkout_only_file" \ + && func_fatal_error "\ +Bootstrapping from a non-checked-out distribution is risky. +If you wish to bootstrap anyway, use the '--force' option." + } + + require_checkout_only_file=: +} + + +# require_aclocal_amflags +# ----------------------- +# Ensure '$aclocal_amflags' has a sensible default, extracted from +# 'Makefile.am' if necessary. +require_aclocal_amflags=func_require_aclocal_amflags +func_require_aclocal_amflags () +{ + $debug_cmd + + $require_makefile_am + + _G_sed_extract_aclocal_amflags='s|#.*$|| + /^[ ]*ACLOCAL_AMFLAGS[ ]*=/ { + s|^.*=[ ]*\(.*\)|aclocal_amflags="\1"| + p + }' + + _G_aclocal_flags_cmd=`$SED -n "$_G_sed_extract_aclocal_amflags" \ + "$makefile_am"` + eval "$_G_aclocal_flags_cmd" + + func_verbose "ACLOCAL_AMFLAGS='$aclocal_amflags'" + + require_aclocal_amflags=: +} + + +# require_autoheader +# ------------------ +# Skip autoheader if it's not needed. +require_autoheader=func_require_autoheader +func_require_autoheader () +{ + $debug_cmd + + test true = "$AUTOHEADER" || { + func_extract_trace AC_CONFIG_HEADERS + test -n "$func_extract_trace_result" \ + || func_extract_trace AC_CONFIG_HEADER + + test -n "$func_extract_trace_result" || { + AUTOHEADER=true + + func_verbose "export AUTOHEADER='$AUTOHEADER'" + + # Make sure the search result is visible to subshells + export AUTOHEADER + } + } + + require_autoheader=: +} + + +# require_automake_options +# ------------------------ +# Extract options from AM_AUTOMAKE_INIT. +require_automake_options=func_require_automake_options +func_require_automake_options () +{ + $debug_cmd + + func_extract_trace AM_INIT_AUTOMAKE + automake_options=$func_extract_trace_result + + require_automake_options=: +} + + +# require_autopoint +# ----------------- +# Skip autopoint if it's not needed. +require_autopoint=func_require_autopoint +func_require_autopoint () +{ + $debug_cmd + + test true = "$AUTOPOINT" || { + func_extract_trace AM_GNU_GETTEXT_VERSION + + test -n "$func_extract_trace_result" || { + AUTOPOINT=true + + func_verbose "export AUTOPOINT='$AUTOPOINT'" + + # Make sure the search result is visible to subshells + export AUTOPOINT + } + } + + require_autopoint=: +} + + +# require_bootstrap_uptodate +# -------------------------- +# Complain if the version of bootstrap in the gnulib directory differs +# from the one we are running. + +func_require_bootstrap_uptodate () +{ + $debug_cmd + + $require_build_aux + + _G_bootstrap_sources=" + $build_aux/bootstrap.in + $build_aux/extract-trace + $build_aux/funclib.sh + $build_aux/options-parser + " + + _G_missing_bootstrap_sources=false + for _G_src in $_G_bootstrap_sources; do + test -f "$_G_src" || _G_missing_bootstrap_sources=: + done + + if $_G_missing_bootstrap_sources; then + func_warning upgrade "\ +Please add bootstrap to your gnulib_modules list in +'bootstrap.conf', so that I can tell you when there are +updates available." + else + rm -f bootstrap.new + $build_aux/inline-source $build_aux/bootstrap.in > bootstrap.new + + if func_cmp_s "$progpath" bootstrap.new; then + rm -f bootstrap.new + func_verbose "bootstrap script up to date" + else + chmod 555 bootstrap.new + func_warning upgrade "\ +An updated bootstrap script has been generated for you in +'bootstrap.new'. After you've verified that you want +the changes, you can update with: + mv -f bootstrap.new $progname + ./$progname + +Or you can disable this check permanently by adding the +following to 'bootstrap.conf': + require_bootstrap_uptodate=:" + fi + fi + + require_bootstrap_uptodate=: +} + + +# require_build_aux +# ----------------- +# Ensure that '$build_aux' is set, and if it doesn't already point to an +# existing directory, create one. +require_build_aux=func_require_build_aux +func_require_build_aux () +{ + $debug_cmd + + test -n "$build_aux" || { + func_extract_trace_first AC_CONFIG_AUX_DIR + build_aux=$func_extract_trace_first_result + func_check_configuration build_aux \ + "AC_CONFIG_AUX_DIR([name of a directory for build scripts])" + + func_verbose "build_aux='$build_aux'" + } + + $require_vc_ignore_files + + # If the build_aux directory doesn't exist, create it now, and mark it + # as ignored for the VCS. + if test ! -d "$build_aux"; then + func_show_eval "mkdir '$build_aux'" + + test -n "$vc_ignore_files" \ + || func_insert_if_absent "$build_aux" $vc_ignore_files + fi + + require_build_aux=: +} + + +# require_buildreq_autobuild +# -------------------------- +# Try to find whether the bootstrap requires autobuild. +require_buildreq_autobuild=func_require_buildreq_autobuild +func_require_buildreq_autobuild () +{ + $debug_cmd + + $require_macro_dir + + test -f "$macro_dir/autobuild.m4" \ + || printf '%s\n' "$buildreq" |func_grep_q '^[ ]*autobuild' \ + || { + func_extract_trace AB_INIT + test -n "$func_extract_trace_result" && { + func_append buildreq 'autobuild - http://josefsson.org/autobuild/ +' + func_verbose "auto-adding 'autobuild' to build requirements" + } + } + + require_buildreq_autobuild=: +} + + +# require_buildreq_autoconf +# require_buildreq_autopoint +# require_buildreq_libtoolize +# --------------------------- +# Try to find the minimum compatible version of autoconf/libtool +# required to bootstrap successfully, and add it to '$buildreq'. +for tool in autoconf libtoolize autopoint; do + b=$tool + v=require_buildreq_${tool} + f=func_$v + case $tool in + autoconf) m=AC_PREREQ ;; + libtoolize) m=LT_PREREQ; b=libtool ;; + autopoint) m=AM_GNU_GETTEXT_VERSION b=gettext ;; + esac + + eval $v'='$f' + '$f' () + { + $debug_cmd + + # The following is ignored if undefined, but might be necessary + # in order for `func_find_tool` to run. + ${require_'$tool'-:} + + printf '\''%s\n'\'' "$buildreq" |func_grep_q '\''^[ ]*'$tool\'' || { + func_extract_trace '$m' + _G_version=$func_extract_trace_result + test -n "$_G_version" && { + func_append buildreq "\ + '$tool' $_G_version http://www.gnu.org/s/'$b' +" + func_verbose \ + "auto-adding '\'$tool'-$_G_version'\'' to build requirements" + } + } + + '$v'=: + } +' +done + + +# require_buildreq_automake +# ------------------------- +# Try to find the minimum compatible version of automake required to +# bootstrap successfully, and add it to '$buildreq'. +require_buildreq_automake=func_require_buildreq_automake +func_require_buildreq_automake () +{ + $debug_cmd + + # if automake is not already listed in $buildreq... + printf '%s\n' "$buildreq" |func_grep_q automake || { + func_extract_trace AM_INIT_AUTOMAKE + + # ...and AM_INIT_AUTOMAKE is declared... + test -n "$func_extract_trace_result" && { + automake_version=`$ECHO "$func_extract_trace_result" \ + |$SED -e 's|[^0-9]*||' -e 's| .*$||'` + test -n "$automake_version" || automake_version=- + + func_append buildreq "\ + automake $automake_version http://www.gnu.org/s/automake +" + func_verbose \ + "auto-adding 'automake-$automake_version' to build requirements" + } + } + + require_buildreq_automake=: +} + + +# require_buildreq_patch +# ---------------------- +# Automatically add a patch build-requirement if there are diff files +# in $local_gl_dir. +require_buildreq_patch=func_require_buildreq_patch +func_require_buildreq_patch () +{ + $debug_cmd + + $require_local_gl_dir + + # This ensures PATCH is set appropriately by the time + # func_check_versions enforces $buildreq. + $require_patch + + # If patch is not already listed in $buildreq... + printf '%s\n' "$buildreq" |func_grep_q '^[ ]*patch' || { + # The ugly find invocation is necessary to exit with non-zero + # status for old find binaries that don't support -exec fully. + if test ! -d "$local_gl_dir" \ + || find "$local_gl_dir" -name "*.diff" -exec false {} \; ; then : + else + func_append buildreq 'patch - http://www.gnu.org/s/patch +' + fi + } + + require_buildreq_patch=: +} + + +# require_buildtools_uptodate +# --------------------------- +# Ensure all the packages listed in BUILDREQS are available on the build +# machine at the minimum versions or better. +require_buildtools_uptodate=func_require_buildtools_uptodate +func_require_buildtools_uptodate () +{ + $debug_cmd + + $require_buildreq_autobuild + $require_buildreq_autoconf + $require_buildreq_automake + $require_buildreq_libtoolize + $require_buildreq_autopoint + $require_buildreq_patch + + test -n "$buildreq" && { + _G_error_hdr= + + func_check_versions $buildreq + $func_check_versions_result || { + test -n "$buildreq_readme" \ + && test -f "$buildreq_readme" \ + && _G_error_hdr="\ +$buildreq_readme explains how to obtain these prerequisite programs: +" + func_strtable 0 11 12 36 \ + "Program" "Min_version" "Homepage" $buildreq + func_fatal_error "$_G_error_hdr$func_strtable_result" + } + } + + require_buildtools_uptodate=: +} + + +# require_copyright_holder +# ------------------------ +# Ensure there is a sensible non-empty default value in '$copyright_holder'. +require_copyright_holder=func_require_copyright_holder +func_require_copyright_holder () +{ + $debug_cmd + + test -n "$copyright_holder" || { + copyright_holder='Free Software Foundation, Inc.' + func_warning settings "\ +Please set copyright_holder explicitly in 'bootstrap.conf'; +defaulting to '$copyright_holder'." + } + + require_copyright_holder=: +} + + +# require_doc_base +# ---------------- +# Ensure doc_base has a sensible value, extracted from 'gnulib-cache.m4' +# if possible, otherwise letting 'gnulib-tool' pick a default. +require_doc_base=func_require_doc_base +func_require_doc_base () +{ + $debug_cmd + + $require_gnulib_cache + + test -f "$gnulib_cache" && test -z "$doc_base" && { + func_extract_trace_first "gl_DOC_BASE" "$gnulib_cache" + doc_base=$func_extract_trace_first_result + + test -n "$doc_base" && func_verbose "doc_base='$doc_base'" + } + + require_doc_base=: +} + + +# require_dotgitmodules +# --------------------- +# Ensure we have a '.gitmodules' file, with appropriate 'gnulib' settings. +require_dotgitmodules=func_require_dotgitmodules +func_require_dotgitmodules () +{ + $debug_cmd + + $require_git + + test true = "$GIT" || { + # A gnulib entry in .gitmodules always takes precedence. + _G_path=`$GIT config --file .gitmodules submodule.gnulib.path 2>/dev/null` + + test -n "$_G_path" || { + $require_vc_ignore_files + + func_verbose "creating '.gitmodules'" + + # If the .gitmodules file doesn't exist, create it now, and mark + # it as ignored for the VCS. + test -n "$gnulib_path" || gnulib_path=gnulib + test -n "$gnulib_url" || gnulib_url=git://git.sv.gnu.org/gnulib + + { + echo '[submodule "gnulib"]' + echo " path = $gnulib_path" + echo " url = $gnulib_url" + } >> .gitmodules + + test -n "$vc_ignore_files" \ + || func_insert_if_absent ".gitmodules" $vc_ignore_files + } + } + + require_dotgitmodules=: +} + + +# require_extra_locale_categories +# ------------------------------- +# Ensure there is a default value in '$extra_locale_categories' +require_extra_locale_categories=func_require_extra_locale_categories +func_require_extra_locale_categories () +{ + $debug_cmd + + # Defaults to empty, so run with whatever value may have been set in + # 'bootstrap.conf'. + require_extra_locale_categories=: +} + + +# require_git +# ----------- +# Ignore git if it's not available, or we're not in a git checkout tree. +require_git=func_require_git +func_require_git () +{ + $debug_cmd + + $opt_skip_git && GIT=true + + test true = "$GIT" || { + if test -d .git/.; then + ($GIT --version) >/dev/null 2>&1 || GIT=true + fi + } + + func_verbose "GIT='$GIT'" + + require_git=: +} + + +# require_gnulib_cache +# -------------------- +# Ensure there is a non-empty default for '$gnulib_cache', and that it +# names an existing file. +require_gnulib_cache=func_require_gnulib_cache +func_require_gnulib_cache () +{ + $debug_cmd + + $require_macro_dir + + test -n "$gnulib_cache" \ + || gnulib_cache=$macro_dir/gnulib-cache.m4 + + func_verbose "found '$gnulib_cache'" + + require_gnulib_cache=: +} + + +# require_gnulib_copy_cmd +# ----------------------- +# Only calculate the options for copying files with gnulib once. +require_gnulib_copy_cmd=func_require_gnulib_copy_cmd +func_require_gnulib_copy_cmd () +{ + $debug_cmd + + $require_gnulib_tool + $require_gnulib_tool_base_options + + gnulib_copy_cmd="$gnulib_tool $gnulib_tool_base_options --copy-file" + $opt_copy || func_append gnulib_copy_cmd " --symlink" + $opt_quiet || func_append gnulib_copy_cmd " --verbose" + + require_gnulib_copy_cmd=: +} + + +# require_gnulib_merge_changelog +# ------------------------------ +# See if we can use gnulib's git-merge-changelog merge driver. +require_gnulib_merge_changelog=func_require_gnulib_merge_changelog +func_require_gnulib_merge_changelog () +{ + $debug_cmd + + test -f ChangeLog && { + $require_git + + func_grep_q '^\(/\|\)ChangeLog$' .gitignore || test true = "$GIT" || { + if $GIT config merge.merge-changelog.driver >/dev/null; then + : + elif (git-merge-changelog --version) >/dev/null 2>&1; then + func_echo "initializing git-merge-changelog driver" + $GIT config merge.merge-changelog.name 'GNU-style ChangeLog merge driver' + $GIT config merge.merge-changelog.driver 'git-merge-changelog %O %A %B' + else + func_warning recommend \ + "Consider installing git-merge-changelog from gnulib." + fi + } + } + + require_gnulib_merge_changelog=: +} + + +# require_gnulib_mk +# ----------------- +# Ensure gnulib_mk has a sensible value, extracted from 'gnulib-cache.m4' +# if possible, otherwise letting 'gnulib-tool' pick a default. +require_gnulib_mk=func_require_gnulib_mk +func_require_gnulib_mk () +{ + $debug_cmd + + $require_gnulib_cache + + test -f "$gnulib_cache" && test -z "$gnulib_mk" && { + func_extract_trace_first "gl_MAKEFILE_NAME" "$gnulib_cache" + gnulib_mk=$func_extract_trace_first_result + + test -n "$gnulib_mk" && func_verbose "gnulib_mk='$gnulib_mk'" + } + + require_gnulib_mk=: +} + + +# require_gnulib_name +# ------------------- +# Ensure gnulib_name has a sensible value, extracted from 'gnulib-cache.m4' +# if possible, otherwise letting 'gnulib-tool' pick a default. +require_gnulib_name=func_require_gnulib_name +func_require_gnulib_name () +{ + $debug_cmd + + $require_gnulib_cache + + test -f "$gnulib_cache" && test -z "$gnulib_name" && { + func_extract_trace_first "gl_LIB" "$gnulib_cache" + gnulib_name=$func_extract_trace_first_result + + test -n "$gnulib_name" && func_verbose "gnulib_name='$gnulib_name'" + } + + require_gnulib_name=: +} + + +# require_gnulib_path +# require_gnulib_url +# ------------------- +# Ensure 'gnulib_path' and 'gnulib_url' are set. +require_gnulib_path=func_require_dotgitmodules_parameters +require_gnulib_url=func_require_dotgitmodules_parameters +func_require_dotgitmodules_parameters () +{ + $debug_cmd + + $require_git + + test true = "$GIT" && { + # If we can't find git (or if the user specified '--skip-git'), + # then use an existing gnulib directory specified with + # '--gnulib-srcdir' if possible. + test -n "$gnulib_path" \ + || test ! -x "$opt_gnulib_srcdir/gnulib-tool" \ + || gnulib_path=$opt_gnulib_srcdir + } + + + $require_dotgitmodules + + test -f .gitmodules && { + # Extract the parameters with sed, since git may be missing + test -n "$gnulib_path" \ + || gnulib_path=`$SED -e '/^.submodule "gnulib".$/,${ + /[ ]*path *= */{ + s|[ ]*||g;s|^[^=]*=||;p + } + } + d' .gitmodules |$SED 1q` + test -n "$gnulib_url" \ + || gnulib_url=`$SED -e '/^.submodule "gnulib".$/,${ + /[ ]*url *= */{ + s|[ ]*||g;s|^[^=]*=||;p + } + } + d' .gitmodules |$SED 1q` + + func_verbose "gnulib_path='$gnulib_path'" + func_verbose "gnulib_url='$gnulib_url'" + } + + require_gnulib_path=: + require_gnulib_url=: +} + + +# require_gnulib_submodule +# ------------------------ +# Ensure that there is a current gnulib submodule at '$gnulib_path'. +require_gnulib_submodule=func_require_gnulib_submodule +func_require_gnulib_submodule () +{ + $debug_cmd + + $require_git + + if test true = "$GIT"; then + func_warning recommend \ + "No 'git' found; imported gnulib modules may be outdated." + else + $require_gnulib_path + $require_gnulib_url + + if test -f .gitmodules && test -f "$gnulib_path/gnulib-tool"; then + : All present and correct. + + elif test -n "$opt_gnulib_srcdir"; then + # Older git can't clone into an empty directory. + rmdir "$gnulib_path" 2>/dev/null + func_show_eval "$GIT clone --reference '$opt_gnulib_srcdir' \ + '$gnulib_url' '$gnulib_path'" \ + || func_fatal_error "Unable to fetch gnulib submodule." + + # Without --gnulib-srcdir, and no existing checked out submodule, we + # create a new shallow clone of the remote gnulib repository. + else + trap func_cleanup_gnulib 1 2 13 15 + + shallow= + $GIT clone -h 2>&1 |func_grep_q -- --depth \ + && shallow='--depth 365' + + func_show_eval "$GIT clone $shallow '$gnulib_url' '$gnulib_path'" \ + func_cleanup_gnulib + + # FIXME: Solaris /bin/sh will try to execute '-' if any of + # these signals are caught after this. + trap - 1 2 13 15 + fi + + # Make sure we've checked out the correct revision of gnulib. + func_show_eval "$GIT submodule init -- $gnulib_path" \ + && func_show_eval "$GIT submodule update -- $gnulib_path" \ + || func_fatal_error "Unable to update gnulib submodule." + fi + + require_gnulib_submodule=: +} + + +# require_gnulib_tool +# ------------------- +# Ensure that '$gnulib_tool' is set, and points to an executable file, +# or else fall back to using the binary 'true' if the main gnulib +# files appear to have been imported already. +require_gnulib_tool=func_require_gnulib_tool +func_require_gnulib_tool () +{ + $debug_cmd + + test true = "$gnulib_tool" || { + $require_gnulib_submodule + $require_gnulib_path + + test -n "$gnulib_tool" \ + || gnulib_tool=$gnulib_path/gnulib-tool + + test -x "$gnulib_tool" || { + gnulib_tool=true + func_warning recommend \ + "No 'gnulib-tool' found; gnulib modules may be missing." + } + + test true = "$gnulib_tool" \ + || func_verbose "found '$gnulib_tool'" + } + + require_gnulib_tool=: +} + + +# require_gnulib_tool_base_options +# -------------------------------- +# Ensure that '$gnulib_tool_base_options' contains all the base options +# required according to user configuration from bootstrap.conf. +require_gnulib_tool_base_options=func_require_gnulib_tool_base_options +func_require_gnulib_tool_base_options () +{ + $debug_cmd + + $require_gnulib_tool + + gnulib_tool_base_options= + + test true = "$gnulib_tool" || { + # 'gnulib_modules' and others are maintained in 'bootstrap.conf': + # Use 'gnulib --import' to fetch gnulib modules. + $require_build_aux + test -n "$build_aux" \ + && func_append_uniq gnulib_tool_base_options " --aux-dir=$build_aux" + $require_macro_dir + test -n "$macro_dir" \ + && func_append_uniq gnulib_tool_base_options " --m4-base=$macro_dir" + $require_doc_base + test -n "$doc_base" \ + && func_append_uniq gnulib_tool_base_options " --doc-base=$doc_base" + $require_gnulib_name + test -n "$gnulib_name" \ + && func_append_uniq gnulib_tool_base_options " --lib=$gnulib_name" + $require_local_gl_dir + test -n "$local_gl_dir" \ + && func_append_uniq gnulib_tool_base_options " --local-dir=$local_gl_dir" + $require_source_base + test -n "$source_base" \ + && func_append_uniq gnulib_tool_base_options " --source-base=$source_base" + } + + require_gnulib_tool_base_options=: +} + + +# require_libtoolize +# ------------------ +# Skip libtoolize if it's not needed. +require_libtoolize=func_require_libtoolize +func_require_libtoolize () +{ + $debug_cmd + + # Unless we're not searching for libtool use by this package, set + # LIBTOOLIZE to true if none of 'LT_INIT', 'AC_PROG_LIBTOOL' and + # 'AM_PROG_LIBTOOL' are used in configure. + test true = "$LIBTOOLIZE" || { + func_extract_trace LT_INIT + test -n "$func_extract_trace_result" || func_extract_trace AC_PROG_LIBTOOL + test -n "$func_extract_trace_result" || func_extract_trace AM_PROG_LIBTOOL + test -n "$func_extract_trace_result" || LIBTOOLIZE=true + } + + test -n "$LIBTOOLIZE" || { + # Find libtoolize, named glibtoolize in Mac Ports, but prefer + # user-installed libtoolize to ancient glibtoolize shipped by + # Apple with Mac OS X when Mac Ports is not installed. + func_find_tool LIBTOOLIZE libtoolize glibtoolize + } + + test -n "$LIBTOOLIZE" || func_fatal_error "\ +Please install GNU Libtool, or 'export LIBTOOLIZE=/path/to/libtoolize'." + + func_verbose "export LIBTOOLIZE='$LIBTOOLIZE'" + + # Make sure the search result is visible to subshells + export LIBTOOLIZE + + require_libtoolize=: +} + + +# require_local_gl_dir +# -------------------- +# Ensure local_gl_dir has a sensible value, extracted from 'gnulib-cache.m4' +# if possible, otherwise letting 'gnulib-tool' pick a default. +require_local_gl_dir=func_require_local_gl_dir +func_require_local_gl_dir () +{ + $debug_cmd + + $require_gnulib_cache + + test -f "$gnulib_cache" && test -z "$local_gl_dir" && { + func_extract_trace_first "gl_LOCAL_DIR" "$gnulib_cache" + local_gl_dir=$func_extract_trace_first_result + + test -n "$local_gl_dir" && func_verbose "local_gl_dir='$local_gl_dir'" + } + + require_local_gl_dir=: +} + + +# require_macro_dir +# ----------------- +# Ensure that '$macro_dir' is set, and if it doesn't already point to an +# existing directory, create one. +require_macro_dir=func_require_macro_dir +func_require_macro_dir () +{ + $debug_cmd + + # Sometimes this is stored in 'configure.ac'. + test -n "$macro_dir" || { + # AC_CONFIG_MACRO_DIRS takes a space delimited list of directories, + # but we only care about the first one in bootstrap. + func_extract_trace_first AC_CONFIG_MACRO_DIRS + macro_dir=`expr "x$func_extract_trace_first_result" : 'x\([^ ]*\)'` + } + test -n "$macro_dir" || { + func_extract_trace_first AC_CONFIG_MACRO_DIR + macro_dir=$func_extract_trace_first_result + } + + # Otherwise we might find it in 'Makefile.am'. + test -n "$macro_dir" || { + $require_aclocal_amflags + + # Take the argument following the first '-I', if any. + _G_minus_I_seen=false + for _G_arg in $aclocal_amflags; do + case $_G_minus_I_seen,$_G_arg in + :,*) macro_dir=$_G_arg; break ;; + *,-I) _G_minus_I_seen=: ;; + *,-I*) macro_dir=`expr x$_G_arg : 'x-I\(.*\)$'`; break ;; + esac + done + } + + func_verbose "macro_dir='$macro_dir'" + + func_check_configuration macro_dir \ + "AC_CONFIG_MACRO_DIRS([name of a directory for configure m4 files])" + + $require_vc_ignore_files + + # If the macro_dir directory doesn't exist, create it now, and mark it + # as ignored for the VCS. + if test ! -d "$macro_dir"; then + mkdir "$macro_dir" || func_permissions_error "$macro_dir" + + test -n "$vc_ignore_files" \ + || func_insert_if_absent "$macro_dir" $vc_ignore_files + fi + + require_macro_dir=: +} + + +# require_makefile_am +# ------------------- +# Ensure there is a 'Makefile.am' in the current directory. +require_makefile_am=func_require_makefile_am +func_require_makefile_am () +{ + $debug_cmd + + test -n "$makefile_am" \ + || makefile_am=Makefile.am + + <"$makefile_am" + + func_verbose "found '$makefile_am'" + + require_makefile_am=: +} + + +# require_package +# --------------- +# Ensure that '$package' contains a sensible default value. +require_package=func_require_package +func_require_package () +{ + $debug_cmd + + test -n "$package" || { + $require_package_name + + package=`echo "$package_name" \ + |$SED -e 's/GNU //' \ + -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` + } + + func_verbose "package='$package'" + + require_package=: +} + + +# require_package_bugreport +# ------------------------- +# Ensure that this has a sensible value, extracted from 'configure.ac' +# if appropriate (and possible!). +require_package_bugreport=func_require_package_bugreport +func_require_package_bugreport () +{ + $debug_cmd + + func_extract_trace AC_INIT + + save_ifs=$IFS + IFS=: + set dummy $func_extract_trace_result + IFS=$save_ifs + shift + + test -n "$package_bugreport" || package_bugreport=$3 + func_check_configuration package_bugreport \ + "AC_INIT([$package_name], [$package_version], [bug-$package@gnu.org])" + func_verbose "package_bugreport='$package_bugreport'" + + require_package_bugreport=: +} + + +# require_package_name +# -------------------- +# Ensure that this has a sensible value, extracted from 'configure.ac' +# if appropriate (and possible!). +require_package_name=func_require_package_name +func_require_package_name () +{ + $debug_cmd + + func_extract_trace AC_INIT + + save_ifs=$IFS + IFS=: + set dummy $func_extract_trace_result + IFS=$save_ifs + shift + + test -n "$package_name" || package_name=$1 + func_check_configuration package_name \ + "AC_INIT([name of your package], [package version number])" + func_verbose "package_name='$package_name'" + + require_package_name=: +} + + +# require_package_version +# ----------------------- +# Ensure that this has a sensible value, extracted from 'configure.ac' +# if appropriate (and possible!). While we might have set all the +# parameters extracted from AC_INIT at once, 'package_version' in +# particular is not necessarily available as early as the others, since +# 'git-version-gen' is often involved, and until then we can't rely on +# getting a correct version number from an AC_INIT extraction. +require_package_version=func_require_package_version +func_require_package_version () +{ + $debug_cmd + + func_extract_trace AC_INIT + + save_ifs=$IFS + IFS=: + set dummy $func_extract_trace_result + IFS=$save_ifs + shift + + test -n "$package_version" || package_version=$2 + test -n "$package_version" || { + # The embedded echo is to squash whitespace before globbing. + case " "`echo $gnulib_modules`" " in + *" git-version-gen "*) + func_fatal_error "\ +cannot \$require_package_version in bootstrap.conf before +func_gnulib_tool has installed the 'git-version-gen' script." + ;; + *) + func_check_configuration package_version \ + "AC_INIT([name of your package], [package version number])" + ;; + esac + } + func_verbose "package_version='$package_version'" + + require_package_version=: +} + + +# require_patch +# ------------- +# Find patch, according to the PATCH environment variable, or else +# searching the user's PATH. +require_patch=func_require_patch +func_require_patch () +{ + $debug_cmd + + test -n "$PATCH" || { + # Find a patch program, preferring gpatch, which is usually better + # than the vendor patch. + func_find_tool PATCH gpatch patch + } + + test -n "$PATCH" || func_fatal_error "\ +Please install GNU Patch, or 'export PATCH=/path/to/gnu/patch'." + + func_verbose "export PATCH='$PATCH'" + + # Make sure the search result is visible to subshells + export PATCH + + require_patch=: +} + + +# require_source_base +# ------------------- +# Ensure that source_base has a sensible value, extracted from +# 'gnulib-cache.m4' if possible. +require_source_base=func_require_source_base +func_require_source_base () +{ + $debug_cmd + + $require_gnulib_cache + + test -f "$gnulib_cache" && test -z "$source_base" && { + func_extract_trace_first "gl_SOURCE_BASE" "$gnulib_cache" + + source_base=$func_extract_trace_first_result + + func_verbose "source_base='$source_base'" + } + + require_source_base=: +} + + +# require_vc_ignore_files +# ----------------------- +# Ensure that '$vc_ignore' has been processed to list VCS ignore files +# in '$vc_ignore_files' +require_vc_ignore_files=func_require_vc_ignore_files +func_require_vc_ignore_files () +{ + $debug_cmd + + test -n "$vc_ignore" || vc_ignore=auto + + if test auto = "$vc_ignore" && test -z "$vc_ignore_files"; then + vc_ignore_files= + test -d .git && vc_ignore_files=.gitignore + test -d CVS && vc_ignore_files="$vc_ignore_files .cvsignore" + else + vc_ignore_files=$vc_ignore + fi + + func_verbose "vc_ignore_files='$vc_ignore_files'" + + require_vc_ignore_files=: +} + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of 'bootstrap'. + +# func_len STRING +# --------------- +# STRING may not start with a hyphen. +if (eval 'x=123; test x${#x} = "x3"') 2>/dev/null +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo 0` + } +fi + + +# func_unset VAR +# -------------- +# Portably unset VAR. +# In some shells, an 'unset VAR' statement leaves a non-zero return +# status if VAR is already unset, which might be problematic if the +# statement is used at the end of a function (thus poisoning its return +# value) or when 'set -e' is active (causing even a spurious abort of +# the script in this case). +func_unset () +{ + { eval $1=; unset $1; } +} +unset=func_unset + + +# func_cmp_s FILE1 FILE2 +# ---------------------- +# Return non-zero exit status unless FILE1 and FILE2 are identical, without +# any output at all, even error messages. +func_cmp_s () +{ + $debug_cmd + + # This function relies on non-zero exit status, which will cause the + # program to exit when running in 'set -e' mode. + $CMP "$@" >/dev/null 2>&1 +} + + +# func_grep_q EXPRESSION [FILENAME..] +# ----------------------------------- +# Check whether EXPRESSION matches any line of any listed FILENAME, +# without any output at all, even error messages. +func_grep_q () +{ + $debug_cmd + + # This function relies on non-zero exit status, which will cause the + # program to exit when running in 'set -e' mode. + $GREP "$@" >/dev/null 2>&1 +} + + +# func_ifcontains LIST MEMBER YES-CMD [NO-CMD] +# -------------------------------------------- +# If whitespace-separated LIST contains MEMBER then execute YES-CMD, +# otherwise if NO-CMD was given, execute that. +func_ifcontains () +{ + $debug_cmd + + _G_wslist=$1 + _G_member=$2 + _G_yes_cmd=$3 + _G_no_cmd=${4-":"} + + _G_found=false + for _G_item in $_G_wslist; do + test "x$_G_item" = "x$_G_member" && { + _G_found=: + break + } + done + if $_G_found; then + eval "$_G_yes_cmd" + _G_status=$? + else + eval "$_G_no_cmd" + _G_status=$? + fi + + test 0 -eq "$_G_status" || exit $_G_status +} + + +# func_strpad STR WIDTH CHAR +# -------------------------- +# Trim STR, or pad with CHAR to force a total length of WIDTH. +func_strpad () +{ + $debug_cmd + + _G_width=`expr "$2" - 1` + func_strpad_result=`$ECHO "$1" |$SED ' + :a + s|^.\{0,'"$_G_width"'\}$|&'"$3"'| + ta + '` +} + + +# func_strrpad STR WIDTH CHAR +# --------------------------- +# Trim STR, or right-justify-pad with CHAR to force a total length of +# WIDTH. +func_strrpad () +{ + $debug_cmd + + _G_width=`expr "$2" - 1` + func_strrpad_result=`$ECHO "$1" |$SED ' + :a + s|^.\{0,'"$_G_width"'\}$|'"$3"'&| + ta + '` +} + + +# func_strrow INDENT FIELD WIDTH [FIELDn WIDTHn]... +# ------------------------------------------------- +# Return a string containing each FIELD left justified to WIDTH, with +# the whole thing indented by INDENT spaces. This function is used to +# render one row of aligned columns for a table by func_strtable(). +func_strrow () +{ + $debug_cmd + + func_strrow_linelen=$1; shift + + _G_row= + while test $# -gt 0; do + func_strrow_linelen=`expr $func_strrow_linelen + $2` + func_strpad "$1" $2 " " + func_append _G_row "$func_strpad_result" + shift; shift + done + + func_strrpad "$_G_row" $func_strrow_linelen " " + func_strrow_result=$func_strrpad_result +} + + +# func_strtable INDENT WIDTH1...WIDTHn HEADER1...HEADERn FIELD1...FIELDn +# ---------------------------------------------------------------------- +# Generate a string of newline-separated rows arranged in lined-up +# columns of the given WIDTHs, with the entire table indented by INDENT +# spaces. The number of columns is determined by the number of integer +# valued WIDTH arguments following INDENT. The next set (i.e. a number +# of arguments equal to the number of WIDTH arguments) of fields are +# treated as the table's column HEADERs, and are separated from the +# remainder of the table by an indented row of '-' characters. Remaining +# arguments are each aligned below the next available header, wrapping +# to a new row as necessary. Finally another row of '-' characters is +# added to mark the end of the table. +# +# For example an unindented 3 column table with 2 rows of data would be +# generated by this call: +# +# func_strtable 3 20 10 25 \ +# Header1 Header2 Header3 \ +# Row1Col1 Row1Col2 Row1Col3 \ +# Row2Col1 Row2Col2 Row2Col3 +# +# returning the following string: +# +# " Header1 Header2 Header3 +# ------------------------------------------------------- +# Row1Col1 Row1Col2 Row1Col3 +# Row2Col1 Row2Col2 Row2Col3 +# -------------------------------------------------------" +func_strtable () +{ + $debug_cmd + + # Save the indent value, we'll need it for each row we render. + _G_indent=$1; shift + + # Collect remaining numeric args into a list for reuse between + # members of each row when we call func_strrow later. + _G_widths=$1; shift + while test 0 -lt `expr "$1" : '[1-9][0-9]*$'`; do + func_append _G_widths " $1"; shift + done + + # Extract the same number of positional parameters as there are + # width elements - we'll do the header rows separately so that + # we can insert a divider line. + _G_header=$_G_indent + for _G_width in $_G_widths; do + func_append _G_header " $1 $_G_width"; shift + done + func_strrow $_G_header + + # Strip off the indent, and make a divider with '-' chars, then + # reindent. + _G_divider=`$ECHO "$func_strrow_result" \ + |$SED 's|[^ ]|-|g + :a + s|- |--|g + ta + '` + + # Append the header and divider to the running result. + func_append func_strtable_result "\ +$func_strrow_result +$_G_divider +" + + # The remaining rows are zipped between the width values we + # unwound earlier just like the header row above. + while test $# -gt 0; do + _G_row=$_G_indent + for _G_width in $_G_widths; do + func_append _G_row " $1 $_G_width"; shift + done + func_strrow $_G_row + func_append func_strtable_result "\ +$func_strrow_result +" + done + + # Mark the end of the table with a final divider line. + func_append func_strtable_result "$_G_divider" +} + + +# func_internal_error ARG... +# -------------------------- +# Echo program name prefixed message to standard error, and exit. +func_internal_error () +{ + func_fatal_error "\ +INTERNAL: " ${1+"$@"} " + Please report this bug to 'bug-gnulib@gnu.org' + in as much detail as possible." +} + + +# func_permissions_error FILE-OR-DIRECTORY +# ---------------------------------------- +# Echo program name prefixed permissions error message to standard +# error, and exit. +func_permissions_error () +{ + $debug_cmd + + func_fatal_error "Failed to create '$1', check permissions." +} + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + $require_term_colors + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + ${opt_silent-'false'} || { + func_quote_for_eval $_G_cmd + eval func_truncate_cmd $func_quote_for_eval_result + func_echo "running: $tc_bold$func_truncate_cmd_result$tc_reset" + } + + ${opt_dry_run-'false'} || { + eval "$_G_cmd" + _G_status=$? + test 0 -eq "$_G_status" || eval "(exit $_G_status); $_G_fail_exp" + } +} + + +# func_truncate_cmd CMD [ARG]... +# ------------------------------ +# For unreasonably long commands (such as a gnulib-tool invocation with +# the full module list for import), truncate CMD after the second non- +# option ARG. +func_truncate_cmd () +{ + $debug_cmd + + _G_last_arg_opt_p=false + func_truncate_cmd_result= + + set dummy "$@"; shift + + while test $# -gt 0; do + _G_opt=$1; shift + + test -n "$func_truncate_cmd_result" \ + && func_append func_truncate_cmd_result ' ' + func_append func_truncate_cmd_result "$_G_opt" + + func_len "x$func_truncate_cmd_result" + + case $_G_opt in + -*) _G_last_arg_opt_p=: ;; + *) $_G_last_arg_opt_p \ + || test "$min_cmd_len" -gt "$func_len_result" \ + || break + _G_last_arg_opt_p=false + ;; + esac + done + + test $# -gt 0 && func_append func_truncate_cmd_result "..." +} + + +# func_gitignore_entries FILE... +# ------------------------------ +# Strip blank and comment lines to leave significant entries. +func_gitignore_entries () +{ + $debug_cmd + + $SED -e '/^#/d' -e '/^$/d' "$@" +} + + +# func_insert_if_absent STR FILE... +# --------------------------------- +# If $STR is not already on a line by itself in $FILE, insert it, at the +# start. Entries are inserted at the start of the ignore list to ensure +# existing entries starting with ! are not overridden. Such entries +# support whilelisting exceptions after a more generic blacklist pattern. +# sorting the new contents of the file and replacing $FILE with the result. +func_insert_if_absent () +{ + $debug_cmd + + str=$1 + shift + + for file + do + test -f "$file" || touch "$file" + + duplicate_entries=`func_gitignore_entries "$file" |sort |uniq -d` + test -n "$duplicate_entries" \ + && func_error "duplicate entries in $file: " $duplicate_entries + + func_grep_q "^$str\$" "$file" \ + || func_verbose "inserting '$str' into '$file'" + + linesold=`func_gitignore_entries "$file" |wc -l` + linesnew=`{ $ECHO "$str"; cat "$file"; } \ + |func_gitignore_entries |sort -u |wc -l` + test "$linesold" -eq "$linesnew" \ + || { $SED "1i\\$nl$str$nl" "$file" >"$file"T && mv "$file"T "$file"; } \ + || func_permissions_error "$file" + done +} + + +# func_get_version APP +# -------------------- +# echo the version number (if any) of APP, which is looked up along your +# PATH. +func_get_version () +{ + $debug_cmd + + _G_app=$1 + + # Rather than uncomment the sed script in-situ, strip the comments + # programatically before passing the result to $SED for evaluation. + sed_get_version=`$ECHO '# extract version within line + s|.*[v ]\{1,\}\([0-9]\{1,\}\.[.a-z0-9-]*\).*|\1| + t done + + # extract version at start of line + s|^\([0-9]\{1,\}\.[.a-z0-9-]*\).*|\1| + t done + + d + + :done + # the following essentially does s|5.005|5.5| + s|\.0*\([1-9]\)|.\1|g + p + q' \ + |$SED '/^[ ]*#.*$/d'` + + func_tool_version_output $_G_app >/dev/null + _G_status=$? + + test 0 -ne "$_G_status" \ + || $_G_app --version 2>&1 |$SED -n "$sed_get_version" + + (exit $_G_status) +} + + +# func_check_tool APP +# ------------------- +# Search PATH for an executable at APP. +func_check_tool () +{ + $debug_cmd + + func_check_tool_result= + + case $1 in + *[\\/]*) + test -x "$1" && func_check_tool_result=$1 + ;; + *) + save_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for _G_check_tool_path in $PATH; do + IFS=$save_IFS + if test -x "$_G_check_tool_path/$1"; then + func_check_tool_result=$_G_check_tool_path/$1 + break + fi + done + IFS=$save_IFS + ;; + esac +} + + +# func_check_versions APP1 VER1 URL1 ...[APPN VERN URLN] +# ------------------------------------------------------ +func_check_versions () +{ + $debug_cmd + + func_check_versions_result=: + + while test $# -gt 0; do + _G_app=$1; shift + _G_reqver=$1; shift + _G_url=$1; shift + + # Diagnose bad buildreq formatting. + case $_G_url in + [a-z]*://*) ;; # looks like a url + *) func_fatal_error "\ +'$_G_url' from the buildreq table in +'bootstrap.conf' does not look like the URL for downloading +$_G_app. Please ensure that buildreq is a strict newline +delimited list of triples; 'program min-version url'." + ;; + esac + + # Honor $APP variables ($TAR, $AUTOCONF, etc.) + _G_appvar=`echo $_G_app |tr '[a-z]' '[A-Z]'` + test TAR = "$_G_appvar" && _G_appvar=AMTAR + eval "_G_app=\${$_G_appvar-$_G_app}" + + # Fail if no version specified, but the program can't be found. + if test x- = "x$_G_reqver"; then + func_check_tool $_G_app + if test -z "$func_check_tool_result"; then + func_error "Prerequisite '$_G_app' not not found. Please install it, or +'export $_G_appvar=/path/to/$_G_app'." + func_check_versions_result=false + else + func_verbose "found '$func_check_tool_result' for $_G_appvar." + fi + else + _G_instver=`func_get_version $_G_app` + + # Fail if --version didn't work. + if test -z "$_G_instver"; then + func_error "Prerequisite '$_G_app' not found. Please install it, or +'export $_G_appvar=/path/to/$_G_app'." + func_check_versions_result=false + + # Fail if a newer version than what we have is required. + else + func_verbose "found '$_G_app' version $_G_instver." + + case $_G_reqver in + =*) + # If $buildreq version starts with '=', version must + # match the installed program exactly. + test "x$_G_reqver" = "x=$_G_instver" || { + func_error "\ + '$_G_app' version == $_G_instver is too old + 'exactly $_G_app-$_G_reqver is required" + func_check_versions_result=false + } + ;; + *) + # Otherwise, anything that is not older is a match. + func_lt_ver "$_G_reqver" "$_G_instver" || { + func_error "\ + '$_G_app' version == $_G_instver is too old + '$_G_app' version >= $_G_reqver is required" + func_check_versions_result=false + } + ;; + esac + fi + fi + done +} + + +# func_cleanup_gnulib +# ------------------- +# Recursively delete everything below the path in the global variable +# GNULIB_PATH. +func_cleanup_gnulib () +{ + $debug_cmd + + _G_status=$? + $RM -fr "$gnulib_path" + exit $_G_status +} + + +# func_download_po_files SUBDIR DOMAIN +# ------------------------------------ +func_download_po_files () +{ + $debug_cmd + + func_echo "getting translations into $1 for $2..." + _G_cmd=`printf "$po_download_command_format" "$2" "$1"` + eval "$_G_cmd" +} + + +# func_update_po_files PO_DIR DOMAIN +# ---------------------------------- +# Mirror .po files to $po_dir/.reference and copy only the new +# or modified ones into $po_dir. Also update $po_dir/LINGUAS. +# Note po files that exist locally only are left in $po_dir but will +# not be included in LINGUAS and hence will not be distributed. +func_update_po_files () +{ + $debug_cmd + + # Directory containing primary .po files. + # Overwrite them only when we're sure a .po file is new. + _G_po_dir=$1 + _G_domain=$2 + + # Mirror *.po files into this dir. + # Usually contains *.s1 checksum files. + _G_ref_po_dir=$_G_po_dir/.reference + + test -d "$_G_ref_po_dir" || mkdir $_G_ref_po_dir || return + func_download_po_files $_G_ref_po_dir $_G_domain \ + && ls "$_G_ref_po_dir"/*.po 2>/dev/null \ + |$SED -e 's|.*/||' -e 's|\.po$||' > "$_G_po_dir/LINGUAS" || return + + # Find sha1sum, named gsha1sum on MacPorts, and shasum on MacOS 10.6+. + func_find_tool SHA1SUM sha1sum gsha1sum shasum sha1 + + test -n "$SHA1SUM" || func_fatal_error "\ +Please install GNU Coreutils, or 'export SHA1SUM=/path/to/sha1sum'." + + _G_langs=`cd $_G_ref_po_dir && echo *.po|$SED 's|\.po||g'` + test '*' = "$_G_langs" && _G_langs=x + for _G_po in $_G_langs; do + case $_G_po in x) continue;; esac + _G_new_po=$_G_ref_po_dir/$_G_po.po + _G_cksum_file=$_G_ref_po_dir/$_G_po.s1 + if ! test -f "$_G_cksum_file" || + ! test -f "$_G_po_dir/$_G_po.po" || + ! $SHA1SUM -c "$_G_cksum_file" \ + < "$_G_new_po" > /dev/null; then + echo "updated $_G_po_dir/$_G_po.po..." + cp "$_G_new_po" "$_G_po_dir/$_G_po.po" \ + && $SHA1SUM < "$_G_new_po" > "$_G_cksum_file" || return + fi + done +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]...' + +# Short help message in response to '-h'. Add to this in 'bootstrap.conf' +# if you accept any additional options. +usage_message="Common Bootstrap Options: + -c, --copy copy files instead of creating symbolic links. + --debug enable verbose shell tracing + -n, --dry-run print commands rather than running them + -f, --force attempt to bootstrap even if the sources seem not + to have been checked out. + --gnulib-srcdir=DIRNAME + specify a local directory where gnulib sources + reside. Use this if you already have the gnulib + sources on your machine, and don't want to waste + your bandwidth downloading them again. Defaults to + \$GNULIB_SRCDIR. + --no-warnings equivalent to '-Wnone' + --skip-git do not fetch files from remote repositories + --skip-po do not download po files. + -v, --verbose verbosely report processing + --version print version information and exit + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=$long_help_message" + 'recommend' show warnings about missing recommended packages + 'settings' show warnings about missing '$progname.conf' settings + 'upgrade' show warnings about out-dated files + +If the file '$progname.conf' exists in the same directory as this +script, its contents are read as shell variables to configure the +bootstrap. + +For build prerequisites, environment variables like \$AUTOCONF and +\$AMTAR are honored. + +Running without arguments will suffice in most cases. +" + +# Warning categories used by 'bootstrap', append others if you use them +# in your 'bootstrap.conf'. +warning_categories='recommend settings upgrade' + + +# bootstrap_options_prep [ARG]... +# ------------------------------- +# Preparation for options parsed by Bootstrap. +bootstrap_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_copy=${copy-'false'} + opt_dry_run=false + opt_force=false + opt_gnulib_srcdir=$GNULIB_SRCDIR + opt_skip_git=false + opt_skip_po=false + + # Pass back the list of options we consumed. + func_quote_for_eval ${1+"$@"} + bootstrap_options_prep_result=$func_quote_for_eval_result +} +func_add_hook func_options_prep bootstrap_options_prep + + +# bootstrap_parse_options [ARG]... +# -------------------------------- +# Provide handling for Bootstrap specific options. +bootstrap_parse_options () +{ + $debug_cmd + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: ;; + --copy|-c) opt_copy=: ;; + --force|-f) opt_force=: ;; + + --gnulib-srcdir) + test $# = 0 && func_missing_arg $_G_opt && break + opt_gnulib_srcdir=$1 + shift + ;; + + --skip-git|--no-git) + opt_skip_git=: + ;; + + --skip-po|--no-po) + opt_skip_po=: + ;; + + # Separate non-argument short options: + -c*|-f*|-n*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + bootstrap_parse_options_result=$func_quote_for_eval_result +} +func_add_hook func_parse_options bootstrap_parse_options + + +# bootstrap_validate_options [ARG]... +# ----------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +bootstrap_validate_options () +{ + $debug_cmd + + # Validate options. + test $# -gt 0 \ + && func_fatal_help "too many arguments" + + # Pass back the (empty) list of unconsumed options. + func_quote_for_eval ${1+"$@"} + bootstrap_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options bootstrap_validate_options + + +## -------------------------------------------------- ## +## Source package customisations in 'bootstrap.conf'. ## +## -------------------------------------------------- ## + +# Override the default configuration, if necessary. +# Make sure that bootstrap.conf is sourced from the current directory +# if we were invoked as "sh bootstrap". +case $0 in + */*) test -r "$0.conf" && . "$0.conf" ;; + *) test -r "$0.conf" && . ./"$0.conf" ;; +esac + + +## ------------------------------- ## +## Actually perform the bootstrap. ## +## ------------------------------- ## + +func_bootstrap ${1+"$@"} + +# The End. +exit ${exit_status-$EXIT_SUCCESS} + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "500/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: diff --git a/bootstrap.conf b/bootstrap.conf new file mode 100644 index 0000000..a3b7dd5 --- /dev/null +++ b/bootstrap.conf @@ -0,0 +1,134 @@ +# bootstrap.conf (luaposix) version 2015-01-01 +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 Gary V. Vaughan + +# This file is part of luaposix. +# See README for license. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# List of programs, minimum versions, and download urls required to +# bootstrap, maintain and release this project. + +buildreq=' + git - http://git-scm.com + help2man 1.29 http://www.gnu.org/s/help2man + ldoc 1.4.2 http://rocks.moonscript.org/manifests/steved/ldoc-1.4.2-1.rockspec + specl 14.1.0 http://rocks.moonscript.org/manifests/gvvaughan/specl-14.1.0-1.rockspec +' + +# List of slingshot files to link into stdlib tree before autotooling. +slingshot_files=' + .autom4te.cfg + GNUmakefile + Makefile.am + build-aux/do-release-commit-and-tag + build-aux/gitlog-to-changelog + build-aux/mkrockspecs + build-aux/release.mk + build-aux/rockspecs.mk + build-aux/sanity.mk + build-aux/specl.mk + build-aux/update-copyright + m4/ax_lua.m4 + travis.yml.in +' + +# Prequisite rocks that need to be installed for travis builds to work. +travis_extra_rocks=' + ansicolors + ldoc + specl +' + +# Additional gnulib-tool options to use. +gnulib_tool_options=' + --no-changelog + --avoid=dummy +' + +# gnulib modules used by this package. +gnulib_modules=' + warnings + manywarnings +' + +# Extra gnulib files that are not in modules, which override files of +# the same name installed by other bootstrap tools. +gnulib_non_module_files=' + doc/INSTALL + build-aux/config.guess + build-aux/config.sub + build-aux/install-sh +' + +# We don't actually use any gnulib C code, but that's no reason to +# let the defaults nuke our lib directory! +source_base=unused + + +## --------------- ## +## Hook functions. ## +## --------------- ## + +# Even though we don't get our gitlog-to-changelog from gnulib, this +# function is still useful to us! +func_add_hook func_gnulib_tool func_ensure_changelog + + +# luaposix_ignore_gnulib_ignore +# ---------------------------- +# gnulib-tool updates m4/.gitignore and lib/.gitignore, and keeping +# generated files under version control does not make sense. Since +# lib is entirely ignored, we only need to prepopulate the m4 ignore +# files with generated files not tracked by gnulib-tool. +luaposix_ignore_gnulib_ignore () +{ + $debug_cmd + + $require_macro_dir + + if test -f "$macro_dir/.gitignore" ; then + : + else + func_verbose "creating initial \`$macro_dir/.gitignore'" + cat > $macro_dir/.gitignore <<\EOF +# files created by bootstrap, but that gnulib doesn't track +*~ +/.gitignore +/gnulib-cache.m4 +/gnulib-comp.m4 +/libtool.m4 +/ltoptions.m4 +/ltsugar.m4 +/ltversion.m4 +/lt~obsolete.m4 +EOF + fi +} +func_add_hook func_prep luaposix_ignore_gnulib_ignore + + +# luaposix_remove_empty_lib +# ------------------------- +# No need to maintain the always empty lib subdir. +luaposix_remove_empty_lib () +{ + $debug_cmd + + rm -rf $source_base +} +func_add_hook func_gnulib_tool luaposix_remove_empty_lib + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "# bootstrap.conf (luaposix) version " +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "$" +# End: diff --git a/build-aux/ar-lib b/build-aux/ar-lib new file mode 100755 index 0000000..463b9ec --- /dev/null +++ b/build-aux/ar-lib @@ -0,0 +1,270 @@ +#! /bin/sh +# Wrapper for Microsoft lib.exe + +me=ar-lib +scriptversion=2012-03-01.08; # UTC + +# Copyright (C) 2010-2014 Free Software Foundation, Inc. +# Written by Peter Rosin . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + + +# func_error message +func_error () +{ + echo "$me: $1" 1>&2 + exit 1 +} + +file_conv= + +# func_file_conv build_file +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv in + mingw) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_at_file at_file operation archive +# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE +# for each of them. +# When interpreting the content of the @FILE, do NOT use func_file_conv, +# since the user would need to supply preconverted file names to +# binutils ar, at least for MinGW. +func_at_file () +{ + operation=$2 + archive=$3 + at_file_contents=`cat "$1"` + eval set x "$at_file_contents" + shift + + for member + do + $AR -NOLOGO $operation:"$member" "$archive" || exit $? + done +} + +case $1 in + '') + func_error "no command. Try '$0 --help' for more information." + ;; + -h | --h*) + cat <. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/build-aux/config.guess b/build-aux/config.guess new file mode 100755 index 0000000..dbfb978 --- /dev/null +++ b/build-aux/config.guess @@ -0,0 +1,1421 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2015 Free Software Foundation, Inc. + +timestamp='2015-01-01' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2015 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + *:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi + else + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-${LIBC} + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-${LIBC} + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; +esac + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/build-aux/config.ld.in b/build-aux/config.ld.in new file mode 100644 index 0000000..148d0e0 --- /dev/null +++ b/build-aux/config.ld.in @@ -0,0 +1,64 @@ +-- -*- lua -*- +title = "@PACKAGE_STRING@ Reference" +project = "@PACKAGE_STRING@" +description = "POSIX bindings for Lua (including curses)" + +tparam_alias "string" +tparam_alias "int" +tparam_alias "bool" + +-- Manual page links point to the OpenGroup SUSv3 spec. +local upat = "http://pubs.opengroup.org/onlinepubs/009695399/functions/%s.html" +custom_see_handler("^([%w_]+)%((%dx?)%)$",function(name,section) + local url = upat:format(name) + return name .. "(" .. section .. ")", url +end) + +dir = "." +file = { + -- Classes + "../ext/posix/curses/chstr.c", + "../ext/posix/curses/window.c", + + -- Modules + "../lib/posix/init.lua", + "../lib/posix/compat.lua", -- Documents added to posix module + + "../ext/posix/ctype.c", + "../ext/posix/curses.c", + "../ext/posix/dirent.c", + "../ext/posix/errno.c", + "../ext/posix/fcntl.c", + "../ext/posix/fnmatch.c", + "../ext/posix/getopt.c", + "../ext/posix/glob.c", + "../ext/posix/grp.c", + "../ext/posix/libgen.c", + "../ext/posix/poll.c", + "../ext/posix/pwd.c", + "../ext/posix/sched.c", + "../ext/posix/signal.c", + "../ext/posix/stdio.c", + "../ext/posix/stdlib.c", + "../ext/posix/sys/msg.c", + "../ext/posix/sys/resource.c", + "../ext/posix/sys/socket.c", + "../ext/posix/sys/stat.c", + "../ext/posix/sys/statvfs.c", + "../ext/posix/sys/time.c", + "../ext/posix/sys/times.c", + "../ext/posix/sys/utsname.c", + "../ext/posix/sys/wait.c", + "../ext/posix/syslog.c", + "../ext/posix/termio.c", + "../ext/posix/time.c", + "../ext/posix/unistd.c", + "../ext/posix/utime.c", +} +examples = "../examples" + +boilerplate = true +backtick_references = false +format = "markdown" +merge = true +sort = true diff --git a/build-aux/config.sub b/build-aux/config.sub new file mode 100755 index 0000000..6d2e94c --- /dev/null +++ b/build-aux/config.sub @@ -0,0 +1,1807 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2015 Free Software Foundation, Inc. + +timestamp='2015-01-01' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2015 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | epiphany \ + | fido | fr30 | frv | ft32 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 | or1k | or1knd | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ + | riscv32 | riscv64 \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | visium \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | k1om-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | or1k*-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | visium-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i686-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/build-aux/depcomp b/build-aux/depcomp new file mode 100755 index 0000000..fc98710 --- /dev/null +++ b/build-aux/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2013-05-30.07; # UTC + +# Copyright (C) 1999-2014 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/build-aux/gitlog-to-changelog b/build-aux/gitlog-to-changelog new file mode 100755 index 0000000..e02d34c --- /dev/null +++ b/build-aux/gitlog-to-changelog @@ -0,0 +1,432 @@ +eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}' + & eval 'exec perl -wS "$0" $argv:q' + if 0; +# Convert git log output to ChangeLog format. + +my $VERSION = '2012-07-29 06:11'; # UTC +# The definition above must lie within the first 8 lines in order +# for the Emacs time-stamp write hook (at end) to update it. +# If you change this file with Emacs, please let the write hook +# do its job. Otherwise, update this string manually. + +# Copyright (C) 2008-2013 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Written by Jim Meyering + +use strict; +use warnings; +use Getopt::Long; +use POSIX qw(strftime); + +(my $ME = $0) =~ s|.*/||; + +# use File::Coda; # http://meyering.net/code/Coda/ +END { + defined fileno STDOUT or return; + close STDOUT and return; + warn "$ME: failed to close standard output: $!\n"; + $? ||= 1; +} + +sub usage ($) +{ + my ($exit_code) = @_; + my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR); + if ($exit_code != 0) + { + print $STREAM "Try '$ME --help' for more information.\n"; + } + else + { + print $STREAM < ChangeLog + $ME -- -n 5 foo > last-5-commits-to-branch-foo + +SPECIAL SYNTAX: + +The following types of strings are interpreted specially when they appear +at the beginning of a log message line. They are not copied to the output. + + Copyright-paperwork-exempt: Yes + Append the "(tiny change)" notation to the usual "date name email" + ChangeLog header to mark a change that does not require a copyright + assignment. + Co-authored-by: Joe User + List the specified name and email address on a second + ChangeLog header, denoting a co-author. + Signed-off-by: Joe User + These lines are simply elided. + +In a FILE specified via --amend, comment lines (starting with "#") are ignored. +FILE must consist of pairs where SHA is a 40-byte SHA1 (alone on +a line) referring to a commit in the current project, and CODE refers to one +or more consecutive lines of Perl code. Pairs must be separated by one or +more blank line. + +Here is sample input for use with --amend=FILE, from coreutils: + +3a169f4c5d9159283548178668d2fae6fced3030 +# fix typo in title: +s/all tile types/all file types/ + +1379ed974f1fa39b12e2ffab18b3f7a607082202 +# Due to a bug in vc-dwim, I mis-attributed a patch by Paul to myself. +# Change the author to be Paul. Note the escaped "@": +s,Jim .*>,Paul Eggert , + +EOF + } + exit $exit_code; +} + +# If the string $S is a well-behaved file name, simply return it. +# If it contains white space, quotes, etc., quote it, and return the new string. +sub shell_quote($) +{ + my ($s) = @_; + if ($s =~ m![^\w+/.,-]!) + { + # Convert each single quote to '\'' + $s =~ s/\'/\'\\\'\'/g; + # Then single quote the string. + $s = "'$s'"; + } + return $s; +} + +sub quoted_cmd(@) +{ + return join (' ', map {shell_quote $_} @_); +} + +# Parse file F. +# Comment lines (starting with "#") are ignored. +# F must consist of pairs where SHA is a 40-byte SHA1 +# (alone on a line) referring to a commit in the current project, and +# CODE refers to one or more consecutive lines of Perl code. +# Pairs must be separated by one or more blank line. +sub parse_amend_file($) +{ + my ($f) = @_; + + open F, '<', $f + or die "$ME: $f: failed to open for reading: $!\n"; + + my $fail; + my $h = {}; + my $in_code = 0; + my $sha; + while (defined (my $line = )) + { + $line =~ /^\#/ + and next; + chomp $line; + $line eq '' + and $in_code = 0, next; + + if (!$in_code) + { + $line =~ /^([0-9a-fA-F]{40})$/ + or (warn "$ME: $f:$.: invalid line; expected an SHA1\n"), + $fail = 1, next; + $sha = lc $1; + $in_code = 1; + exists $h->{$sha} + and (warn "$ME: $f:$.: duplicate SHA1\n"), + $fail = 1, next; + } + else + { + $h->{$sha} ||= ''; + $h->{$sha} .= "$line\n"; + } + } + close F; + + $fail + and exit 1; + + return $h; +} + +# git_dir_option $SRCDIR +# +# From $SRCDIR, the --git-dir option to pass to git (none if $SRCDIR +# is undef). Return as a list (0 or 1 element). +sub git_dir_option($) +{ + my ($srcdir) = @_; + my @res = (); + if (defined $srcdir) + { + my $qdir = shell_quote $srcdir; + my $cmd = "cd $qdir && git rev-parse --show-toplevel"; + my $qcmd = shell_quote $cmd; + my $git_dir = qx($cmd); + defined $git_dir + or die "$ME: cannot run $qcmd: $!\n"; + $? == 0 + or die "$ME: $qcmd had unexpected exit code or signal ($?)\n"; + chomp $git_dir; + push @res, "--git-dir=$git_dir/.git"; + } + @res; +} + +{ + my $since_date; + my $format_string = '%s%n%b%n'; + my $amend_file; + my $append_dot = 0; + my $cluster = 1; + my $strip_tab = 0; + my $strip_cherry_pick = 0; + my $srcdir; + GetOptions + ( + help => sub { usage 0 }, + version => sub { print "$ME version $VERSION\n"; exit }, + 'since=s' => \$since_date, + 'format=s' => \$format_string, + 'amend=s' => \$amend_file, + 'append-dot' => \$append_dot, + 'cluster!' => \$cluster, + 'strip-tab' => \$strip_tab, + 'strip-cherry-pick' => \$strip_cherry_pick, + 'srcdir=s' => \$srcdir, + ) or usage 1; + + defined $since_date + and unshift @ARGV, "--since=$since_date"; + + # This is a hash that maps an SHA1 to perl code (i.e., s/old/new/) + # that makes a correction in the log or attribution of that commit. + my $amend_code = defined $amend_file ? parse_amend_file $amend_file : {}; + + my @cmd = ('git', + git_dir_option $srcdir, + qw(log --log-size), + '--pretty=format:%H:%ct %an <%ae>%n%n'.$format_string, @ARGV); + open PIPE, '-|', @cmd + or die ("$ME: failed to run '". quoted_cmd (@cmd) ."': $!\n" + . "(Is your Git too old? Version 1.5.1 or later is required.)\n"); + + my $prev_multi_paragraph; + my $prev_date_line = ''; + my @prev_coauthors = (); + while (1) + { + defined (my $in = ) + or last; + $in =~ /^log size (\d+)$/ + or die "$ME:$.: Invalid line (expected log size):\n$in"; + my $log_nbytes = $1; + + my $log; + my $n_read = read PIPE, $log, $log_nbytes; + $n_read == $log_nbytes + or die "$ME:$.: unexpected EOF\n"; + + # Extract leading hash. + my ($sha, $rest) = split ':', $log, 2; + defined $sha + or die "$ME:$.: malformed log entry\n"; + $sha =~ /^[0-9a-fA-F]{40}$/ + or die "$ME:$.: invalid SHA1: $sha\n"; + + # If this commit's log requires any transformation, do it now. + my $code = $amend_code->{$sha}; + if (defined $code) + { + eval 'use Safe'; + my $s = new Safe; + # Put the unpreprocessed entry into "$_". + $_ = $rest; + + # Let $code operate on it, safely. + my $r = $s->reval("$code") + or die "$ME:$.:$sha: failed to eval \"$code\":\n$@\n"; + + # Note that we've used this entry. + delete $amend_code->{$sha}; + + # Update $rest upon success. + $rest = $_; + } + + # Remove lines inserted by "git cherry-pick". + if ($strip_cherry_pick) + { + $rest =~ s/^\s*Conflicts:\n.*//sm; + $rest =~ s/^\s*\(cherry picked from commit [\da-f]+\)\n//m; + } + + my @line = split "\n", $rest; + my $author_line = shift @line; + defined $author_line + or die "$ME:$.: unexpected EOF\n"; + $author_line =~ /^(\d+) (.*>)$/ + or die "$ME:$.: Invalid line " + . "(expected date/author/email):\n$author_line\n"; + + # Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog + # `(tiny change)' annotation. + my $tiny = (grep (/^Copyright-paperwork-exempt:\s+[Yy]es$/, @line) + ? ' (tiny change)' : ''); + + my $date_line = sprintf "%s %s$tiny\n", + strftime ("%F", localtime ($1)), $2; + + my @coauthors = grep /^Co-authored-by:.*$/, @line; + # Omit meta-data lines we've already interpreted. + @line = grep !/^(?:Signed-off-by:[ ].*>$ + |Co-authored-by:[ ] + |Copyright-paperwork-exempt:[ ] + )/x, @line; + + # Remove leading and trailing blank lines. + if (@line) + { + while ($line[0] =~ /^\s*$/) { shift @line; } + while ($line[$#line] =~ /^\s*$/) { pop @line; } + } + + # Record whether there are two or more paragraphs. + my $multi_paragraph = grep /^\s*$/, @line; + + # Format 'Co-authored-by: A U Thor ' lines in + # standard multi-author ChangeLog format. + for (@coauthors) + { + s/^Co-authored-by:\s*/\t /; + s/\s*/ + or warn "$ME: warning: missing email address for " + . substr ($_, 5) . "\n"; + } + + # If clustering of commit messages has been disabled, if this header + # would be different from the previous date/name/email/coauthors header, + # or if this or the previous entry consists of two or more paragraphs, + # then print the header. + if ( ! $cluster + || $date_line ne $prev_date_line + || "@coauthors" ne "@prev_coauthors" + || $multi_paragraph + || $prev_multi_paragraph) + { + $prev_date_line eq '' + or print "\n"; + print $date_line; + @coauthors + and print join ("\n", @coauthors), "\n"; + } + $prev_date_line = $date_line; + @prev_coauthors = @coauthors; + $prev_multi_paragraph = $multi_paragraph; + + # If there were any lines + if (@line == 0) + { + warn "$ME: warning: empty commit message:\n $date_line\n"; + } + else + { + if ($append_dot) + { + # If the first line of the message has enough room, then + if (length $line[0] < 72) + { + # append a dot if there is no other punctuation or blank + # at the end. + $line[0] =~ /[[:punct:]\s]$/ + or $line[0] .= '.'; + } + } + + # Remove one additional leading TAB from each line. + $strip_tab + and map { s/^\t// } @line; + + # Prefix each non-empty line with a TAB. + @line = map { length $_ ? "\t$_" : '' } @line; + + print "\n", join ("\n", @line), "\n"; + } + + defined ($in = ) + or last; + $in ne "\n" + and die "$ME:$.: unexpected line:\n$in"; + } + + close PIPE + or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n"; + # FIXME-someday: include $PROCESS_STATUS in the diagnostic + + # Complain about any unused entry in the --amend=F specified file. + my $fail = 0; + foreach my $sha (keys %$amend_code) + { + warn "$ME:$amend_file: unused entry: $sha\n"; + $fail = 1; + } + + exit $fail; +} + +# Local Variables: +# mode: perl +# indent-tabs-mode: nil +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "my $VERSION = '" +# time-stamp-format: "%:y-%02m-%02d %02H:%02M" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "'; # UTC" +# End: diff --git a/build-aux/install-sh b/build-aux/install-sh new file mode 100755 index 0000000..0b0fdcb --- /dev/null +++ b/build-aux/install-sh @@ -0,0 +1,501 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2013-12-25.23; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/build-aux/ltmain.sh b/build-aux/ltmain.sh new file mode 100644 index 0000000..0f0a2da --- /dev/null +++ b/build-aux/ltmain.sh @@ -0,0 +1,11147 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 + +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4.6 +package_revision=2.4.6 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-01-20.17; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2014-01-07.03; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + eval $_G_hook '"$@"' + + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + done + + func_quote_for_eval ${1+"$@"} + func_run_hooks_result=$func_quote_for_eval_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, remove any +# options that you action, and then pass back the remaining unprocessed +# options in '_result', escaped suitably for +# 'eval'. Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# +# func_quote_for_eval ${1+"$@"} +# my_options_prep_result=$func_quote_for_eval_result +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# ;; +# *) set dummy "$_G_opt" "$*"; shift; break ;; +# esac +# done +# +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# func_quote_for_eval ${1+"$@"} +# my_option_validation_result=$func_quote_for_eval_result +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll alse need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + func_options_prep ${1+"$@"} + eval func_parse_options \ + ${func_options_prep_result+"$func_options_prep_result"} + eval func_validate_options \ + ${func_parse_options_result+"$func_parse_options_result"} + + eval func_run_hooks func_options \ + ${func_validate_options_result+"$func_validate_options_result"} + + # save modified positional parameters for caller + func_options_result=$func_run_hooks_result +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propogate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + + # Adjust func_parse_options positional parameters to match + eval set dummy "$func_run_hooks_result"; shift + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + test $# = 0 && func_missing_arg $_G_opt && break + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname (GNU libtool) 2.4.6 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a 'standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to '-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the '--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the 'install' or 'cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with '-') are ignored. + +Every other argument is treated as a filename. Files ending in '.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. + +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir=$absdir + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic=$magic + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the '$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the '$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the '$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg=$1 + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -stdlib=* select c++ std lib with clang + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib=$searchdir/lib$name$search_ext + if test -f "$lib"; then + if test .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir=$ladir + absdir=$abs_ladir + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then + # Make sure the rpath contains only unique directories. + case $temp_rpath: in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname=$dlname + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc* | *os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; then + add=$dir/$linklib + case $host in + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir=-L$dir ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library"; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add=$dir/$old_library + fi + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib + else + add=$libdir/$linklib + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir=-L$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test prog = "$linkmode"; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system cannot link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test yes = "$module"; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=deplibs + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i= + ;; + esac + if test -n "$i"; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; then + # Building a libtool convenience library. + # Some compilers have problems with a '.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major=$1 + number_minor=$2 + number_revision=$3 + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring=$verstring_prefix$major.$revision + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring=0.0 + ;; + esac + if test no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles=$dlfiles + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles=$dlprefiles + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test yes = "$build_libtool_need_lc"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release= + versuffix= + major= + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib=$potent_lib + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; + *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib=$potent_lib # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test no = "$allow_undefined"; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs=$new_libs + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname=$1 + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname=$realname + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib=$output_objdir/$realname + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs=$IFS; IFS='~' + for cmd in $concat_cmds; do + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath=$rpath + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath=$rpath + + if test -n "$libobjs" && test yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; then + # We don't need to create a wrapper script. + link_command=$compile_var$compile_command$compile_rpath + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj"; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; then + if test -z "$install_libdir"; then + break + fi + output=$output_objdir/${outputname}i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/build-aux/missing b/build-aux/missing new file mode 100755 index 0000000..f62bbae --- /dev/null +++ b/build-aux/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2013-10-28.13; # UTC + +# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/build-aux/mkrockspecs b/build-aux/mkrockspecs new file mode 100755 index 0000000..1b1080b --- /dev/null +++ b/build-aux/mkrockspecs @@ -0,0 +1,463 @@ +#!/bin/sh +SH=--[[ # -*- mode: lua; -*- +## Slingshot rockspec generator. +## +## This file is distributed with Slingshot, and licensed under the +## terms of the MIT license reproduced below. + +## ==================================================================== +## Copyright (C) 2013-2015 Gary V. Vaughan +## +## Permission is hereby granted, free of charge, to any person +## obtaining a copy of this software and associated documentation +## files (the "Software"), to deal in the Software without restriction, +## including without limitation the rights to use, copy, modify, merge, +## publish, distribute, sublicense, and/or sell copies of the Software, +## and to permit persons to whom the Software is furnished to do so, +## subject to the following conditions: +## +## The above copyright notice and this permission notice shall be +## included in all copies or substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +## EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +## MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGE- +## MENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +## FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +## CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +## WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +## ==================================================================== + + +_lua_version_re='"Lua 5."[123]*' +_lua_binaries='lua lua5.3 lua53 lua5.2 lua52 luajit lua5.1 lua51' + +export LUA +export LUA_INIT +export LUA_INIT_5_2 +export LUA_INIT_5_3 +export LUA_PATH +export LUA_CPATH + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi + +# If LUA is not set, search PATH for something suitable. +test -n "$LUA" || { + # Check that the supplied binary is executable and returns a compatible + # Lua version number. + func_vercheck () + { + test -x "$1" && { + eval 'case `'$1' -e "print (_VERSION)" 2>/dev/null` in + '"$_lua_version_re"') LUA='$1' ;; + esac' + } + } + + progname=`echo "$0" |${SED-sed} 's|.*/||'` + + save_IFS="$IFS" + LUA= + for x in $_lua_binaries; do + IFS=: + for dir in $PATH; do + IFS="$save_IFS" + func_vercheck "$dir/$x" + test -n "$LUA" && break + done + IFS="$save_IFS" + test -n "$LUA" && break + e="${e+$e\n}$progname: command not found on PATH: $x" + done +} + +test -n "$LUA" || { + printf "${e+$e\n}$progname: retry after 'export LUA=/path/to/lua'\n" >&2 + exit 1 +} + +LUA_INIT= +LUA_INIT_5_2= +LUA_INIT_5_3= + +# Reexecute using the interpreter suppiled in LUA, or found above. +exec "$LUA" "$0" "$@" +]]SH + + +--[[ ============== ]]-- +--[[ Parse options. ]]-- +--[[ ============== ]]-- + +local usage = 'Usage: mkrockspecs [OPTIONS] PACKAGE VERSION [REVISION] [FILE]\n' + +prog = { + name = arg[0] and arg[0]:gsub (".*/", "") or "mkrockspecs", + + opts = {}, +} + +-- Print an argument processing error message, and return non-zero exit +-- status. +local function opterr (msg) + io.stderr:write (usage) + io.stderr:write (prog.name .. ": error: " .. msg .. ".\n") + io.stderr:write (prog.name .. ": Try '" .. prog.name .. " --help' for help,\n") + os.exit (2) +end + +local function setopt (optname, arglist, i) + local opt = arglist[i] + if i + 1 > #arglist then + opterr ("option '" .. opt .. "' requires an argument") + end + prog.opts[optname] = arglist[i + 1] + return i + 1 +end + +local function die (msg) + msg:gsub ("([^\n]+)\n?", + function () + io.stderr:write (prog.name .. ": error: " .. msg.. "\n") + end) + os.exit (1) +end + +prog["--help"] = function () + print (usage .. [[ + +Convert a YAML configuration file into a full rockspec. + +If FILE is provided, load it as the base configuration, otherwise if +there is a 'rockspec.conf' in the current directory use that, or else +wait for input on stdin. If FILE is '-', force reading base config- +uration from stdin. + +PACKAGE and VERSION are the package name and version number as defined +by 'configure.ac' or similar. REVISION is only required for a revised +rockspec if the default "-1" revision was released with errors. + + -b, --branch=BRANCH make git rockspec use BRANCH + -m, --module-dir=ROOT directory of lua-files for builtin build type + -r, --repository=REPO set the repository name (default=PACKAGE) + --help print this help, then exit + --version print version number, then exit + +Report bugs to http://github.com/gvvaughan/slingshot/issues.]]) + os.exit (0) +end + +prog["--version"] = function () + print [[mkrockspecs (slingshot) 8.0.0 +Written by Gary V. Vaughan , 2013 + +Copyright (C) 2013, Gary V. Vaughan +Slingshot comes with ABSOLUTELY NO WARRANTY. +See source files for individual license conditions.]] + os.exit (0) +end + +prog["-b"] = function (argl, i) return setopt ("branch", argl, i) end +prog["--branch"] = prog["-b"] + +prog["-m"] = function (argl, i) return setopt ("module_root", argl, i) end +prog["--module-dir"] = prog["-m"] + +prog["-r"] = function (argl, i) return setopt ("repository", argl, i) end +prog["--repository"] = prog["-r"] + +local nonopts +local i = 0 +while i < #arg do + i = i + 1 + local opt = arg[i] + + -- Collect remaining arguments not nonopts to save back into _G.arg later. + if type (nonopts) == "table" then + table.insert (nonopts, opt) + + -- Run prog.option handler. + elseif opt:sub (1,1) == "-" and type (prog[opt]) == "function" then + i = prog[opt] (arg, i) + + -- End of option arguments. + elseif opt == "--" then + nonopts = {} + + -- Diagnose unknown command line options. + elseif opt:sub (1, 1) == "-" then + opterr ("unrecognized option '" .. opt .. "'") + + -- First non-option argument marks the end of options. + else + nonopts = { opt } + end +end + +-- put non-option args back into global arg table. +nonopts = nonopts or {} +nonopts[0] = arg[0] +_G.arg = nonopts + +if select ("#", ...) < 2 then + opterr ("only " .. select ("#", ...) .. " arguments provided") +end + +local package = arg[1] +local version = arg[2] +local revision = arg[3] or "1" +local conf = arg[4] or "rockspec.conf" + +-- Unless set explicity, assume the repo is named after the package. +if prog.opts.repository == nil then + prog.opts.repository = package +end + + +--[[ ================= ]]-- +--[[ Helper functions. ]]-- +--[[ ================= ]]-- + +local ok, posix = pcall (require, "posix") + +files = {} + +if ok then + -- faster version if luaposix is available + function tree (root) + for f in posix.files (root) do + local path = root .. "/" .. f + if f:match ("%.lua$") then + table.insert (files, path) + elseif f == "." or f == ".." then + -- don't go into a loop + elseif posix.stat (path, "type") == "directory" then + tree (path) + end + end + end +else + -- fallback version that executes ls in subshells + function tree (root) + local p = io.popen ("ls -1 " .. root .. " 2>/dev/null") + + if p ~= nil then + local f = p:read "*l" + while f ~= nil do + if f:match ("%.lua$") then + table.insert (files, root .. "/" .. f) + else + tree (root .. "/" .. f) + end + f = p:read "*l" + end + end + end +end + +local function escape_pattern (s) + return (string.gsub (s, "[%^%$%(%)%%%.%[%]%*%+%-%?]", "%%%0")) +end + +local function loadmap (root) + local map = {} + tree (root) + for _, f in ipairs (files) do + local m = f:match ("^" .. escape_pattern (root) .. "/(.*)%.lua") + map [m:gsub ("/", "."):gsub ("%.init$", "")] = f:gsub ("^%./", "") + end + return map +end + + +--[[ =================== ]]-- +--[[ Load configuration. ]]-- +--[[ =================== ]]-- + +local yaml = require "lyaml" + +-- Slurp io.input (). +local function slurp () + h = io.input () + if h then + local s = h:read "*a" + h:close () + return s + end +end + +if conf == "-" then + io.input (io.stdin) +else + local h = io.open (conf) + if h then + io.input (conf) + h:close () + else + io.input (io.stdin) + end +end + +local spec = yaml.load (slurp ()) +local default = { source = {} } + +-- url needn't be given if it is identical to homepage. +local url +if spec.source ~= nil then + url = spec.source.url +elseif spec.description ~= nil then + url = spec.description.homepage +else + die (conf .. ": could not find source.url or description.homepage") +end +url = url:gsub ("^[a-z]*://", ""):gsub ("%.git$", "") + +-- Interpolate default values. +default.package = package +default.version = version .. "-" .. revision + +configure_flags = "" +if type (spec.external_dependencies) == "table" then + CPPFLAGS, LDFLAGS = "", "" + for name, vars in pairs (spec.external_dependencies) do + if vars.library then + CPPFLAGS = CPPFLAGS .. " -I$(" .. name .. "_INCDIR)" + LDFLAGS = LDFLAGS .. " -L$(" .. name .. "_LIBDIR)" + end + end + + if string.len (CPPFLAGS) > 0 then + configure_flags = configure_flags .. + "CPPFLAGS='" .. CPPFLAGS:gsub ("^%s", "") .. "'" .. + " LDFLAGS='" .. LDFLAGS:gsub ("^%s", "") .. "'" .. + " " + end +end + +-- If we have a module root, use the luarocks "builtin" type. +if version ~= "scm" and version ~= "git" then + if prog.opts.module_root ~= nil then + default.build = { + type = "builtin", + modules = loadmap (prog.opts.module_root), + } + elseif spec.build ~= nil and spec.build.modules ~= nil then + default.build = { type = "builtin" } + end +end + +default.build = default.build or { + type = "command", + build_command = "./configure " .. + "LUA='$(LUA)' LUA_INCLUDE='-I$(LUA_INCDIR)' " .. configure_flags .. + "--prefix='$(PREFIX)' --libdir='$(LIBDIR)' --datadir='$(LUADIR)' " .. + "--datarootdir='$(PREFIX)' && make clean all", + install_command = "make install luadir='$(LUADIR)' luaexecdir='$(LIBDIR)'", + copy_directories = {}, +} + +-- Additional spec-type dependent values. +spec.source = spec.source or {} +spec.build = spec.build or {} +if version ~= "scm" and version ~= "git" then + spec.source.url = "http://" .. url .. "/archive/release-v" .. version .. ".zip" + spec.source.dir = prog.opts.repository .. "-release-v" .. version +else + spec.source.url = "git://" .. url .. ".git" + spec.source.branch = prog.opts.branch + spec.build.modules = nil + default.build.build_command = "./bootstrap && " .. default.build.build_command +end + + +-- Recursive merge, settings from spec take precedence. Elements of src +-- overwrite equivalent keys in dest. +local function merge (dest, src) + for k, v in pairs (src) do + if type (v) == "table" then + dest[k] = merge (dest[k] or {}, src[k]) + else + dest[k] = src[k] + end + end + return dest +end + +spec = merge (default, spec) + + +--[[ ======= ]]-- +--[[ Output. ]]-- +--[[ ======= ]]-- + +-- Recursively format X, with pretty printing. +local function format (x, indent) + indent = indent or "" + if type (x) == "table" then + if next (x) == nil then + return "{}" + else + local s = "{\n" + + -- Collect and sort non-numeric keys first. + keys = {} + for k in pairs (x) do + if type (k) ~= "number" then table.insert (keys, k) end + end + table.sort (keys, function (a, b) return tostring (a) < tostring (b) end) + + -- Display non-numeric key pairs in sort order. + for _, k in ipairs (keys) do + s = s .. indent + if k:match ("[^_%w]") then + -- wrap keys with non-%w chars in square brackets + s = s .. '["' .. k .. '"]' + else + s = s .. k + end + s = s .. " = " .. format (x[k], indent .. " ") .. ",\n" + end + + -- And numeric key pairs last. + for i, v in ipairs (x) do + s = s .. indent .. format (v, indent .. " ") .. ",\n" + end + return s..indent:sub (1, -3).."}" + end + elseif type (x) == "string" then + return string.format ("%q", x) + else + return tostring (x) + end +end + +-- Use the standard order for known keys. +for _, k in ipairs { + "package", + "version", + "description", + "source", + "dependencies", + "external_dependencies", + "build", +} do + print (k .. " = " .. format (spec[k], " ")) + spec[k] = nil +end + +-- Output anything left in the table at the end. +for i, v in pairs (spec) do + print (i .. " = " .. format (v, " ")) +end + +os.exit (0) diff --git a/build-aux/release.mk b/build-aux/release.mk new file mode 100644 index 0000000..13dce9a --- /dev/null +++ b/build-aux/release.mk @@ -0,0 +1,393 @@ +# Slingshot release rules for GNU Make. + +# ====================================================================== +# Copyright (C) 2001-2015 Free Software Foundation, Inc. +# Originally by Jim Meyering, Simon Josefsson, Eric Blake, +# Akim Demaille, Gary V. Vaughan, and others. +# This version by Gary V. Vaughan, 2013. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# ====================================================================== + +NOTHING_ELSE ?= + + +## --------------- ## +## GNU Make magic. ## +## --------------- ## + +# This file uses GNU Make extensions. Include it from GNUmakefile with: +# +# include build-aux/release.mk + +# Make tar archive easier to reproduce. +export TAR_OPTIONS = --owner=0 --group=0 --numeric-owner + +# Helper variables. +_empty = +_sp = $(_empty) $(_empty) + +# member-check,VARIABLE,VALID-VALUES +# ---------------------------------- +# Check that $(VARIABLE) is in the space-separated list of VALID-VALUES, and +# return it. Die otherwise. +member-check = \ + $(strip \ + $(if $($(1)), \ + $(if $(findstring $(_sp),$($(1))), \ + $(error invalid $(1): '$($(1))', expected $(2)), \ + $(or $(findstring $(_sp)$($(1))$(_sp),$(_sp)$(2)$(_sp)), \ + $(error invalid $(1): '$($(1))', expected $(2)))), \ + $(error $(1) undefined))) + +include Makefile + +## --------- ## +## Defaults. ## +## --------- ## + +GIT ?= git +LUA ?= lua +LUAROCKS ?= luarocks +TAR ?= tar + +# Override this in cfg.mk if you are using a different format in your +# NEWS file. +today ?= $(shell date +%Y-%m-%d) + +# Old releases are stored here. +release_archive_dir ?= ../release + +# Override this in cfg.mk if you follow different procedures. +release-prep-hook ?= release-prep + +_build-aux ?= build-aux +my_distdir ?= $(PACKAGE)-$(VERSION) +prev_version_file ?= $(srcdir)/.prev-version +old_NEWS_hash-file ?= $(srcdir)/local.mk +gl_noteworthy_news_ = \#\# Noteworthy changes in release ?.? (????-??-??) [?] + +PREV_VERSION = $(shell cat $(prev_version_file) 2>/dev/null) +VERSION_REGEXP = $(subst .,\.,$(VERSION)) +PREV_VERSION_REGEXP = $(subst .,\.,$(PREV_VERSION)) + + +## ------------- ## +## Distribution. ## +## ------------- ## + +gitlog_to_changelog = $(srcdir)/build-aux/gitlog-to-changelog + +dist-hook: ChangeLog +.PHONY: ChangeLog +ChangeLog: + $(AM_V_GEN)if test -d '$(srcdir)/.git'; then \ + $(gitlog_to_changelog) $(gitlog_args) > '$@T'; \ + rm -f '$@'; mv '$@T' '$@'; \ + fi + +# Override this in GNUmakefile if you don't want to automatically +# redistribute all the maintainer support files (take care that +# Travis CI is finicky about this, and will likely need tweaking +# to cope with missing any of these if you decide to omit them). + +_travis_yml ?= .travis.yml travis.yml.in + +release_extra_dist ?= \ + .autom4te.cfg \ + GNUmakefile \ + bootstrap \ + bootstrap.conf \ + local.mk \ + $(_travis_yml) \ + $(NOTHING_ELSE) + +EXTRA_DIST += \ + $(_build-aux)/release.mk \ + $(gitlog_to_changelog) \ + $(release_extra_dist) \ + $(NOTHING_ELSE) + +all-am: $(_travis_yml) + + +## -------- ## +## Release. ## +## -------- ## + +# The vast majority of what follows is preparation -in the form +# of early bail-out if something is not right yet- for the final +# check-in-release-branch rule that makes the tip of the release +# branch match the contents of a 'make distcheck' tarball. + +# Validate and return $(RELEASE_TYPE), or die. +RELEASE_TYPES = alpha beta stable +release-type = $(call member-check,RELEASE_TYPE,$(RELEASE_TYPES)) + +# This will actually make the release, including sending release +# announcements, and pushing changes back to the origin. +# Use it like this, eg: +# make RELEASE_TYPE=beta +.PHONY: release +release: + $(AM_V_GEN)$(MAKE) $(release-type) + $(AM_V_GEN)$(MAKE) push + $(AM_V_GEN)$(MAKE) upload + $(AM_V_GEN)$(MAKE) mail + +submodule-checks ?= no-submodule-changes public-submodule-commit + +.PHONY: no-submodule-changes +no-submodule-changes: + $(AM_V_GEN)if test -d $(srcdir)/.git \ + && git --version >/dev/null 2>&1; then \ + diff=$$(cd $(srcdir) && git submodule -q foreach \ + git diff-index --name-only HEAD); \ + case $$diff in '') ;; \ + *) echo '$(ME): submodule files are locally modified:'; \ + echo "$$diff"; exit 1;; esac; \ + else \ + : ; \ + fi + +# Ensure that each sub-module commit we're using is public. +# Without this, it is too easy to tag and release code that +# cannot be built from a fresh clone. +.PHONY: public-submodule-commit +public-submodule-commit: + $(AM_V_GEN)if test -d $(srcdir)/.git \ + && git --version >/dev/null 2>&1; then \ + cd $(srcdir) && \ + git submodule --quiet foreach \ + 'test "$$(git rev-parse "$$sha1")" \ + = "$$(git merge-base origin "$$sha1")"' \ + || { echo '$(ME): found non-public submodule commit' >&2; \ + exit 1; }; \ + else \ + : ; \ + fi +# This rule has a high enough utility/cost ratio that it should be a +# dependent of "check" by default. However, some of us do occasionally +# commit a temporary change that deliberately points to a non-public +# submodule commit, and want to be able to use rules like "make check". +# In that case, run e.g., "make check gl_public_submodule_commit=" +# to disable this test. +gl_public_submodule_commit ?= public-submodule-commit +check: $(gl_public_submodule_commit) + +# These targets do all the file shuffling necessary for a release, but +# purely locally, so you can rewind and redo before pushing anything +# to origin or sending release announcements. Use it like this, eg: +# +# make beta +.PHONY: alpha beta stable +alpha beta stable: $(submodule-checks) + $(AM_V_GEN)test $@ = stable && \ + { echo $(VERSION) |$(EGREP) '^[0-9]+(\.[0-9]+)*$$' >/dev/null \ + || { echo "invalid version string: $(VERSION)" 1>&2; exit 1;};}\ + || : + $(AM_V_at)$(MAKE) prev-version-check + $(AM_V_at)$(MAKE) vc-diff-check + $(AM_V_at)$(MAKE) release-commit RELEASE_TYPE=$@ + $(AM_V_at)$(MAKE) news-check + $(AM_V_at)$(MAKE) distcheck + $(AM_V_at)$(MAKE) check + $(AM_V_at)$(MAKE) $(release-prep-hook) RELEASE_TYPE=$@ + $(AM_V_at)$(MAKE) check-in-release-branch + +prev-version-check: + $(AM_V_at)if test -z "`$(GIT) ls-files $(prev_version_file)`"; \ + then \ + echo "error: checked in $(prev_version_file) required." >&2; \ + exit 1; \ + fi + +# Abort the release if there are unchecked in changes remaining. +vc-diff-check: + $(AM_V_at)if ! $(GIT) diff --exit-code; then \ + $(GIT) diff >/dev/null; \ + echo "error: Some files are locally modified" >&2; \ + exit 1; \ + fi + +# Select which lines of NEWS are searched for $(news-check-regexp). +# This is a sed line number spec. The default says that we search +# only line 3 of NEWS for $(news-check-regexp), to match the behaviour +# of '$(_build-aux)/do-release-commit-and-tag'. +# If you want to search only lines 1-10, use "1,10". +news-check-lines-spec ?= 3 +news-check-regexp ?= '^\#\#.* $(VERSION_REGEXP) \($(today)\)' + +Makefile.in: NEWS + +NEWS: + $(AM_V_GEN)if test -f NEWS.md; then ln -s NEWS.md NEWS; \ + elif test -f NEWS.rst; then ln -s NEWS.rst NEWS; \ + elif test -f NEWS.txt; then ln -s NEWS.txt NEWS; \ + fi + +news-check: NEWS + $(AM_V_GEN)if $(SED) -n $(news-check-lines-spec)p $< \ + | $(EGREP) $(news-check-regexp) >/dev/null; then \ + :; \ + else \ + echo 'NEWS: $$(news-check-regexp) failed to match' 1>&2; \ + exit 1; \ + fi + +.PHONY: release-commit +release-commit: NEWS + $(AM_V_GEN)cd $(srcdir) \ + && $(_build-aux)/do-release-commit-and-tag \ + -C $(abs_builddir) $(VERSION) $(RELEASE_TYPE) + +define emit-commit-log + printf '%s\n' 'maint: post-release administrivia.' '' \ + '* NEWS: Add header line for next release.' \ + '* .prev-version: Record previous version.' \ + '* $(old_NEWS_hash-file) (old_NEWS_hash): Auto-update.' +endef + +.PHONY: release-prep +release-prep: $(scm_rockspec) + $(AM_V_GEN)$(MAKE) --no-print-directory -s announcement \ + > ~/announce-$(my_distdir) + $(AM_V_at)if test -d $(release_archive_dir); then \ + ln $(rel-files) $(release_archive_dir); \ + chmod a-w $(rel-files); \ + fi + $(AM_V_at)echo $(VERSION) > $(prev_version_file) + $(AM_V_at)$(MAKE) update-old-NEWS-hash + $(AM_V_at)perl -pi \ + -e '$$. == 3 and print "$(gl_noteworthy_news_)\n\n\n"' \ + `readlink $(srcdir)/NEWS 2>/dev/null || echo $(srcdir)/NEWS` + $(AM_V_at)msg=$$($(emit-commit-log)) || exit 1; \ + cd $(srcdir) && $(GIT) commit -s -m "$$msg" -a + @echo '**** Release announcement in ~/announce-$(my_distdir)' + +# Strip out copyright messages with years, so that changing those (e.g. +# with 'make update-copyight') doesn't change the old_NEWS_hash. +NEWS_hash = \ + $$(sed -n '/^\*.* $(PREV_VERSION_REGEXP) ([0-9-]*)/,$$p' \ + $(srcdir)/NEWS \ + | perl -0777 -pe 's/^Copyright.+?[12][0-9]{3}.+?\n//ms' \ + | md5sum - \ + | sed 's/ .*//') + +# Update the hash stored above. Do this after each release and +# for any corrections to old entries. + +old-NEWS-regexp = '^old_NEWS_hash[ \t]+?=[ \t]+' +update-old-NEWS-hash: NEWS + $(AM_V_GEN)if $(EGREP) $(old-NEWS-regexp) $(old_NEWS_hash-file); then \ + perl -pi -e 's/^(old_NEWS_hash[ \t]+:?=[ \t]+).*/$${1}'"$(NEWS_hash)/" \ + $(old_NEWS_hash-file); \ + else \ + printf '%s\n' '' "old_NEWS_hash = $(NEWS_hash)" \ + >> $(old_NEWS_hash-file); \ + fi + +ANNOUNCE_ENV = LUA_INIT= LUA_PATH='$(abs_srcdir)/?-git-1.rockspec' +ANNOUNCE_PRINT = $(ANNOUNCE_ENV) $(LUA) -l$(PACKAGE) -e + +_PRE = " https://raw.githubusercontent" +_POST = "/release-v$(VERSION)/$(PACKAGE)-$(VERSION)-$(rockspec_revision).rockspec" +GITHUB_ROCKSPEC = (source.url:gsub ("^git://github", $(_PRE)):gsub ("%.git$$", $(_POST))) + +announcement: NEWS +# Not $(AM_V_GEN) since the output of this command serves as +# announcement message: else, it would start with " GEN announcement". + $(AM_V_at)printf '%s\n' \ + '# [ANN] $(PACKAGE_NAME) $(VERSION) released' \ + '' + $(AM_V_at)$(ANNOUNCE_PRINT) 'print (description.detailed)' + $(AM_V_at)printf '%s\n' '' \ + 'I am happy to announce release $(VERSION) of $(PACKAGE_NAME).' \ + '' + $(AM_V_at)$(ANNOUNCE_PRINT) \ + 'print ("$(PACKAGE_NAME)'\''s home page is at " .. description.homepage)' + $(AM_V_at)printf '\n' + $(AM_V_at)$(SED) -n \ + -e '/^\#\# Noteworthy changes in release $(PREV_VERSION)/q' \ + -e p NEWS |$(SED) -e 1,2d + $(AM_V_at)printf '%s\n' \ + 'Install it with LuaRocks, using:' '' \ + ' luarocks install $(PACKAGE) $(VERSION)' + $(AM_V_at)$(ANNOUNCE_PRINT) 'print ($(GITHUB_ROCKSPEC))' + + +branch = $(shell $(GIT) branch |$(SED) -ne '/^\* /{s///;p;q;}') +GCO = $(GIT) checkout +release-tarball = $(my_distdir).tar.gz + +# Anything in $(_save-files) is not removed after switching to the +# release branch, and is thus "in the release". Add addtional partial +# filenames to save in save_release_files, for example: +# save_release_files = RELEASE-NOTES- +_save-files = \ + $(release-tarball) \ + $(save_release_files) \ + $(NOTHING_ELSE) + + +list-to-rexp = $(SED) -e 's|^|(|' -e 's/|$$/)/' +git-clean-files = `printf -- '-e %s ' $(_save-files)` +grep-clean-files = `printf -- '%s|' $(_save-files) |$(list-to-rexp)` + +# Switch to (or create) 'release' branch, remove all files, except the +# newly generated dist tarball, then unpack the dist tarball and check +# in all the files it creates, and tag that as the next release. +# Github creates automatic zipballs of tagged git revisions, so we can +# safely use this tag in the rockspecs we distribute. +submodule-regexp ?= '^\[submodule "' +submodule-extract-spec ?= 's|^.*"\([^"]*\)".*$$|\1|' + +.PHONY: check-in-release-branch +check-in-release-branch: + $(AM_V_GEN)$(GCO) -b release v$(VERSION) 2>/dev/null || $(GCO) release + $(AM_V_at)$(GIT) pull origin release 2>/dev/null || true + $(AM_V_at)if $(EGREP) $(submodule-regexp) .gitmodules >/dev/null 2>&1; then \ + $(EGREP) $(submodule-regexp) .gitmodules \ + | $(SED) $(submodule-extract-spec) | xargs rm -rf; \ + fi + $(AM_V_at)$(GIT) clean -dfx $(git-clean-files) + $(AM_V_at)remove_re=$(grep-clean-files); \ + $(GIT) rm -f `$(GIT) ls-files |$(EGREP) -v "$$remove_re"` + $(AM_V_at)ln -s . '$(my_distdir)' + $(AM_V_at)$(TAR) zxf '$(release-tarball)' + $(AM_V_at)rm -f '$(my_distdir)' '$(release-tarball)' + $(AM_V_at)$(GIT) add . + $(AM_V_at)$(GIT) commit -s -a -m 'Release v$(VERSION).' + $(AM_V_at)$(GIT) tag -s -a -m 'Full source release v$(VERSION)' release-v$(VERSION) + $(AM_V_at)$(GCO) $(branch) + +.PHONY: push +push: + $(AM_V_at)$(GIT) push origin master + $(AM_V_at)$(GIT) push origin release + $(AM_V_at)$(GIT) push origin v$(VERSION) + $(AM_V_at)$(GIT) push origin release-v$(VERSION) + +.PHONY: upload +upload: rockspecs + $(AM_V_at)$(LUAROCKS) upload $${API_KEY+--api-key=$$API_KEY} \ + '$(PACKAGE)-$(VERSION)-$(rockspec_revision).rockspec' + +announce_emails ?= lua-l@lists.lua.org + +.PHONY: mail +mail: rockspecs + $(AM_V_at)cat ~/announce-$(my_distdir) \ + | mail -s '[ANN] $(PACKAGE) $(VERSION) released' -- \ + $(announce_emails) diff --git a/build-aux/rockspecs.mk b/build-aux/rockspecs.mk new file mode 100644 index 0000000..e64cab1 --- /dev/null +++ b/build-aux/rockspecs.mk @@ -0,0 +1,116 @@ +# Slingshot rockspec rules for make. + +# This file is distributed with Slingshot, and licensed under the +# terms of the MIT license reproduced below. + +# ==================================================================== # +# Copyright (C) 2013-2015 Reuben Thomas and Gary V. Vaughan # +# # +# Permission is hereby granted, free of charge, to any person # +# obtaining a copy of this software and associated documentation # +# files (the "Software"), to deal in the Software without restriction, # +# including without limitation the rights to use, copy, modify, merge, # +# publish, distribute, sublicense, and/or sell copies of the Software, # +# and to permit persons to whom the Software is furnished to do so, # +# subject to the following conditions: # +# # +# The above copyright notice and this permission notice shall be # +# included in all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGE- # +# MENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE # +# FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF # +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # +# ==================================================================== # + + +## --------- ## +## LuaRocks. ## +## --------- ## + +# This file is suitable for use from a portable Makefile, you might +# include it into the top-level Makefile.am with: +# +# include build-aux/rockspecs.mk + +luarocks_config = build-aux/luarocks-config.lua +rockspec_conf = $(srcdir)/rockspec.conf +mkrockspecs = $(srcdir)/build-aux/mkrockspecs +package_rockspec = $(srcdir)/$(PACKAGE)-$(VERSION)-$(rockspec_revision).rockspec +scm_rockspec = $(PACKAGE)-git-$(rockspec_revision).rockspec + +# If you need a different rockspec revision, override this on the make +# command line: +# +# make rockspecs rockspec_revision=2 +rockspec_revision = 1 + +LUAROCKS = luarocks +MKROCKSPECS = $(MKROCKSPECS_ENV) $(LUA) $(mkrockspecs) + +ROCKSPECS_DEPS = \ + $(luarocks_config) \ + $(mkrockspecs) \ + $(rockspec_conf) \ + $(NOTHING_ELSE) + +set_LUA_BINDIR = LUA_BINDIR=`which $(LUA) |$(SED) 's|/[^/]*$$||'` +LUA_INCDIR = `cd $$LUA_BINDIR/../include && pwd` +LUA_LIBDIR = `cd $$LUA_BINDIR/../lib && pwd` + +$(luarocks_config): Makefile.am + @test -d build-aux || mkdir build-aux + $(AM_V_GEN){ \ + $(set_LUA_BINDIR); \ + echo 'rocks_trees = { "$(abs_srcdir)/luarocks" }'; \ + echo 'variables = {'; \ + echo ' LUA = "$(LUA)",'; \ + echo ' LUA_BINDIR = "'$$LUA_BINDIR'",'; \ + echo ' LUA_INCDIR = "'$(LUA_INCDIR)'",'; \ + echo ' LUA_LIBDIR = "'$(LUA_LIBDIR)'",'; \ + echo '}'; \ + } > '$@' + +$(package_rockspec): $(ROCKSPECS_DEPS) + $(AM_V_at)rm -f '$@' 2>/dev/null || : + $(AM_V_GEN)test -f '$@' || \ + $(MKROCKSPECS) $(mkrockspecs_args) \ + $(PACKAGE) $(VERSION) $(rockspec_revision) > '$@' + $(AM_V_at)$(LUAROCKS) lint '$@' + +$(scm_rockspec): $(ROCKSPECS_DEPS) + $(AM_V_at)rm '$@' 2>/dev/null || : + $(AM_V_GEN)test -f '$@' || \ + $(MKROCKSPECS) $(mkrockspecs_args) \ + $(PACKAGE) git 1 > '$@' + $(AM_V_at)$(LUAROCKS) lint '$@' + +.PHONY: rockspecs +rockspecs: + $(AM_V_at)rm -f *.rockspec + $(AM_V_at)$(MAKE) $(package_rockspec) $(scm_rockspec) + + +## ------------- ## +## Distribution. ## +## ------------- ## + +EXTRA_DIST += \ + $(mkrockspecs) \ + $(package_rockspec) \ + $(rockspec_conf) \ + $(NOTHING_ELSE) + +save_release_files += $(scm_rockspec) + + +## ------------ ## +## Maintenance. ## +## ------------ ## + +DISTCLEANFILES += \ + $(luarocks_config) \ + $(NOTHING_ELSE) diff --git a/build-aux/sanity-cfg.mk b/build-aux/sanity-cfg.mk new file mode 100644 index 0000000..e8775f5 --- /dev/null +++ b/build-aux/sanity-cfg.mk @@ -0,0 +1,10 @@ +exclude_file_name_regexp--sc_require_config_h = ^ext/include/(compat-5\.2|strlcpy)\.c|ext/posix/posix\.c$$ +exclude_file_name_regexp--sc_require_config_h_first = ^ext/include/(compat-5\.2|strlcpy)\.c|ext/posix/posix\.c$$ +exclude_file_name_regexp--sc_error_message_uppercase = ^(examples/socket|lib/posix/deprecated)\.lua|ext/posix/stdlib\.c$$ +exclude_file_name_regexp--sc_file_system = ^ext/posix/stdio\.c$$ +exclude_file_name_regexp--sc_useless_cpp_parens = ^ext/include/compat-5\.2\.[ch]$$ + +## Our license precludes linking with gnulib/lib/stat-size.h :( +local-checks-to-skip = sc_prohibit_stat_st_blocks + +EXTRA_DIST += build-aux/sanity-cfg.mk diff --git a/build-aux/sanity.mk b/build-aux/sanity.mk new file mode 100644 index 0000000..78bb125 --- /dev/null +++ b/build-aux/sanity.mk @@ -0,0 +1,1114 @@ +# Slingshot sanity checking rules for GNU Make. + +# ====================================================================== +# Copyright (C) 2001-2013 Free Software Foundation, Inc. +# Originally by Jim Meyering, Simon Josefsson, Eric Blake, +# Akim Demaille, Gary V. Vaughan, and others. +# This version by Gary V. Vaughan, 2013. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# ====================================================================== + +VC_LIST = $(GIT) ls-files + +# You can override this variable in cfg.mk to set your own regexp +# matching files to ignore. +VC_LIST_ALWAYS_EXCLUDE_REGEX ?= ^$$ + +# This is to preprocess robustly the output of $(VC_LIST), so that even +# when $(srcdir) is a pathological name like "....", the leading sed command +# removes only the intended prefix. +_dot_escaped_srcdir = $(subst .,\.,$(srcdir)) + +# Post-process $(VC_LIST) output, prepending $(srcdir)/, but only +# when $(srcdir) is not ".". +ifeq ($(srcdir),.) + _prepend_srcdir_prefix = +else + _prepend_srcdir_prefix = | sed 's|^|$(srcdir)/|' +endif + +# In order to be able to consistently filter "."-relative names, +# (i.e., with no $(srcdir) prefix), this definition is careful to +# remove any $(srcdir) prefix, and to restore what it removes. +_sc_excl = \ + $(or $(exclude_file_name_regexp--$@),^build-aux/sanity.mk$$|gnulib$$|^slingshot$$) +VC_LIST_EXCEPT = \ + $(VC_LIST) | sed 's|^$(_dot_escaped_srcdir)/||' \ + | if test -f $(srcdir)/.x-$@; then grep -vEf $(srcdir)/.x-$@; \ + else grep -Ev -e "$${VC_LIST_EXCEPT_DEFAULT-ChangeLog}"; fi \ + | grep -Ev -e '($(VC_LIST_ALWAYS_EXCLUDE_REGEX)|$(_sc_excl))' \ + $(_prepend_srcdir_prefix) + + +## --------------- ## +## Sanity checks. ## +## --------------- ## + +-include $(srcdir)/$(_build-aux)/sanity-cfg.mk + +_cfg_mk := $(wildcard $(srcdir)/cfg.mk) + +# Collect the names of rules starting with 'sc_'. +syntax-check-rules := $(sort $(shell sed -n 's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' \ + $(srcdir)/$(ME) $(_cfg_mk) $(srcdir)/$(_build-aux)/*.mk)) +.PHONY: $(syntax-check-rules) + +ifeq ($(shell $(VC_LIST) >/dev/null 2>&1; echo $$?),0) + local-checks-available += $(syntax-check-rules) +else + local-checks-available += no-vc-detected +no-vc-detected: + @echo "No version control files detected; skipping syntax check" +endif +.PHONY: $(local-checks-available) + +# Arrange to print the name of each syntax-checking rule just before running it. +$(syntax-check-rules): %: %.m +sc_m_rules_ = $(patsubst %, %.m, $(syntax-check-rules)) +.PHONY: $(sc_m_rules_) +$(sc_m_rules_): + @echo $(patsubst sc_%.m, %, $@) + @date +%s.%N > .sc-start-$(basename $@) + +# Compute and print the elapsed time for each syntax-check rule. +sc_z_rules_ = $(patsubst %, %.z, $(syntax-check-rules)) +.PHONY: $(sc_z_rules_) +$(sc_z_rules_): %.z: % + @end=$$(date +%s.%N); \ + start=$$(cat .sc-start-$*); \ + rm -f .sc-start-$*; \ + awk -v s=$$start -v e=$$end \ + 'END {printf "%.2f $(patsubst sc_%,%,$*)\n", e - s}' < /dev/null + +# The patsubst here is to replace each sc_% rule with its sc_%.z wrapper +# that computes and prints elapsed time. +local-check := \ + $(patsubst sc_%, sc_%.z, \ + $(filter-out $(local-checks-to-skip), $(local-checks-available))) + +syntax-check: $(local-check) + +# _sc_search_regexp +# +# This macro searches for a given construct in the selected files and +# then takes some action. +# +# Parameters (shell variables): +# +# prohibit | require +# +# Regular expression (ERE) denoting either a forbidden construct +# or a required construct. Those arguments are exclusive. +# +# exclude +# +# Regular expression (ERE) denoting lines to ignore that matched +# a prohibit construct. For example, this can be used to exclude +# comments that mention why the nearby code uses an alternative +# construct instead of the simpler prohibited construct. +# +# in_vc_files | in_files +# +# grep-E-style regexp selecting the files to check. For in_vc_files, +# the regexp is used to select matching files from the list of all +# version-controlled files; for in_files, it's from the names printed +# by "find $(srcdir)". When neither is specified, use all files that +# are under version control. +# +# containing | non_containing +# +# Select the files (non) containing strings matching this regexp. +# If both arguments are specified then CONTAINING takes +# precedence. +# +# with_grep_options +# +# Extra options for grep. +# +# ignore_case +# +# Ignore case. +# +# halt +# +# Message to display before to halting execution. +# +# Finally, you may exempt files based on an ERE matching file names. +# For example, to exempt from the sc_space_tab check all files with the +# .diff suffix, set this Make variable: +# +# exclude_file_name_regexp--sc_space_tab = \.diff$ +# +# Note that while this functionality is mostly inherited via VC_LIST_EXCEPT, +# when filtering by name via in_files, we explicitly filter out matching +# names here as well. + +# Initialize each, so that envvar settings cannot interfere. +export require = +export prohibit = +export exclude = +export in_vc_files = +export in_files = +export containing = +export non_containing = +export halt = +export with_grep_options = + +# By default, _sc_search_regexp does not ignore case. +export ignore_case = +_ignore_case = $$(test -n "$$ignore_case" && printf %s -i || :) + +define _sc_say_and_exit + dummy=; : so we do not need a semicolon before each use; \ + { printf '%s\n' "$(ME): $$msg" 1>&2; exit 1; }; +endef + +define _sc_search_regexp + dummy=; : so we do not need a semicolon before each use; \ + \ + : Check arguments; \ + test -n "$$prohibit" && test -n "$$require" \ + && { msg='Cannot specify both prohibit and require' \ + $(_sc_say_and_exit) } || :; \ + test -z "$$prohibit" && test -z "$$require" \ + && { msg='Should specify either prohibit or require' \ + $(_sc_say_and_exit) } || :; \ + test -z "$$prohibit" && test -n "$$exclude" \ + && { msg='Use of exclude requires a prohibit pattern' \ + $(_sc_say_and_exit) } || :; \ + test -n "$$in_vc_files" && test -n "$$in_files" \ + && { msg='Cannot specify both in_vc_files and in_files' \ + $(_sc_say_and_exit) } || :; \ + test "x$$halt" != x \ + || { msg='halt not defined' $(_sc_say_and_exit) }; \ + \ + : Filter by file name; \ + if test -n "$$in_files"; then \ + files=$$(find $(srcdir) | grep -E "$$in_files" \ + | grep -Ev '$(_sc_excl)'); \ + else \ + files=$$($(VC_LIST_EXCEPT)); \ + if test -n "$$in_vc_files"; then \ + files=$$(echo "$$files" | grep -E "$$in_vc_files"); \ + fi; \ + fi; \ + \ + : Filter by content; \ + test -n "$$files" && test -n "$$containing" \ + && { files=$$(grep -l "$$containing" $$files); } || :; \ + test -n "$$files" && test -n "$$non_containing" \ + && { files=$$(grep -vl "$$non_containing" $$files); } || :; \ + \ + : Check for the construct; \ + if test -n "$$files"; then \ + if test -n "$$prohibit"; then \ + grep $$with_grep_options $(_ignore_case) -nE "$$prohibit" $$files \ + | grep -vE "$${exclude:-^$$}" \ + && { msg="$$halt" $(_sc_say_and_exit) } || :; \ + else \ + grep $$with_grep_options $(_ignore_case) -LE "$$require" $$files \ + | grep . \ + && { msg="$$halt" $(_sc_say_and_exit) } || :; \ + fi \ + else :; \ + fi || :; +endef + +sc_avoid_if_before_free: + @test -f $(srcdir)/$(_build-aux)/useless-if-before-free && \ + $(srcdir)/$(_build-aux)/useless-if-before-free \ + $(useless_free_options) \ + $$($(VC_LIST_EXCEPT) | grep -v useless-if-before-free) && \ + { echo '$(ME): found useless "if" before "free" above' 1>&2; \ + exit 1; } || : + +sc_cast_of_argument_to_free: + @prohibit='\&2; \ + exit 1; } || : + +# Error messages should not start with a capital letter +sc_error_message_uppercase: + @grep -nEA2 '[^rp]error *\(' $$($(VC_LIST_EXCEPT)) \ + | grep -E '"[A-Z]' \ + | grep -vE '"FATAL|"WARNING|"Java|"C#|PRIuMAX' && \ + { echo '$(ME): found capitalized error message' 1>&2; \ + exit 1; } || : + +# Error messages should not end with a period +sc_error_message_period: + @grep -nEA2 '[^rp]error *\(' $$($(VC_LIST_EXCEPT)) \ + | grep -E '[^."]\."' && \ + { echo '$(ME): found error message ending in period' 1>&2; \ + exit 1; } || : + +sc_file_system: + @prohibit=file''system \ + ignore_case=1 \ + halt='found use of "file''system"; spell it "file system"' \ + $(_sc_search_regexp) + +sc_makefile: + @prohibit=make''flie \ + ignore_case=1 \ + halt='found misspelled "make''flie"; use "makefile" instead' \ + $(_sc_search_regexp) + +# Don't use cpp tests of this symbol. All code assumes config.h is included. +sc_prohibit_have_config_h: + @prohibit='^# *if.*HAVE''_CONFIG_H' \ + halt='found use of HAVE''_CONFIG_H; remove' \ + $(_sc_search_regexp) + +# Nearly all .c files must include . However, we also permit this +# via inclusion of a package-specific header, if cfg.mk specified one. +# config_h_header must be suitable for grep -E. +config_h_header ?= +sc_require_config_h: + @require='^# *include $(config_h_header)' \ + in_vc_files='\.c$$' \ + halt='the above files do not include ' \ + $(_sc_search_regexp) + +# You must include before including any other header file. +# This can possibly be via a package-specific header, if given by cfg.mk. +sc_require_config_h_first: + @if $(VC_LIST_EXCEPT) | grep -l '\.c$$' > /dev/null; then \ + fail=0; \ + for i in $$($(VC_LIST_EXCEPT) | grep '\.c$$'); do \ + grep '^# *include\>' $$i | sed 1q \ + | grep -E '^# *include $(config_h_header)' > /dev/null \ + || { echo $$i; fail=1; }; \ + done; \ + test $$fail = 1 && \ + { echo '$(ME): the above files include some other header' \ + 'before ' 1>&2; exit 1; } || :; \ + else :; \ + fi + +sc_prohibit_HAVE_MBRTOWC: + @prohibit='\bHAVE_MBRTOWC\b' \ + halt="do not use $$prohibit; it is always defined" \ + $(_sc_search_regexp) + +# To use this "command" macro, you must first define two shell variables: +# h: the header name, with no enclosing <> or "" +# re: a regular expression that matches IFF something provided by $h is used. +define _sc_header_without_use + dummy=; : so we do not need a semicolon before each use; \ + h_esc=`echo '[<"]'"$$h"'[">]'|sed 's/\./\\\\./g'`; \ + if $(VC_LIST_EXCEPT) | grep -l '\.c$$' > /dev/null; then \ + files=$$(grep -l '^# *include '"$$h_esc" \ + $$($(VC_LIST_EXCEPT) | grep '\.c$$')) && \ + grep -LE "$$re" $$files | grep . && \ + { echo "$(ME): the above files include $$h but don't use it" \ + 1>&2; exit 1; } || :; \ + else :; \ + fi +endef + +# Prohibit the inclusion of assert.h without an actual use of assert. +sc_prohibit_assert_without_use: + @h='assert.h' re='\new(file => "/dev/stdin")->as_string'|sed 's/\?://g' +# Note this was produced by the above: +# _xa1 = \ +#x(((2n?)?re|c(har)?|n(re|m)|z)alloc|alloc_(oversized|die)|m(alloc|emdup)|strdup) +# But we can do better, in at least two ways: +# 1) take advantage of two "dup"-suffixed strings: +# x(((2n?)?re|c(har)?|n(re|m)|[mz])alloc|alloc_(oversized|die)|(mem|str)dup) +# 2) notice that "c(har)?|[mz]" is equivalent to the shorter and more readable +# "char|[cmz]" +# x(((2n?)?re|char|n(re|m)|[cmz])alloc|alloc_(oversized|die)|(mem|str)dup) +_xa1 = x(((2n?)?re|char|n(re|m)|[cmz])alloc|alloc_(oversized|die)|(mem|str)dup) +_xa2 = X([CZ]|N?M)ALLOC +sc_prohibit_xalloc_without_use: + @h='xalloc.h' \ + re='\<($(_xa1)|$(_xa2)) *\('\ + $(_sc_header_without_use) + +# Extract function names: +# perl -lne '/^(?:extern )?(?:void|char) \*?(\w+) *\(/ and print $1' lib/hash.h +_hash_re = \ +clear|delete|free|get_(first|next)|insert|lookup|print_statistics|reset_tuning +_hash_fn = \<($(_hash_re)) *\( +_hash_struct = (struct )?\<[Hh]ash_(table|tuning)\> +sc_prohibit_hash_without_use: + @h='hash.h' \ + re='$(_hash_fn)|$(_hash_struct)'\ + $(_sc_header_without_use) + +sc_prohibit_cloexec_without_use: + @h='cloexec.h' re='\<(set_cloexec_flag|dup_cloexec) *\(' \ + $(_sc_header_without_use) + +sc_prohibit_posixver_without_use: + @h='posixver.h' re='\' \ + halt='do not use HAVE''_FCNTL_H or O'_NDELAY \ + $(_sc_search_regexp) + +# FIXME: warn about definitions of EXIT_FAILURE, EXIT_SUCCESS, STREQ + +# Each nonempty ChangeLog line must start with a year number, or a TAB. +sc_changelog: + @prohibit='^[^12 ]' \ + in_vc_files='^ChangeLog$$' \ + halt='found unexpected prefix in a ChangeLog' \ + $(_sc_search_regexp) + +# Ensure that each .c file containing a "main" function also +# calls set_program_name. +sc_program_name: + @require='set_program_name *\(m?argv\[0\]\);' \ + in_vc_files='\.c$$' \ + containing='\
/dev/null \ + && : || { die=1; echo $$i; } \ + done; \ + test $$die = 1 && \ + { echo 1>&2 '$(ME): the final line in each of the above is not:'; \ + echo 1>&2 'Exit something'; \ + exit 1; } || :; \ + fi + +sc_trailing_blank: + @prohibit='[ ]$$' \ + halt='found trailing blank(s)' \ + exclude='^Binary file .* matches$$' \ + $(_sc_search_regexp) + +# Match lines like the following, but where there is only one space +# between the options and the description: +# -D, --all-repeated[=delimit-method] print all duplicate lines\n +longopt_re = --[a-z][0-9A-Za-z-]*(\[?=[0-9A-Za-z-]*\]?)? +sc_two_space_separator_in_usage: + @prohibit='^ *(-[A-Za-z],)? $(longopt_re) [^ ].*\\$$' \ + halt='help2man requires at least two spaces between an option and its description'\ + $(_sc_search_regexp) + +# A regexp matching function names like "error_" that may be used +# to emit translatable messages. +_gl_translatable_diag_func_re ?= error_ + +# Look for diagnostics that aren't marked for translation. +# This won't find any for which error's format string is on a separate line. +sc_unmarked_diagnostics: + @prohibit='\<$(_gl_translatable_diag_func_re) *\([^"]*"[^"]*[a-z]{3}' \ + exclude='(_|ngettext ?)\(' \ + halt='found unmarked diagnostic(s)' \ + $(_sc_search_regexp) + +# Avoid useless parentheses like those in this example: +# #if defined (SYMBOL) || defined (SYM2) +sc_useless_cpp_parens: + @prohibit='^# *if .*defined *\(' \ + halt='found useless parentheses in cpp directive' \ + $(_sc_search_regexp) + +# List headers for which HAVE_HEADER_H is always true, assuming you are +# using the appropriate gnulib module. CAUTION: for each "unnecessary" +# #if HAVE_HEADER_H that you remove, be sure that your project explicitly +# requires the gnulib module that guarantees the usability of that header. +gl_assured_headers_ = \ + cd $(gnulib_dir)/lib && echo *.in.h|sed 's/\.in\.h//g' + +# Convert the list of names to upper case, and replace each space with "|". +az_ = abcdefghijklmnopqrstuvwxyz +AZ_ = ABCDEFGHIJKLMNOPQRSTUVWXYZ +gl_header_upper_case_or_ = \ + $$($(gl_assured_headers_) \ + | tr $(az_)/.- $(AZ_)___ \ + | tr -s ' ' '|' \ + ) +sc_prohibit_always_true_header_tests: + @or=$(gl_header_upper_case_or_); \ + re="HAVE_($$or)_H"; \ + prohibit='\<'"$$re"'\>' \ + halt=$$(printf '%s\n' \ + 'do not test the above HAVE_
_H symbol(s);' \ + ' with the corresponding gnulib module, they are always true') \ + $(_sc_search_regexp) + +sc_prohibit_defined_have_decl_tests: + @prohibit='#[ ]*if(n?def|.*\[ (]+HAVE_DECL_' \ + halt='HAVE_DECL macros are always defined' \ + $(_sc_search_regexp) + +# ================================================================== +gl_other_headers_ ?= \ + intprops.h \ + openat.h \ + stat-macros.h + +# Perl -lne code to extract "significant" cpp-defined symbols from a +# gnulib header file, eliminating a few common false-positives. +# The exempted names below are defined only conditionally in gnulib, +# and hence sometimes must/may be defined in application code. +gl_extract_significant_defines_ = \ + /^\# *define ([^_ (][^ (]*)(\s*\(|\s+\w+)/\ + && $$2 !~ /(?:rpl_|_used_without_)/\ + && $$1 !~ /^(?:NSIG|ENODATA)$$/\ + && $$1 !~ /^(?:SA_RESETHAND|SA_RESTART)$$/\ + and print $$1 + +# Create a list of regular expressions matching the names +# of macros that are guaranteed to be defined by parts of gnulib. +define def_sym_regex + gen_h=$(gl_generated_headers_); \ + (cd $(gnulib_dir)/lib; \ + for f in *.in.h $(gl_other_headers_); do \ + test -f $$f \ + && perl -lne '$(gl_extract_significant_defines_)' $$f; \ + done; \ + ) | sort -u \ + | sed 's/^/^ *# *(define|undef) */;s/$$/\\>/' +endef + +# Don't define macros that we already get from gnulib header files. +sc_prohibit_always-defined_macros: + @if test -d $(gnulib_dir); then \ + case $$(echo all: | grep -l -f - Makefile) in Makefile);; *) \ + echo '$(ME): skipping $@: you lack GNU grep' 1>&2; exit 0;; \ + esac; \ + $(def_sym_regex) | grep -E -f - $$($(VC_LIST_EXCEPT)) \ + && { echo '$(ME): define the above via some gnulib .h file' \ + 1>&2; exit 1; } || :; \ + fi +# ================================================================== + +# Prohibit checked in backup files. +sc_prohibit_backup_files: + @$(VC_LIST) | grep '~$$' && \ + { echo '$(ME): found version controlled backup file' 1>&2; \ + exit 1; } || : + +# Require the latest GPL. +sc_GPL_version: + @prohibit='either ''version [^3]' \ + halt='GPL vN, N!=3' \ + $(_sc_search_regexp) + +# Require the latest GFDL. Two regexp, since some .texi files end up +# line wrapping between 'Free Documentation License,' and 'Version'. +_GFDL_regexp = (Free ''Documentation.*Version 1\.[^3]|Version 1\.[^3] or any) +sc_GFDL_version: + @prohibit='$(_GFDL_regexp)' \ + halt='GFDL vN, N!=3' \ + $(_sc_search_regexp) + +# Don't use Texinfo's @acronym{}. +# http://lists.gnu.org/archive/html/bug-gnulib/2010-03/msg00321.html +texinfo_suffix_re_ ?= \.(txi|texi(nfo)?)$$ +sc_texinfo_acronym: + @prohibit='@acronym\{' \ + in_vc_files='$(texinfo_suffix_re_)' \ + halt='found use of Texinfo @acronym{}' \ + $(_sc_search_regexp) + +cvs_keywords = \ + Author|Date|Header|Id|Name|Locker|Log|RCSfile|Revision|Source|State + +sc_prohibit_cvs_keyword: + @prohibit='\$$($(cvs_keywords))\$$' \ + halt='do not use CVS keyword expansion' \ + $(_sc_search_regexp) + +# This Perl code is slightly obfuscated. Not only is each "$" doubled +# because it's in a Makefile, but the $$c's are comments; we cannot +# use "#" due to the way the script ends up concatenated onto one line. +# It would be much more concise, and would produce better output (including +# counts) if written as: +# perl -ln -0777 -e '/\n(\n+)$/ and print "$ARGV: ".length $1' ... +# but that would be far less efficient, reading the entire contents +# of each file, rather than just the last two bytes of each. +# In addition, while the code below detects both blank lines and a missing +# newline at EOF, the above detects only the former. +# +# This is a perl script that is expected to be the single-quoted argument +# to a command-line "-le". The remaining arguments are file names. +# Print the name of each file that does not end in exactly one newline byte. +# I.e., warn if there are blank lines (2 or more newlines), or if the +# last byte is not a newline. However, currently we don't complain +# about any file that contains exactly one byte. +# Exit nonzero if at least one such file is found, otherwise, exit 0. +# Warn about, but otherwise ignore open failure. Ignore seek/read failure. +# +# Use this if you want to remove trailing empty lines from selected files: +# perl -pi -0777 -e 's/\n\n+$/\n/' files... +# +require_exactly_one_NL_at_EOF_ = \ + foreach my $$f (@ARGV) \ + { \ + open F, "<", $$f or (warn "failed to open $$f: $$!\n"), next; \ + my $$p = sysseek (F, -2, 2); \ + my $$c = "seek failure probably means file has < 2 bytes; ignore"; \ + my $$last_two_bytes; \ + defined $$p and $$p = sysread F, $$last_two_bytes, 2; \ + close F; \ + $$c = "ignore read failure"; \ + $$p && ($$last_two_bytes eq "\n\n" \ + || substr ($$last_two_bytes,1) ne "\n") \ + and (print $$f), $$fail=1; \ + } \ + END { exit defined $$fail } +sc_prohibit_empty_lines_at_EOF: + @perl -le '$(require_exactly_one_NL_at_EOF_)' $$($(VC_LIST_EXCEPT)) \ + || { echo '$(ME): empty line(s) or no newline at EOF' \ + 1>&2; exit 1; } || : + +# Make sure we don't use st_blocks. Use ST_NBLOCKS instead. +# This is a bit of a kludge, since it prevents use of the string +# even in comments, but for now it does the job with no false positives. +sc_prohibit_stat_st_blocks: + @prohibit='[.>]st_blocks' \ + halt='do not use st_blocks; use ST_NBLOCKS' \ + $(_sc_search_regexp) + +# Make sure we don't define any S_IS* macros in src/*.c files. +# They're already defined via gnulib's sys/stat.h replacement. +sc_prohibit_S_IS_definition: + @prohibit='^ *# *define *S_IS' \ + halt='do not define S_IS* macros; include ' \ + $(_sc_search_regexp) + +# Perl block to convert a match to FILE_NAME:LINENO:TEST, +# that is shared by two definitions below. +perl_filename_lineno_text_ = \ + -e ' {' \ + -e ' $$n = ($$` =~ tr/\n/\n/ + 1);' \ + -e ' ($$v = $$&) =~ s/\n/\\n/g;' \ + -e ' print "$$ARGV:$$n:$$v\n";' \ + -e ' }' + +prohibit_doubled_word_RE_ ?= \ + /\b(then?|[iao]n|i[fst]|but|f?or|at|and|[dt]o)\s+\1\b/gims +prohibit_doubled_word_ = \ + -e 'while ($(prohibit_doubled_word_RE_))' \ + $(perl_filename_lineno_text_) + +# Define this to a regular expression that matches +# any filename:dd:match lines you want to ignore. +# The default is to ignore no matches. +ignore_doubled_word_match_RE_ ?= ^$$ + +sc_prohibit_doubled_word: + @perl -n -0777 $(prohibit_doubled_word_) $$($(VC_LIST_EXCEPT)) \ + | grep -vE '$(ignore_doubled_word_match_RE_)' \ + | grep . && { echo '$(ME): doubled words' 1>&2; exit 1; } || : + +# A regular expression matching undesirable combinations of words like +# "can not"; this matches them even when the two words appear on different +# lines, but not when there is an intervening delimiter like "#" or "*". +# Similarly undesirable, "See @xref{...}", since an @xref should start +# a sentence. Explicitly prohibit any prefix of "see" or "also". +# Also prohibit a prefix matching "\w+ +". +# @pxref gets the same see/also treatment and should be parenthesized; +# presume it must *not* start a sentence. +bad_xref_re_ ?= (?:[\w,:;] +|(?:see|also)\s+)\@xref\{ +bad_pxref_re_ ?= (?:[.!?]|(?:see|also))\s+\@pxref\{ +prohibit_undesirable_word_seq_RE_ ?= \ + /(?:\bcan\s+not\b|$(bad_xref_re_)|$(bad_pxref_re_))/gims +prohibit_undesirable_word_seq_ = \ + -e 'while ($(prohibit_undesirable_word_seq_RE_))' \ + $(perl_filename_lineno_text_) +# Define this to a regular expression that matches +# any filename:dd:match lines you want to ignore. +# The default is to ignore no matches. +ignore_undesirable_word_sequence_RE_ ?= ^$$ + +sc_prohibit_undesirable_word_seq: + @perl -n -0777 $(prohibit_undesirable_word_seq_) \ + $$($(VC_LIST_EXCEPT)) \ + | grep -vE '$(ignore_undesirable_word_sequence_RE_)' | grep . \ + && { echo '$(ME): undesirable word sequence' >&2; exit 1; } || : + +_ptm1 = use "test C1 && test C2", not "test C1 -''a C2" +_ptm2 = use "test C1 || test C2", not "test C1 -''o C2" +# Using test's -a and -o operators is not portable. +# We prefer test over [, since the latter is spelled [[ in configure.ac. +sc_prohibit_test_minus_ao: + @prohibit='(\ /dev/null \ + || { fail=1; echo 1>&2 "$(ME): $$p uses proper_name_utf8"; }; \ + done; \ + test $$fail = 1 && \ + { echo 1>&2 '$(ME): the above do not link with any ICONV library'; \ + exit 1; } || :; \ + fi + +# Warn about "c0nst struct Foo const foo[]", +# but not about "char const *const foo" or "#define const const". +sc_redundant_const: + @prohibit='\bconst\b[[:space:][:alnum:]]{2,}\bconst\b' \ + halt='redundant "const" in declarations' \ + $(_sc_search_regexp) + +sc_const_long_option: + @prohibit='^ *static.*struct option ' \ + exclude='const struct option|struct option const' \ + halt='add "const" to the above declarations' \ + $(_sc_search_regexp) + +# Ensure that we don't accidentally insert an entry into an old NEWS block. +sc_immutable_NEWS: + @if test -f $(srcdir)/NEWS; then \ + test "$(NEWS_hash)" = '$(old_NEWS_hash)' && : || \ + { echo '$(ME): you have modified old NEWS' 1>&2; exit 1; }; \ + fi + +# Ensure that we use only the standard $(VAR) notation, +# not @...@ in Makefile.am, now that we can rely on automake +# to emit a definition for each substituted variable. +# However, there is still one case in which @VAR@ use is not just +# legitimate, but actually required: when augmenting an automake-defined +# variable with a prefix. For example, gettext uses this: +# MAKEINFO = env LANG= LC_MESSAGES= LC_ALL= LANGUAGE= @MAKEINFO@ +# otherwise, makeinfo would put German or French (current locale) +# navigation hints in the otherwise-English documentation. +# +# Allow the package to add exceptions via a hook in cfg.mk; +# for example, @PRAGMA_SYSTEM_HEADER@ can be permitted by +# setting this to ' && !/PRAGMA_SYSTEM_HEADER/'. +_makefile_at_at_check_exceptions ?= +sc_makefile_at_at_check: + @perl -ne '/\@\w+\@/' \ + -e ' && !/(\w+)\s+=.*\@\1\@$$/' \ + -e ''$(_makefile_at_at_check_exceptions) \ + -e 'and (print "$$ARGV:$$.: $$_"), $$m=1; END {exit !$$m}' \ + $$($(VC_LIST_EXCEPT) | grep -E '(^|/)(Makefile\.am|[^/]+\.mk)$$') \ + && { echo '$(ME): use $$(...), not @...@' 1>&2; exit 1; } || : + +sc_makefile_TAB_only_indentation: + @prohibit='^ [ ]{8}' \ + in_vc_files='akefile|\.mk$$' \ + halt='found TAB-8-space indentation' \ + $(_sc_search_regexp) + +sc_m4_quote_check: + @prohibit='(AC_DEFINE(_UNQUOTED)?|AC_DEFUN)\([^[]' \ + in_vc_files='(^configure\.ac|\.m4)$$' \ + halt='quote the first arg to AC_DEF*' \ + $(_sc_search_regexp) + +fix_po_file_diag = \ +'you have changed the set of files with translatable diagnostics;\n\ +apply the above patch\n' + +# Verify that all source files using _() (more specifically, files that +# match $(_gl_translatable_string_re)) are listed in po/POTFILES.in. +po_file ?= $(srcdir)/po/POTFILES.in +generated_files ?= $(srcdir)/lib/*.[ch] +_gl_translatable_string_re ?= \b(N?_|gettext *)\([^)"]*("|$$) +sc_po_check: + @if test -f $(po_file); then \ + grep -E -v '^(#|$$)' $(po_file) \ + | grep -v '^src/false\.c$$' | sort > $@-1; \ + files=; \ + for file in $$($(VC_LIST_EXCEPT)) $(generated_files); do \ + test -r $$file || continue; \ + case $$file in \ + *.m4|*.mk) continue ;; \ + *.?|*.??) ;; \ + *) continue;; \ + esac; \ + case $$file in \ + *.[ch]) \ + base=`expr " $$file" : ' \(.*\)\..'`; \ + { test -f $$base.l || test -f $$base.y; } && continue;; \ + esac; \ + files="$$files $$file"; \ + done; \ + grep -E -l '$(_gl_translatable_string_re)' $$files \ + | sed 's|^$(_dot_escaped_srcdir)/||' | sort -u > $@-2; \ + diff -u -L $(po_file) -L $(po_file) $@-1 $@-2 \ + || { printf '$(ME): '$(fix_po_file_diag) 1>&2; exit 1; }; \ + rm -f $@-1 $@-2; \ + fi + +# Sometimes it is useful to change the PATH environment variable +# in Makefiles. When doing so, it's better not to use the Unix-centric +# path separator of ':', but rather the automake-provided '$(PATH_SEPARATOR)'. +msg = 'Do not use ":" above; use $$(PATH_SEPARATOR) instead' +sc_makefile_path_separator_check: + @prohibit='PATH[=].*:' \ + in_vc_files='akefile|\.mk$$' \ + halt=$(msg) \ + $(_sc_search_regexp) + +v_etc_file = $(gnulib_dir)/lib/version-etc.c +sample-test = tests/sample-test +texi = doc/$(PACKAGE).texi +# Make sure that the copyright date in $(v_etc_file) is up to date. +# Do the same for the $(sample-test) and the main doc/.texi file. +sc_copyright_check: + @require='enum { COPYRIGHT_YEAR = '$$(date +%Y)' };' \ + in_files=$(v_etc_file) \ + halt='out of date copyright in $(v_etc_file); update it' \ + $(_sc_search_regexp) + @require='# Copyright \(C\) '$$(date +%Y)' Free' \ + in_vc_files=$(sample-test) \ + halt='out of date copyright in $(sample-test); update it' \ + $(_sc_search_regexp) + @require='Copyright @copyright\{\} .*'$$(date +%Y)' Free' \ + in_vc_files=$(texi) \ + halt='out of date copyright in $(texi); update it' \ + $(_sc_search_regexp) + +# #if HAVE_... will evaluate to false for any non numeric string. +# That would be flagged by using -Wundef, however gnulib currently +# tests many undefined macros, and so we can't enable that option. +# So at least preclude common boolean strings as macro values. +sc_Wundef_boolean: + @prohibit='^#define.*(yes|no|true|false)$$' \ + in_files='$(CONFIG_INCLUDE)' \ + halt='Use 0 or 1 for macro values' \ + $(_sc_search_regexp) + +# Even if you use pathmax.h to guarantee that PATH_MAX is defined, it might +# not be constant, or might overflow a stack. In general, use PATH_MAX as +# a limit, not an array or alloca size. +sc_prohibit_path_max_allocation: + @prohibit='(\balloca *\([^)]*|\[[^]]*)\bPATH_MAX' \ + halt='Avoid stack allocations of size PATH_MAX' \ + $(_sc_search_regexp) + +sc_vulnerable_makefile_CVE-2009-4029: + @prohibit='perm -777 -exec chmod a\+rwx|chmod 777 \$$\(distdir\)' \ + in_files='(^|/)Makefile\.in$$' \ + halt=$$(printf '%s\n' \ + 'the above files are vulnerable; beware of running' \ + ' "make dist*" rules, and upgrade to fixed automake' \ + ' see http://bugzilla.redhat.com/542609 for details') \ + $(_sc_search_regexp) + +sc_vulnerable_makefile_CVE-2012-3386: + @prohibit='chmod a\+w \$$\(distdir\)' \ + in_files='(^|/)Makefile\.in$$' \ + halt=$$(printf '%s\n' \ + 'the above files are vulnerable; beware of running' \ + ' "make distcheck", and upgrade to fixed automake' \ + ' see http://bugzilla.redhat.com/CVE-2012-3386 for details') \ + $(_sc_search_regexp) + + +## ------------- ## +## Distribution. ## +## ------------- ## + +EXTRA_DIST += \ + $(_build-aux)/sanity.mk \ + $(NOTHING_ELSE) diff --git a/build-aux/specl.mk b/build-aux/specl.mk new file mode 100644 index 0000000..530d961 --- /dev/null +++ b/build-aux/specl.mk @@ -0,0 +1,71 @@ +# Slingshot specl rules for make. + +# This file is distributed with Slingshot, and licensed under the +# terms of the MIT license reproduced below. + +# ==================================================================== # +# Copyright (C) 2013-2015 Gary V. Vaughan # +# # +# Permission is hereby granted, free of charge, to any person # +# obtaining a copy of this software and associated documentation # +# files (the "Software"), to deal in the Software without restriction, # +# including without limitation the rights to use, copy, modify, merge, # +# publish, distribute, sublicense, and/or sell copies of the Software, # +# and to permit persons to whom the Software is furnished to do so, # +# subject to the following conditions: # +# # +# The above copyright notice and this permission notice shall be # +# included in all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGE- # +# MENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE # +# FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF # +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION # +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # +# ==================================================================== # + +# To use this file create a list of your spec files in specl_SPECS +# and then include this make fragment. + +## ------ ## +## Specl. ## +## ------ ## + +CHECK_ENV += \ + LUA='$(LUA)' \ + PACKAGE_STRING='$(PACKAGE_STRING)' \ + abs_top_builddir='$(abs_top_builddir)' \ + abs_top_srcdir='$(abs_top_srcdir)' \ + top_builddir='$(top_builddir)' \ + top_srcdir='$(top_srcdir)' \ + $(NOTHING_ELSE) + +check_local += specl-check-local +specl-check-local: $(specl_SPECS) + $(CHECK_ENV) $(SPECL_ENV) $(SPECL) $(SPECL_OPTS) $(specl_SPECS) + + +## ------------- ## +## Installation. ## +## ------------- ## + +INSTALLCHECK_ENV += \ + LUA='$(LUA)' \ + PACKAGE_STRING='$(PACKAGE_STRING)' \ + installcheck='true' \ + $(NOTHING_ELSE) + +installcheck_local += specl-installcheck-local +specl-installcheck-local: $(specl_SPECS) + $(INSTALLCHECK_ENV) $(SPECL_ENV) $(SPECL) $(SPECL_OPTS) $(specl_SPECS) + + +## ------------- ## +## Distribution. ## +## ------------- ## + +EXTRA_DIST += \ + $(specl_SPECS) \ + $(NOTHING_ELSE) diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..6e0b5c4 --- /dev/null +++ b/config.h.in @@ -0,0 +1,254 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define this if your system has a crypt() function */ +#undef HAVE_CRYPT + +/* Define to 1 if you have the header file. */ +#undef HAVE_CRYPT_H + +/* Define to 1 if a SysV or X/Open compatible Curses library is present */ +#undef HAVE_CURSES + +/* Define to 1 if library supports color (enhanced functions) */ +#undef HAVE_CURSES_COLOR + +/* Define to 1 if library supports X/Open Enhanced functions */ +#undef HAVE_CURSES_ENHANCED + +/* Define to 1 if is present */ +#undef HAVE_CURSES_H + +/* Define to 1 if library supports certain obsolete features */ +#undef HAVE_CURSES_OBSOLETE + +/* Define to 1 if you have the declaration of `fdatasync', and to 0 if you + don't. */ +#undef HAVE_DECL_FDATASYNC + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the `gethostid' function. */ +#undef HAVE_GETHOSTID + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LAUXLIB_H + +/* Define to 1 if you have the `rt' library (-lrt). */ +#undef HAVE_LIBRT + +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_NETLINK_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LUACONF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LUALIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LUA_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `msgrcv' function. */ +#undef HAVE_MSGRCV + +/* Define to 1 if you have the `msgsnd' function. */ +#undef HAVE_MSGSND + +/* Define to 1 if the Ncurses library is present */ +#undef HAVE_NCURSES + +/* Define to 1 if the NcursesW library is present */ +#undef HAVE_NCURSESW + +/* Define to 1 if is present */ +#undef HAVE_NCURSESW_CURSES_H + +/* Define to 1 if is present */ +#undef HAVE_NCURSESW_H + +/* Define to 1 if is present */ +#undef HAVE_NCURSES_CURSES_H + +/* Define to 1 if is present */ +#undef HAVE_NCURSES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NET_IF_H + +/* Define to 1 if you have the `posix_fadvise' function. */ +#undef HAVE_POSIX_FADVISE + +/* Define to 1 if you have the `resizeterm' function. */ +#undef HAVE_RESIZETERM + +/* Define to 1 if you have the `sched_getsheduler' function. */ +#undef HAVE_SCHED_GETSHEDULER + +/* Define to 1 if you have the `sched_setscheduler' function. */ +#undef HAVE_SCHED_SETSCHEDULER + +/* Define to 1 if you have the `statvfs' function. */ +#undef HAVE_STATVFS + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strlcpy' function. */ +#undef HAVE_STRLCPY + +/* Define if your system has SysV message APIs */ +#undef HAVE_SYSV_MESSAGING + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MSG_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STATVFS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#undef LT_OBJDIR + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif + + +/* Version number of package */ +#undef VERSION + +/* Define to 1 if on MINIX. */ +#undef _MINIX + +/* The _Noreturn keyword of C11. */ +#if ! (defined _Noreturn \ + || (defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__)) +# if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \ + || 0x5110 <= __SUNPRO_C) +# define _Noreturn __attribute__ ((__noreturn__)) +# elif defined _MSC_VER && 1200 <= _MSC_VER +# define _Noreturn __declspec (noreturn) +# else +# define _Noreturn +# endif +#endif + + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +#undef _POSIX_1_SOURCE + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +#undef _POSIX_SOURCE + +/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports + the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of + earlier versions), but does not display it by setting __GNUC_STDC_INLINE__. + __APPLE__ && __MACH__ test for Mac OS X. + __APPLE_CC__ tests for the Apple compiler and its version. + __STDC_VERSION__ tests for the C99 mode. */ +#if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__ +# define __GNUC_STDC_INLINE__ 1 +#endif + +/* Define as a marker that can be attached to declarations that might not + be used. This helps to reduce warnings, such as from + GCC -Wunused-parameter. */ +#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) +# define _GL_UNUSED __attribute__ ((__unused__)) +#else +# define _GL_UNUSED +#endif +/* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name + is a misnomer outside of parameter lists. */ +#define _UNUSED_PARAMETER_ _GL_UNUSED + +/* gcc supports the "unused" attribute on possibly unused labels, and + g++ has since version 4.5. Note to support C++ as well as C, + _GL_UNUSED_LABEL should be used with a trailing ; */ +#if !defined __cplusplus || __GNUC__ > 4 \ + || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) +# define _GL_UNUSED_LABEL _GL_UNUSED +#else +# define _GL_UNUSED_LABEL +#endif + +/* The __pure__ attribute was added in gcc 2.96. */ +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) +# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__)) +#else +# define _GL_ATTRIBUTE_PURE /* empty */ +#endif + +/* The __const__ attribute was added in gcc 2.95. */ +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) +# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__)) +#else +# define _GL_ATTRIBUTE_CONST /* empty */ +#endif + diff --git a/configure b/configure new file mode 100755 index 0000000..c327376 --- /dev/null +++ b/configure @@ -0,0 +1,17501 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for luaposix 33.3.1. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: http://github.com/luaposix/luaposix/issues about your +$0: system, including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='luaposix' +PACKAGE_TARNAME='luaposix' +PACKAGE_VERSION='33.3.1' +PACKAGE_STRING='luaposix 33.3.1' +PACKAGE_BUGREPORT='http://github.com/luaposix/luaposix/issues' +PACKAGE_URL='' + +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='gltests_LTLIBOBJS +gltests_LIBOBJS +gl_LTLIBOBJS +gl_LIBOBJS +am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +HAVE_LDOC_FALSE +HAVE_LDOC_TRUE +LDOC +PERL +SPECL +LUA_INCLUDE +pkgluaexecdir +luaexecdir +pkgluadir +luadir +LUA_EXEC_PREFIX +LUA_PREFIX +LUA_PLATFORM +LUA_SHORT_VERSION +LUA_VERSION +LUA +CURSES_LIB +LIBRT +LIBSOCKET +LIBCRYPT +gltests_WITNESS +GL_COND_LIBTOOL_FALSE +GL_COND_LIBTOOL_TRUE +LIBTOOL_DEPS +shrext +objdir +LT_SYS_LIBRARY_PATH +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +DLLTOOL +OBJDUMP +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +LIBTOOL +ac_ct_AR +WARN_CFLAGS +WERROR_CFLAGS +POSIX_EXTRA_CPPFLAGS +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +SED +RANLIB +ARFLAGS +AR +EGREP +GREP +CPP +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_dependency_tracking +enable_gcc_warnings +enable_static +enable_shared +with_pic +enable_fast_install +with_aix_soname +with_gnu_ld +with_sysroot +enable_libtool_lock +with_ncurses +with_ncursesw +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +LT_SYS_LIBRARY_PATH +CURSES_LIB +LUA +LUA_INCLUDE' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures luaposix 33.3.1 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/luaposix] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of luaposix 33.3.1:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + --enable-gcc-warnings turn on lots of GCC warnings (for developers) + --enable-static[=PKGS] build static libraries [default=no] + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-aix-soname=aix|svr4|both + shared library versioning (aka "SONAME") variant to + provide on AIX, [default=aix]. + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot[=DIR] Search for dependent libraries within DIR (or the + compiler's sysroot if not specified). + --with-ncurses force the use of Ncurses or NcursesW + --without-ncursesw do not use NcursesW (wide character support) + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + LT_SYS_LIBRARY_PATH + User-defined run-time library search path. + CURSES_LIB linker library for Curses, e.g. -lcurses + LUA The Lua interpreter, e.g. /usr/bin/lua5.1 + LUA_INCLUDE The Lua includes, e.g. -I/usr/include/lua5.1 + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +luaposix configure 33.3.1 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## --------------------------------------------------------- ## +## Report this to http://github.com/luaposix/luaposix/issues ## +## --------------------------------------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES +# --------------------------------------------- +# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR +# accordingly. +ac_fn_c_check_decl () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + as_decl_name=`echo $2|sed 's/ *(.*//'` + as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 +$as_echo_n "checking whether $as_decl_name is declared... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +#ifndef $as_decl_name +#ifdef __cplusplus + (void) $as_decl_use; +#else + (void) $as_decl_name; +#endif +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_decl +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by luaposix $as_me 33.3.1, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +ac_aux_dir= +for ac_dir in build-aux "$srcdir"/build-aux; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + + +$as_echo "## --------------------------- ## +## Configuring luaposix 33.3.1 ## +## --------------------------- ##" +echo + +am__api_version='1.15' + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='luaposix' + VERSION='33.3.1' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + + +## Check for programs +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Minix Amsterdam compiler" >&5 +$as_echo_n "checking for Minix Amsterdam compiler... " >&6; } +if ${gl_cv_c_amsterdam_compiler+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#ifdef __ACK__ +Amsterdam +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Amsterdam" >/dev/null 2>&1; then : + gl_cv_c_amsterdam_compiler=yes +else + gl_cv_c_amsterdam_compiler=no +fi +rm -f conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_c_amsterdam_compiler" >&5 +$as_echo "$gl_cv_c_amsterdam_compiler" >&6; } + if test -z "$AR"; then + if test $gl_cv_c_amsterdam_compiler = yes; then + AR='cc -c.a' + if test -z "$ARFLAGS"; then + ARFLAGS='-o' + fi + else + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="ar" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="ar" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +fi + + if test -z "$ARFLAGS"; then + ARFLAGS='cru' + fi + fi + else + if test -z "$ARFLAGS"; then + ARFLAGS='cru' + fi + fi + + + if test -z "$RANLIB"; then + if test $gl_cv_c_amsterdam_compiler = yes; then + RANLIB=':' + else + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + + fi + fi + + + + + # Code from module manywarnings: + # Code from module warnings: + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + + + +## ------------------------------------------------------------------------ +## Compiler flags for POSIX 2008 or better compliance. +## ------------------------------------------------------------------------ + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + ac_fn_c_check_header_mongrel "$LINENO" "minix/config.h" "ac_cv_header_minix_config_h" "$ac_includes_default" +if test "x$ac_cv_header_minix_config_h" = xyes; then : + MINIX=yes +else + MINIX= +fi + + + if test "$MINIX" = yes; then + +$as_echo "#define _POSIX_SOURCE 1" >>confdefs.h + + +$as_echo "#define _POSIX_1_SOURCE 2" >>confdefs.h + + +$as_echo "#define _MINIX 1" >>confdefs.h + + fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__" >&5 +$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if ${ac_cv_safe_to_define___extensions__+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +# define __EXTENSIONS__ 1 + $ac_includes_default +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_safe_to_define___extensions__=yes +else + ac_cv_safe_to_define___extensions__=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__" >&5 +$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } + test $ac_cv_safe_to_define___extensions__ = yes && + $as_echo "#define __EXTENSIONS__ 1" >>confdefs.h + + $as_echo "#define _ALL_SOURCE 1" >>confdefs.h + + $as_echo "#define _GNU_SOURCE 1" >>confdefs.h + + $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h + + $as_echo "#define _TANDEM_SOURCE 1" >>confdefs.h + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +case $host_os in + *nto*|*qnx*) + # QNX is only POSIX 2001, but _XOPEN_SOURCE turns off other + # functions luaposix can bind. + POSIX_EXTRA_CPPFLAGS=-DLPOSIX_2001_COMPLIANT + + ;; + + darwin*|openbsd*) + # Setting _XOPEN_SOURCE here messes up header declarations, but + # all functions luaposix can bind are available without it. + POSIX_EXTRA_CPPFLAGS=-DLPOSIX_2008_COMPLIANT + + ;; + + *) + # Enable POSIX 2008. Please send a $host_os match if your host + # is not compliant. + POSIX_EXTRA_CPPFLAGS=-D_XOPEN_SOURCE=700 + + ;; +esac + + +# Check whether --enable-gcc-warnings was given. +if test "${enable_gcc_warnings+set}" = set; then : + enableval=$enable_gcc_warnings; case $enableval in + yes|no) ;; + *) as_fn_error $? "bad value $enableval for gcc-warnings option" "$LINENO" 5 ;; + esac + gl_gcc_warnings=$enableval +else + gl_gcc_warnings=no + +fi + + +if test "$gl_gcc_warnings" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Werror -Wunknown-warning-option" >&5 +$as_echo_n "checking whether C compiler handles -Werror -Wunknown-warning-option... " >&6; } +if ${gl_cv_warn_c__Werror__Wunknown_warning_option+:} false; then : + $as_echo_n "(cached) " >&6 +else + + gl_save_compiler_FLAGS="$CFLAGS" + as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Werror -Wunknown-warning-option" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gl_cv_warn_c__Werror__Wunknown_warning_option=yes +else + gl_cv_warn_c__Werror__Wunknown_warning_option=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$gl_save_compiler_FLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Werror__Wunknown_warning_option" >&5 +$as_echo "$gl_cv_warn_c__Werror__Wunknown_warning_option" >&6; } +if test "x$gl_cv_warn_c__Werror__Wunknown_warning_option" = xyes; then : + gl_unknown_warnings_are_errors='-Wunknown-warning-option -Werror' +else + gl_unknown_warnings_are_errors= +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Werror" >&5 +$as_echo_n "checking whether C compiler handles -Werror... " >&6; } +if ${gl_cv_warn_c__Werror+:} false; then : + $as_echo_n "(cached) " >&6 +else + + gl_save_compiler_FLAGS="$CFLAGS" + as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Werror" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gl_cv_warn_c__Werror=yes +else + gl_cv_warn_c__Werror=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$gl_save_compiler_FLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Werror" >&5 +$as_echo "$gl_cv_warn_c__Werror" >&6; } +if test "x$gl_cv_warn_c__Werror" = xyes; then : + as_fn_append WERROR_CFLAGS " -Werror" +fi + + + + # Set up the list of undesired warnings. + nw= + nw="$nw -Wsystem-headers" # Don't let system headers trigger warnings + nw="$nw -Wundef" # All compiler preprocessors support #if UNDEF + nw="$nw -Wtraditional" # All compilers nowadays support ANSI C + nw="$nw -Wstrict-overflow" # Use a lower level (see below). + nw="$nw -Wconversion" # These warnings usually don't point to mistakes. + nw="$nw -Wsign-conversion" # Likewise. + nw="$nw -Waggregate-return" # We do this on purpose. + nw="$nw -Wtraditional-conversion" # Don't care. + nw="$nw -Wpadded" # Don't care. + nw="$nw -Wc++-compat" # Don't care. + nw="$nw -Woverlength-strings" # Don't care. + nw="$nw -Wmissing-format-attribute" # Don't care. + nw="$nw -Wunreachable-code" # Seems buggy. + nw="$nw -Wunused-macros" # those macros might come in handy later + + + + if test -n "$GCC"; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -Wno-missing-field-initializers is supported" >&5 +$as_echo_n "checking whether -Wno-missing-field-initializers is supported... " >&6; } + if ${gl_cv_cc_nomfi_supported+:} false; then : + $as_echo_n "(cached) " >&6 +else + + gl_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -W -Werror -Wno-missing-field-initializers" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gl_cv_cc_nomfi_supported=yes +else + gl_cv_cc_nomfi_supported=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$gl_save_CFLAGS" +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_nomfi_supported" >&5 +$as_echo "$gl_cv_cc_nomfi_supported" >&6; } + + if test "$gl_cv_cc_nomfi_supported" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -Wno-missing-field-initializers is needed" >&5 +$as_echo_n "checking whether -Wno-missing-field-initializers is needed... " >&6; } + if ${gl_cv_cc_nomfi_needed+:} false; then : + $as_echo_n "(cached) " >&6 +else + + gl_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -W -Werror" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +void f (void) + { + typedef struct { int a; int b; } s_t; + s_t s1 = { 0, }; + } + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gl_cv_cc_nomfi_needed=no +else + gl_cv_cc_nomfi_needed=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$gl_save_CFLAGS" + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_nomfi_needed" >&5 +$as_echo "$gl_cv_cc_nomfi_needed" >&6; } + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -Wuninitialized is supported" >&5 +$as_echo_n "checking whether -Wuninitialized is supported... " >&6; } + if ${gl_cv_cc_uninitialized_supported+:} false; then : + $as_echo_n "(cached) " >&6 +else + + gl_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Werror -Wuninitialized" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gl_cv_cc_uninitialized_supported=yes +else + gl_cv_cc_uninitialized_supported=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$gl_save_CFLAGS" +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_cc_uninitialized_supported" >&5 +$as_echo "$gl_cv_cc_uninitialized_supported" >&6; } + + fi + + # List all gcc warning categories. + # To compare this list to your installed GCC's, run this Bash command: + # + # comm -3 \ + # <(sed -n 's/^ *\(-[^ ]*\) .*/\1/p' manywarnings.m4 | sort) \ + # <(gcc --help=warnings | sed -n 's/^ \(-[^ ]*\) .*/\1/p' | sort | + # grep -v -x -f <( + # awk '/^[^#]/ {print warnings}' ../build-aux/gcc-warning.spec)) + + gl_manywarn_set= + for gl_manywarn_item in \ + -W \ + -Wabi \ + -Waddress \ + -Waggressive-loop-optimizations \ + -Wall \ + -Warray-bounds \ + -Wattributes \ + -Wbad-function-cast \ + -Wbuiltin-macro-redefined \ + -Wcast-align \ + -Wchar-subscripts \ + -Wclobbered \ + -Wcomment \ + -Wcomments \ + -Wcoverage-mismatch \ + -Wcpp \ + -Wdate-time \ + -Wdeprecated \ + -Wdeprecated-declarations \ + -Wdisabled-optimization \ + -Wdiv-by-zero \ + -Wdouble-promotion \ + -Wempty-body \ + -Wendif-labels \ + -Wenum-compare \ + -Wextra \ + -Wformat-contains-nul \ + -Wformat-extra-args \ + -Wformat-nonliteral \ + -Wformat-security \ + -Wformat-y2k \ + -Wformat-zero-length \ + -Wfree-nonheap-object \ + -Wignored-qualifiers \ + -Wimplicit \ + -Wimplicit-function-declaration \ + -Wimplicit-int \ + -Winit-self \ + -Winline \ + -Wint-to-pointer-cast \ + -Winvalid-memory-model \ + -Winvalid-pch \ + -Wjump-misses-init \ + -Wlogical-op \ + -Wmain \ + -Wmaybe-uninitialized \ + -Wmissing-braces \ + -Wmissing-declarations \ + -Wmissing-field-initializers \ + -Wmissing-include-dirs \ + -Wmissing-parameter-type \ + -Wmissing-prototypes \ + -Wmultichar \ + -Wnarrowing \ + -Wnested-externs \ + -Wnonnull \ + -Wold-style-declaration \ + -Wold-style-definition \ + -Wopenmp-simd \ + -Woverflow \ + -Woverlength-strings \ + -Woverride-init \ + -Wpacked \ + -Wpacked-bitfield-compat \ + -Wparentheses \ + -Wpointer-arith \ + -Wpointer-sign \ + -Wpointer-to-int-cast \ + -Wpragmas \ + -Wreturn-local-addr \ + -Wreturn-type \ + -Wsequence-point \ + -Wshadow \ + -Wsizeof-pointer-memaccess \ + -Wstack-protector \ + -Wstrict-aliasing \ + -Wstrict-overflow \ + -Wstrict-prototypes \ + -Wsuggest-attribute=const \ + -Wsuggest-attribute=format \ + -Wsuggest-attribute=noreturn \ + -Wsuggest-attribute=pure \ + -Wswitch \ + -Wswitch-default \ + -Wsync-nand \ + -Wsystem-headers \ + -Wtrampolines \ + -Wtrigraphs \ + -Wtype-limits \ + -Wuninitialized \ + -Wunknown-pragmas \ + -Wunsafe-loop-optimizations \ + -Wunused \ + -Wunused-but-set-parameter \ + -Wunused-but-set-variable \ + -Wunused-function \ + -Wunused-label \ + -Wunused-local-typedefs \ + -Wunused-macros \ + -Wunused-parameter \ + -Wunused-result \ + -Wunused-value \ + -Wunused-variable \ + -Wvarargs \ + -Wvariadic-macros \ + -Wvector-operation-performance \ + -Wvla \ + -Wvolatile-register-var \ + -Wwrite-strings \ + \ + ; do + gl_manywarn_set="$gl_manywarn_set $gl_manywarn_item" + done + + # gcc --help=warnings outputs an unusual form for this option; list + # it here so that the above 'comm' command doesn't report a false match. + gl_manywarn_set="$gl_manywarn_set -Wnormalized=nfc" + + # These are needed for older GCC versions. + if test -n "$GCC"; then + case `($CC --version) 2>/dev/null` in + 'gcc (GCC) '[0-3].* | \ + 'gcc (GCC) '4.[0-7].*) + gl_manywarn_set="$gl_manywarn_set -fdiagnostics-show-option" + gl_manywarn_set="$gl_manywarn_set -funit-at-a-time" + ;; + esac + fi + + # Disable specific options as needed. + if test "$gl_cv_cc_nomfi_needed" = yes; then + gl_manywarn_set="$gl_manywarn_set -Wno-missing-field-initializers" + fi + + if test "$gl_cv_cc_uninitialized_supported" = no; then + gl_manywarn_set="$gl_manywarn_set -Wno-uninitialized" + fi + + warnings=$gl_manywarn_set + + + # Enable all GCC warnings not in this list. + + gl_warn_set= + set x $warnings; shift + for gl_warn_item + do + case " $nw " in + *" $gl_warn_item "*) + ;; + *) + gl_warn_set="$gl_warn_set $gl_warn_item" + ;; + esac + done + warnings=$gl_warn_set + + for w in $warnings; do + +as_gl_Warn=`$as_echo "gl_cv_warn_c_$w" | $as_tr_sh` +gl_positive="$w" +case $gl_positive in + -Wno-*) gl_positive=-W`expr "X$gl_positive" : 'X-Wno-\(.*\)'` ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles $w" >&5 +$as_echo_n "checking whether C compiler handles $w... " >&6; } +if eval \${$as_gl_Warn+:} false; then : + $as_echo_n "(cached) " >&6 +else + + gl_save_compiler_FLAGS="$CFLAGS" + as_fn_append CFLAGS " $gl_unknown_warnings_are_errors $gl_positive" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$as_gl_Warn=yes" +else + eval "$as_gl_Warn=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$gl_save_compiler_FLAGS" + +fi +eval ac_res=\$$as_gl_Warn + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if eval test \"x\$"$as_gl_Warn"\" = x"yes"; then : + as_fn_append WARN_CFLAGS " $w" +fi + + + done + + # Add an extra warning + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -Wstrict-overflow=1" >&5 +$as_echo_n "checking whether C compiler handles -Wstrict-overflow=1... " >&6; } +if ${gl_cv_warn_c__Wstrict_overflow_1+:} false; then : + $as_echo_n "(cached) " >&6 +else + + gl_save_compiler_FLAGS="$CFLAGS" + as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -Wstrict-overflow=1" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gl_cv_warn_c__Wstrict_overflow_1=yes +else + gl_cv_warn_c__Wstrict_overflow_1=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$gl_save_compiler_FLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__Wstrict_overflow_1" >&5 +$as_echo "$gl_cv_warn_c__Wstrict_overflow_1" >&6; } +if test "x$gl_cv_warn_c__Wstrict_overflow_1" = xyes; then : + as_fn_append WARN_CFLAGS " -Wstrict-overflow=1" +fi + + + # Add some more safety measures + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -D_FORTIFY_SOURCE=2" >&5 +$as_echo_n "checking whether C compiler handles -D_FORTIFY_SOURCE=2... " >&6; } +if ${gl_cv_warn_c__D_FORTIFY_SOURCE_2+:} false; then : + $as_echo_n "(cached) " >&6 +else + + gl_save_compiler_FLAGS="$CFLAGS" + as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -D_FORTIFY_SOURCE=2" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gl_cv_warn_c__D_FORTIFY_SOURCE_2=yes +else + gl_cv_warn_c__D_FORTIFY_SOURCE_2=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$gl_save_compiler_FLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__D_FORTIFY_SOURCE_2" >&5 +$as_echo "$gl_cv_warn_c__D_FORTIFY_SOURCE_2" >&6; } +if test "x$gl_cv_warn_c__D_FORTIFY_SOURCE_2" = xyes; then : + as_fn_append WARN_CFLAGS " -D_FORTIFY_SOURCE=2" +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler handles -fmudflap" >&5 +$as_echo_n "checking whether C compiler handles -fmudflap... " >&6; } +if ${gl_cv_warn_c__fmudflap+:} false; then : + $as_echo_n "(cached) " >&6 +else + + gl_save_compiler_FLAGS="$CFLAGS" + as_fn_append CFLAGS " $gl_unknown_warnings_are_errors -fmudflap" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + gl_cv_warn_c__fmudflap=yes +else + gl_cv_warn_c__fmudflap=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + CFLAGS="$gl_save_compiler_FLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_warn_c__fmudflap" >&5 +$as_echo "$gl_cv_warn_c__fmudflap" >&6; } +if test "x$gl_cv_warn_c__fmudflap" = xyes; then : + as_fn_append WARN_CFLAGS " -fmudflap" +fi + + +fi + +## required by automake 1.12.x, not available in 1.10.x +if test -n "$ac_tool_prefix"; then + for ac_prog in ar lib "link -lib" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar lib "link -lib" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 +$as_echo_n "checking the archiver ($AR) interface... " >&6; } +if ${am_cv_ar_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + am_cv_ar_interface=ar + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int some_variable = 0; +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=ar + else + am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 + (eval $am_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + am_cv_ar_interface=lib + else + am_cv_ar_interface=unknown + fi + fi + rm -f conftest.lib libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 +$as_echo "$am_cv_ar_interface" >&6; } + +case $am_cv_ar_interface in +ar) + ;; +lib) + # Microsoft lib, so override with the ar-lib wrapper script. + # FIXME: It is wrong to rewrite AR. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__AR in this case, + # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something + # similar. + AR="$am_aux_dir/ar-lib $AR" + ;; +unknown) + as_fn_error $? "could not determine $AR interface" "$LINENO" 5 + ;; +esac + + + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.6' +macro_revision='2.4.6' + + + + + + + + + + + + + +ltmain=$ac_aux_dir/ltmain.sh + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case $ECHO in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n "$lt_cv_sys_max_cmd_len"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test yes != "$GCC"; then + reload_cmds=false + fi + ;; + darwin*) + if test yes = "$GCC"; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 +$as_echo "$with_sysroot" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 +$as_echo_n "checking for a working dd... " >&6; } +if ${ac_cv_path_lt_DD+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +if test -z "$lt_DD"; then + ac_path_lt_DD_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in dd; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_lt_DD" || continue +if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi + $ac_path_lt_DD_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_lt_DD"; then + : + fi +else + ac_cv_path_lt_DD=$lt_DD +fi + +rm -f conftest.i conftest2.i conftest.out +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 +$as_echo "$ac_cv_path_lt_DD" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 +$as_echo_n "checking how to truncate binary pipes... " >&6; } +if ${lt_cv_truncate_bin+:} false; then : + $as_echo_n "(cached) " >&6 +else + printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 +$as_echo "$lt_cv_truncate_bin" >&6; } + + + + + + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[012][,.]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + + +# Set options +# Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_static=no +fi + + + + + + + + + + + enable_dlopen=no + + + enable_win32_dll=no + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + pic_mode=default +fi + + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[5-9]*,yes) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 +$as_echo_n "checking which variant of shared library versioning to provide... " >&6; } + +# Check whether --with-aix-soname was given. +if test "${with_aix_soname+set}" = set; then : + withval=$with_aix_soname; case $withval in + aix|svr4|both) + ;; + *) + as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname +else + if ${lt_cv_with_aix_soname+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_with_aix_soname=aix +fi + + with_aix_soname=$lt_cv_with_aix_soname +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 +$as_echo "$with_aix_soname" >&6; } + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +func_cc_basename $compiler +cc_basename=$func_cc_basename_result + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/${ac_tool_prefix}file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/file"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac +fi + +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC=$CC +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test yes = "$GCC"; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + lt_prog_compiler_pic='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + case $host_os in + os2*) + lt_prog_compiler_static='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_pic_works"; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test yes = "$lt_cv_prog_compiler_static_works"; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links=nottested +if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test no = "$hard_links"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + export_dynamic_flag_spec='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='$wl--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + export_dynamic_flag_spec='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test no = "$ld_shlibs"; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + hardcode_direct=no + hardcode_direct_absolute=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + export_dynamic_flag_spec='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=/usr/lib:/lib + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' $wl-bernotok' + allow_undefined_flag=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test yes = "$lt_cv_ld_force_load"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test yes = "$GCC"; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test yes = "$lt_cv_prog_compiler__b"; then + archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test no = "$with_gnu_ld"; then + hardcode_libdir_flag_spec='$wl+b $wl$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test yes = "$lt_cv_irix_exported_symbol"; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + ld_shlibs=yes + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + export_dynamic_flag_spec='$wl-E' + else + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='$wl-rpath,$libdir' + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + shrext_cmds=.dll + archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + enable_shared_with_static_runtimes=yes + ;; + + osf3*) + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + allow_undefined_flag=' $wl-expect_unresolved $wl\*' + archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='$wl-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='$wl-z,text' + allow_undefined_flag='$wl-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='$wl-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='$wl-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test no = "$ld_shlibs" && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([A-Za-z]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + + + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a(lib.so.V)' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + hardcode_libdir_flag_spec='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test yes = "$hardcode_automatic"; then + + # We can hardcode non-existent directories. + if test no != "$hardcode_direct" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && + test no != "$hardcode_minus_L"; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test relink = "$hardcode_action" || + test yes = "$inherit_rpath"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen=shl_load +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen=dlopen +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test yes = "$cross_compiling"; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report what library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + +module=yes eval shrext=$shrext_cmds + + + + + + + + + + + LIBC_FATAL_STDERR_=1 + export LIBC_FATAL_STDERR_ + + + if true; then + GL_COND_LIBTOOL_TRUE= + GL_COND_LIBTOOL_FALSE='#' +else + GL_COND_LIBTOOL_TRUE='#' + GL_COND_LIBTOOL_FALSE= +fi + + gl_cond_libtool=true + gl_m4_base='m4' + + + + + + + + + + gl_source_base='unused' + # End of code from modules + + + + + + + + gltests_libdeps= + gltests_ltlibdeps= + + + + + + + + + + gl_source_base='tests' + gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS + + gl_module_indicator_condition=$gltests_WITNESS + + + + + + + + + + + +## Check for header files +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +for ac_header in crypt.h strings.h sys/statvfs.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +for ac_header in net/if.h linux/netlink.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" " +#include + +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +## SysV messaging +for ac_header in sys/msg.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/msg.h" "ac_cv_header_sys_msg_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_msg_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_MSG_H 1 +_ACEOF + +fi + +done + +for ac_func in msgrcv msgsnd +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +case $ac_cv_header_sys_msg_h,$ac_cv_func_msgrcv,$ac_cv_func_msgsnd in + yes,yes,yes) + +$as_echo "#define HAVE_SYSV_MESSAGING 1" >>confdefs.h + + ;; +esac + + + + ac_fn_c_check_decl "$LINENO" "fdatasync" "ac_cv_have_decl_fdatasync" "$ac_includes_default" +if test "x$ac_cv_have_decl_fdatasync" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FDATASYNC $ac_have_decl +_ACEOF + + + + : + + + + + + +## Search libs +save_LIBS=$LIBS +LIBS= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing crypt" >&5 +$as_echo_n "checking for library containing crypt... " >&6; } +if ${ac_cv_search_crypt+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char crypt (); +int +main () +{ +return crypt (); + ; + return 0; +} +_ACEOF +for ac_lib in '' crypt; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_crypt=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_crypt+:} false; then : + break +fi +done +if ${ac_cv_search_crypt+:} false; then : + +else + ac_cv_search_crypt=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_crypt" >&5 +$as_echo "$ac_cv_search_crypt" >&6; } +ac_res=$ac_cv_search_crypt +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +$as_echo "#define HAVE_CRYPT 1" >>confdefs.h + +fi + +LIBCRYPT=$LIBS + +LIBS=$save_LIBS + +## Socket (required for qnx, at least) +save_LIBS=$LIBS +LIBS= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 +$as_echo_n "checking for library containing socket... " >&6; } +if ${ac_cv_search_socket+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char socket (); +int +main () +{ +return socket (); + ; + return 0; +} +_ACEOF +for ac_lib in '' socket; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_socket=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_socket+:} false; then : + break +fi +done +if ${ac_cv_search_socket+:} false; then : + +else + ac_cv_search_socket=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 +$as_echo "$ac_cv_search_socket" >&6; } +ac_res=$ac_cv_search_socket +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +LIBSOCKET=$LIBS + +LIBS=$save_LIBS + +# FIXME: Make -lrt conditional on _XOPEN_REALTIME +save_LIBS=$LIBS +LIBS= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5 +$as_echo_n "checking for clock_gettime in -lrt... " >&6; } +if ${ac_cv_lib_rt_clock_gettime+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lrt $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char clock_gettime (); +int +main () +{ +return clock_gettime (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_rt_clock_gettime=yes +else + ac_cv_lib_rt_clock_gettime=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5 +$as_echo "$ac_cv_lib_rt_clock_gettime" >&6; } +if test "x$ac_cv_lib_rt_clock_gettime" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBRT 1 +_ACEOF + + LIBS="-lrt $LIBS" + +fi + +LIBRT=$LIBS + +LIBS=$save_LIBS + +## Curses + + + +# Check whether --with-ncurses was given. +if test "${with_ncurses+set}" = set; then : + withval=$with_ncurses; +else + with_ncurses=check +fi + + +# Check whether --with-ncursesw was given. +if test "${with_ncursesw+set}" = set; then : + withval=$with_ncursesw; +else + with_ncursesw=check +fi + + + ax_saved_LIBS=$LIBS + if test "x$with_ncurses" = xyes || test "x$with_ncursesw" = xyes; then : + ax_with_plaincurses=no +else + ax_with_plaincurses=check +fi + + ax_cv_curses_which=no + + # Test for NcursesW + + if test "x$CURSES_LIB" = x && test "x$with_ncursesw" != xno; then : + + LIBS="$ax_saved_LIBS -lncursesw" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NcursesW wide-character library" >&5 +$as_echo_n "checking for NcursesW wide-character library... " >&6; } +if ${ax_cv_ncursesw+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char initscr (); +int +main () +{ +return initscr (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_ncursesw=yes +else + ax_cv_ncursesw=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_ncursesw" >&5 +$as_echo "$ax_cv_ncursesw" >&6; } + if test "x$ax_cv_ncursesw" = xno && test "x$with_ncursesw" = xyes; then : + + as_fn_error $? "--with-ncursesw specified but could not find NcursesW library" "$LINENO" 5 + +fi + + if test "x$ax_cv_ncursesw" = xyes; then : + + ax_cv_curses=yes + ax_cv_curses_which=ncursesw + CURSES_LIB="-lncursesw" + +$as_echo "#define HAVE_NCURSESW 1" >>confdefs.h + + +$as_echo "#define HAVE_CURSES 1" >>confdefs.h + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working ncursesw/curses.h" >&5 +$as_echo_n "checking for working ncursesw/curses.h... " >&6; } +if ${ax_cv_header_ncursesw_curses_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #define _XOPEN_SOURCE_EXTENDED 1 + #include + +int +main () +{ + + chtype a = A_BOLD; + int b = KEY_LEFT; + chtype c = COLOR_PAIR(1) & A_COLOR; + attr_t d = WA_NORMAL; + cchar_t e; + wint_t f; + int g = getattrs(stdscr); + int h = getcurx(stdscr) + getmaxx(stdscr); + initscr(); + init_pair(1, COLOR_WHITE, COLOR_RED); + wattr_set(stdscr, d, 0, NULL); + wget_wch(stdscr, &f); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_header_ncursesw_curses_h=yes +else + ax_cv_header_ncursesw_curses_h=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_header_ncursesw_curses_h" >&5 +$as_echo "$ax_cv_header_ncursesw_curses_h" >&6; } + if test "x$ax_cv_header_ncursesw_curses_h" = xyes; then : + + ax_cv_curses_enhanced=yes + ax_cv_curses_color=yes + ax_cv_curses_obsolete=yes + +$as_echo "#define HAVE_CURSES_ENHANCED 1" >>confdefs.h + + +$as_echo "#define HAVE_CURSES_COLOR 1" >>confdefs.h + + +$as_echo "#define HAVE_CURSES_OBSOLETE 1" >>confdefs.h + + +$as_echo "#define HAVE_NCURSESW_CURSES_H 1" >>confdefs.h + + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working ncursesw.h" >&5 +$as_echo_n "checking for working ncursesw.h... " >&6; } +if ${ax_cv_header_ncursesw_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #define _XOPEN_SOURCE_EXTENDED 1 + #include + +int +main () +{ + + chtype a = A_BOLD; + int b = KEY_LEFT; + chtype c = COLOR_PAIR(1) & A_COLOR; + attr_t d = WA_NORMAL; + cchar_t e; + wint_t f; + int g = getattrs(stdscr); + int h = getcurx(stdscr) + getmaxx(stdscr); + initscr(); + init_pair(1, COLOR_WHITE, COLOR_RED); + wattr_set(stdscr, d, 0, NULL); + wget_wch(stdscr, &f); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_header_ncursesw_h=yes +else + ax_cv_header_ncursesw_h=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_header_ncursesw_h" >&5 +$as_echo "$ax_cv_header_ncursesw_h" >&6; } + if test "x$ax_cv_header_ncursesw_h" = xyes; then : + + ax_cv_curses_enhanced=yes + ax_cv_curses_color=yes + ax_cv_curses_obsolete=yes + +$as_echo "#define HAVE_CURSES_ENHANCED 1" >>confdefs.h + + +$as_echo "#define HAVE_CURSES_COLOR 1" >>confdefs.h + + +$as_echo "#define HAVE_CURSES_OBSOLETE 1" >>confdefs.h + + +$as_echo "#define HAVE_NCURSESW_H 1" >>confdefs.h + + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working ncurses.h" >&5 +$as_echo_n "checking for working ncurses.h... " >&6; } +if ${ax_cv_header_ncurses_h_with_ncursesw+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #define _XOPEN_SOURCE_EXTENDED 1 + #include + +int +main () +{ + + chtype a = A_BOLD; + int b = KEY_LEFT; + chtype c = COLOR_PAIR(1) & A_COLOR; + attr_t d = WA_NORMAL; + cchar_t e; + wint_t f; + int g = getattrs(stdscr); + int h = getcurx(stdscr) + getmaxx(stdscr); + initscr(); + init_pair(1, COLOR_WHITE, COLOR_RED); + wattr_set(stdscr, d, 0, NULL); + wget_wch(stdscr, &f); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_header_ncurses_h_with_ncursesw=yes +else + ax_cv_header_ncurses_h_with_ncursesw=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_header_ncurses_h_with_ncursesw" >&5 +$as_echo "$ax_cv_header_ncurses_h_with_ncursesw" >&6; } + if test "x$ax_cv_header_ncurses_h_with_ncursesw" = xyes; then : + + ax_cv_curses_enhanced=yes + ax_cv_curses_color=yes + ax_cv_curses_obsolete=yes + +$as_echo "#define HAVE_CURSES_ENHANCED 1" >>confdefs.h + + +$as_echo "#define HAVE_CURSES_COLOR 1" >>confdefs.h + + +$as_echo "#define HAVE_CURSES_OBSOLETE 1" >>confdefs.h + + +$as_echo "#define HAVE_NCURSES_H 1" >>confdefs.h + + +fi + + if test "x$ax_cv_header_ncursesw_curses_h" = xno && test "x$ax_cv_header_ncursesw_h" = xno && test "x$ax_cv_header_ncurses_h_with_ncursesw" = xno; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find a working ncursesw/curses.h, ncursesw.h or ncurses.h" >&5 +$as_echo "$as_me: WARNING: could not find a working ncursesw/curses.h, ncursesw.h or ncurses.h" >&2;} + +fi + +fi + +fi + + # Test for Ncurses + + if test "x$CURSES_LIB" = x && test "x$with_ncurses" != xno && test "x$ax_cv_curses_which" = xno; then : + + LIBS="$ax_saved_LIBS -lncurses" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Ncurses library" >&5 +$as_echo_n "checking for Ncurses library... " >&6; } +if ${ax_cv_ncurses+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char initscr (); +int +main () +{ +return initscr (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_ncurses=yes +else + ax_cv_ncurses=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_ncurses" >&5 +$as_echo "$ax_cv_ncurses" >&6; } + if test "x$ax_cv_ncurses" = xno && test "x$with_ncurses" = xyes; then : + + as_fn_error $? "--with-ncurses specified but could not find Ncurses library" "$LINENO" 5 + +fi + + if test "x$ax_cv_ncurses" = xyes; then : + + ax_cv_curses=yes + ax_cv_curses_which=ncurses + CURSES_LIB="-lncurses" + +$as_echo "#define HAVE_NCURSES 1" >>confdefs.h + + +$as_echo "#define HAVE_CURSES 1" >>confdefs.h + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working ncurses/curses.h" >&5 +$as_echo_n "checking for working ncurses/curses.h... " >&6; } +if ${ax_cv_header_ncurses_curses_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ + + chtype a = A_BOLD; + int b = KEY_LEFT; + chtype c = COLOR_PAIR(1) & A_COLOR; + int g = getattrs(stdscr); + int h = getcurx(stdscr) + getmaxx(stdscr); + initscr(); + init_pair(1, COLOR_WHITE, COLOR_RED); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_header_ncurses_curses_h=yes +else + ax_cv_header_ncurses_curses_h=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_header_ncurses_curses_h" >&5 +$as_echo "$ax_cv_header_ncurses_curses_h" >&6; } + if test "x$ax_cv_header_ncurses_curses_h" = xyes; then : + + ax_cv_curses_color=yes + ax_cv_curses_obsolete=yes + +$as_echo "#define HAVE_CURSES_COLOR 1" >>confdefs.h + + +$as_echo "#define HAVE_CURSES_OBSOLETE 1" >>confdefs.h + + +$as_echo "#define HAVE_NCURSES_CURSES_H 1" >>confdefs.h + + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working ncurses.h" >&5 +$as_echo_n "checking for working ncurses.h... " >&6; } +if ${ax_cv_header_ncurses_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ + + chtype a = A_BOLD; + int b = KEY_LEFT; + chtype c = COLOR_PAIR(1) & A_COLOR; + int g = getattrs(stdscr); + int h = getcurx(stdscr) + getmaxx(stdscr); + initscr(); + init_pair(1, COLOR_WHITE, COLOR_RED); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_header_ncurses_h=yes +else + ax_cv_header_ncurses_h=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_header_ncurses_h" >&5 +$as_echo "$ax_cv_header_ncurses_h" >&6; } + if test "x$ax_cv_header_ncurses_h" = xyes; then : + + ax_cv_curses_color=yes + ax_cv_curses_obsolete=yes + +$as_echo "#define HAVE_CURSES_COLOR 1" >>confdefs.h + + +$as_echo "#define HAVE_CURSES_OBSOLETE 1" >>confdefs.h + + +$as_echo "#define HAVE_NCURSES_H 1" >>confdefs.h + + +fi + + if test "x$ax_cv_header_ncurses_curses_h" = xno && test "x$ax_cv_header_ncurses_h" = xno; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find a working ncurses/curses.h or ncurses.h" >&5 +$as_echo "$as_me: WARNING: could not find a working ncurses/curses.h or ncurses.h" >&2;} + +fi + +fi + +fi + + # Test for plain Curses (or if CURSES_LIB was set by user) + + if test "x$with_plaincurses" != xno && test "x$ax_cv_curses_which" = xno; then : + + if test "x$CURSES_LIB" != x; then : + + LIBS="$ax_saved_LIBS $CURSES_LIB" + +else + + LIBS="$ax_saved_LIBS -lcurses" + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Curses library" >&5 +$as_echo_n "checking for Curses library... " >&6; } +if ${ax_cv_plaincurses+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char initscr (); +int +main () +{ +return initscr (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_plaincurses=yes +else + ax_cv_plaincurses=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_plaincurses" >&5 +$as_echo "$ax_cv_plaincurses" >&6; } + + if test "x$ax_cv_plaincurses" = xyes; then : + + ax_cv_curses=yes + ax_cv_curses_which=plaincurses + if test "x$CURSES_LIB" = x; then : + + CURSES_LIB="-lcurses" + +fi + +$as_echo "#define HAVE_CURSES 1" >>confdefs.h + + + # Check for base conformance (and header file) + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working curses.h" >&5 +$as_echo_n "checking for working curses.h... " >&6; } +if ${ax_cv_header_curses_h+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ + + chtype a = A_BOLD; + int b = KEY_LEFT; + initscr(); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_header_curses_h=yes +else + ax_cv_header_curses_h=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_header_curses_h" >&5 +$as_echo "$ax_cv_header_curses_h" >&6; } + if test "x$ax_cv_header_curses_h" = xyes; then : + + +$as_echo "#define HAVE_CURSES_H 1" >>confdefs.h + + + # Check for X/Open Enhanced conformance + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X/Open Enhanced Curses conformance" >&5 +$as_echo_n "checking for X/Open Enhanced Curses conformance... " >&6; } +if ${ax_cv_plaincurses_enhanced+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #define _XOPEN_SOURCE_EXTENDED 1 + #include + #ifndef _XOPEN_CURSES + #error "this Curses library is not enhanced" + "this Curses library is not enhanced" + #endif + +int +main () +{ + + chtype a = A_BOLD; + int b = KEY_LEFT; + chtype c = COLOR_PAIR(1) & A_COLOR; + attr_t d = WA_NORMAL; + cchar_t e; + wint_t f; + initscr(); + init_pair(1, COLOR_WHITE, COLOR_RED); + wattr_set(stdscr, d, 0, NULL); + wget_wch(stdscr, &f); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_plaincurses_enhanced=yes +else + ax_cv_plaincurses_enhanced=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_plaincurses_enhanced" >&5 +$as_echo "$ax_cv_plaincurses_enhanced" >&6; } + if test "x$ax_cv_plaincurses_enhanced" = xyes; then : + + ax_cv_curses_enhanced=yes + ax_cv_curses_color=yes + +$as_echo "#define HAVE_CURSES_ENHANCED 1" >>confdefs.h + + +$as_echo "#define HAVE_CURSES_COLOR 1" >>confdefs.h + + +fi + + # Check for color functions + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Curses color functions" >&5 +$as_echo_n "checking for Curses color functions... " >&6; } +if ${ax_cv_plaincurses_color+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #define _XOPEN_SOURCE_EXTENDED 1 + #include + +int +main () +{ + + chtype a = A_BOLD; + int b = KEY_LEFT; + chtype c = COLOR_PAIR(1) & A_COLOR; + initscr(); + init_pair(1, COLOR_WHITE, COLOR_RED); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_plaincurses_color=yes +else + ax_cv_plaincurses_color=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_plaincurses_color" >&5 +$as_echo "$ax_cv_plaincurses_color" >&6; } + if test "x$ax_cv_plaincurses_color" = xyes; then : + + ax_cv_curses_color=yes + +$as_echo "#define HAVE_CURSES_COLOR 1" >>confdefs.h + + +fi + + # Check for obsolete functions + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for obsolete Curses functions" >&5 +$as_echo_n "checking for obsolete Curses functions... " >&6; } +if ${ax_cv_plaincurses_obsolete+:} false; then : + $as_echo_n "(cached) " >&6 +else + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + +int +main () +{ + + chtype a = A_BOLD; + int b = KEY_LEFT; + int g = getattrs(stdscr); + int h = getcurx(stdscr) + getmaxx(stdscr); + initscr(); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ax_cv_plaincurses_obsolete=yes +else + ax_cv_plaincurses_obsolete=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_plaincurses_obsolete" >&5 +$as_echo "$ax_cv_plaincurses_obsolete" >&6; } + if test "x$ax_cv_plaincurses_obsolete" = xyes; then : + + ax_cv_curses_obsolete=yes + +$as_echo "#define HAVE_CURSES_OBSOLETE 1" >>confdefs.h + + +fi + +fi + + if test "x$ax_cv_header_curses_h" = xno; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find a working curses.h" >&5 +$as_echo "$as_me: WARNING: could not find a working curses.h" >&2;} + +fi + +fi + +fi + + if test "x$ax_cv_curses" != xyes; then : + ax_cv_curses=no +fi + if test "x$ax_cv_curses_enhanced" != xyes; then : + ax_cv_curses_enhanced=no +fi + if test "x$ax_cv_curses_color" != xyes; then : + ax_cv_curses_color=no +fi + if test "x$ax_cv_curses_obsolete" != xyes; then : + ax_cv_curses_obsolete=no +fi + + LIBS=$ax_saved_LIBS + + + +save_LIBS=$LIBS +LIBS="$CURSES_LIB $LIBS" +for ac_func in resizeterm +do : + ac_fn_c_check_func "$LINENO" "resizeterm" "ac_cv_func_resizeterm" +if test "x$ac_cv_func_resizeterm" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_RESIZETERM 1 +_ACEOF + +fi +done + +LIBS=$save_LIBS + +## Use system implementation, or bundled replacement? +for ac_func in strlcpy +do : + ac_fn_c_check_func "$LINENO" "strlcpy" "ac_cv_func_strlcpy" +if test "x$ac_cv_func_strlcpy" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STRLCPY 1 +_ACEOF + +fi +done + + +## ------------------------------------------------------------------------ +## Don't add more AC_CHECK_FUNCS, unless for a mainstream platform for one +## of the reasons below (to detect whether to enable an optional set of +## POSIX APIs; to disable a deprecated or very new and not yet widely +## supported API). This is a POSIX binding, and requires a reasonably +## POSIX host to bind to - we definitely DON'T want to clutter up the code +## and configury to support partially compliant hosts! +## ------------------------------------------------------------------------ + +## Thread scheduling priority +for ac_func in sched_getsheduler sched_setscheduler +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +## Statvfs support +for ac_func in statvfs +do : + ac_fn_c_check_func "$LINENO" "statvfs" "ac_cv_func_statvfs" +if test "x$ac_cv_func_statvfs" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STATVFS 1 +_ACEOF + +fi +done + + +## Deprecated or otherwise spottily supported POSIX functions +for ac_func in gethostid posix_fadvise +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + +## Lua + + + + + + + + + if test "x$LUA" != 'x'; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $LUA is a Lua interpreter" >&5 +$as_echo_n "checking if $LUA is a Lua interpreter... " >&6; } + + _ax_lua_factorial=`$LUA 2>/dev/null -e ' + -- a simple factorial + function fact (n) + if n == 0 then + return 1 + else + return n * fact(n-1) + end + end + print("fact(5) is " .. fact(5))'` + if test "$_ax_lua_factorial" = 'fact(5) is 120'; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + as_fn_error $? "not a Lua interpreter" "$LINENO" 5 + +fi + + _ax_check_text="whether $LUA version >= 5.1, < 5.4" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking $_ax_check_text" >&5 +$as_echo_n "checking $_ax_check_text... " >&6; } + + _ax_lua_good_version=`$LUA -e ' + -- a script to compare versions + function verstr2num(verstr) + local _, _, majorver, minorver = string.find(verstr, "^(%d+)%.(%d+)") + if majorver and minorver then + return tonumber(majorver) * 100 + tonumber(minorver) + end + end + local minver = verstr2num("5.1") + local _, _, trimver = string.find(_VERSION, "^Lua (.*)") + local ver = verstr2num(trimver) + local maxver = verstr2num("5.4") or 1e9 + if minver <= ver and ver < maxver then + print("yes") + else + print("no") + end'` + if test "x$_ax_lua_good_version" = "xyes"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + as_fn_error $? "version is out of range for specified LUA" "$LINENO" 5 +fi + + ax_display_LUA=$LUA + +else + _ax_check_text="for a Lua interpreter with version >= 5.1, < 5.4" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking $_ax_check_text" >&5 +$as_echo_n "checking $_ax_check_text... " >&6; } +if ${ax_cv_pathless_LUA+:} false; then : + $as_echo_n "(cached) " >&6 +else + for ax_cv_pathless_LUA in lua lua5.2 lua52 lua5.1 lua51 lua50 none; do + test "x$ax_cv_pathless_LUA" = 'xnone' && break + + _ax_lua_factorial=`$ax_cv_pathless_LUA 2>/dev/null -e ' + -- a simple factorial + function fact (n) + if n == 0 then + return 1 + else + return n * fact(n-1) + end + end + print("fact(5) is " .. fact(5))'` + if test "$_ax_lua_factorial" = 'fact(5) is 120'; then : + +else + continue +fi + + + _ax_lua_good_version=`$ax_cv_pathless_LUA -e ' + -- a script to compare versions + function verstr2num(verstr) + local _, _, majorver, minorver = string.find(verstr, "^(%d+)%.(%d+)") + if majorver and minorver then + return tonumber(majorver) * 100 + tonumber(minorver) + end + end + local minver = verstr2num("5.1") + local _, _, trimver = string.find(_VERSION, "^Lua (.*)") + local ver = verstr2num(trimver) + local maxver = verstr2num("5.4") or 1e9 + if minver <= ver and ver < maxver then + print("yes") + else + print("no") + end'` + if test "x$_ax_lua_good_version" = "xyes"; then : + break +fi + + done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_pathless_LUA" >&5 +$as_echo "$ax_cv_pathless_LUA" >&6; } + if test "x$ax_cv_pathless_LUA" = 'xnone'; then : + LUA=':' +else + # Extract the first word of "$ax_cv_pathless_LUA", so it can be a program name with args. +set dummy $ax_cv_pathless_LUA; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_LUA+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $LUA in + [\\/]* | ?:[\\/]*) + ac_cv_path_LUA="$LUA" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_LUA="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +LUA=$ac_cv_path_LUA +if test -n "$LUA"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LUA" >&5 +$as_echo "$LUA" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi + ax_display_LUA=$ax_cv_pathless_LUA + +fi + + + if test "x$LUA" = 'x:'; then : + as_fn_error $? "cannot find suitable Lua interpreter" "$LINENO" 5 + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ax_display_LUA version" >&5 +$as_echo_n "checking for $ax_display_LUA version... " >&6; } +if ${ax_cv_lua_version+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_lua_version=`$LUA -e ' + -- return a version number in X.Y format + local _, _, ver = string.find(_VERSION, "^Lua (%d+%.%d+)") + print(ver)'` + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_lua_version" >&5 +$as_echo "$ax_cv_lua_version" >&6; } + if test "x$ax_cv_lua_version" = 'x'; then : + as_fn_error $? "invalid Lua version number" "$LINENO" 5 +fi + LUA_VERSION=$ax_cv_lua_version + + LUA_SHORT_VERSION=`echo "$LUA_VERSION" | $SED 's|\.||'` + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ax_display_LUA platform" >&5 +$as_echo_n "checking for $ax_display_LUA platform... " >&6; } +if ${ax_cv_lua_platform+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_lua_platform=`$LUA -e 'print("unknown")'` +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_lua_platform" >&5 +$as_echo "$ax_cv_lua_platform" >&6; } + LUA_PLATFORM=$ax_cv_lua_platform + + + LUA_PREFIX='${prefix}' + + LUA_EXEC_PREFIX='${exec_prefix}' + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ax_display_LUA script directory" >&5 +$as_echo_n "checking for $ax_display_LUA script directory... " >&6; } +if ${ax_cv_lua_luadir+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$prefix" = 'xNONE'; then : + ax_lua_prefix=$ac_default_prefix +else + ax_lua_prefix=$prefix +fi + + ax_cv_lua_luadir="$LUA_PREFIX/share/lua/$LUA_VERSION" + + + + ax_lua_prefixed_path=`$LUA -e ' + -- get the path based on search type + local searchtype = "script" + local paths = "" + if searchtype == "script" then + paths = (package and package.path) or LUA_PATH + elseif searchtype == "module" then + paths = (package and package.cpath) or LUA_CPATH + end + -- search for the prefix + local prefix = "'$ax_lua_prefix'" + local minpath = "" + local mindepth = 1e9 + string.gsub(paths, "([^;]+)", + function (path) + path = string.gsub(path, "%?.*$", "") + path = string.gsub(path, "/[^/]*$", "") + if string.find(path, prefix) then + local depth = string.len(string.gsub(path, "[^/]", "")) + if depth < mindepth then + minpath = path + mindepth = depth + end + end + end) + print(minpath)'` + + if test "x$ax_lua_prefixed_path" != 'x'; then : + _ax_strip_prefix=`echo "$ax_lua_prefix" | $SED 's|.|.|g'` + ax_cv_lua_luadir=`echo "$ax_lua_prefixed_path" | \ + $SED "s|^$_ax_strip_prefix|$LUA_PREFIX|"` + +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_lua_luadir" >&5 +$as_echo "$ax_cv_lua_luadir" >&6; } + luadir=$ax_cv_lua_luadir + + pkgluadir=\${luadir}/$PACKAGE + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ax_display_LUA module directory" >&5 +$as_echo_n "checking for $ax_display_LUA module directory... " >&6; } +if ${ax_cv_lua_luaexecdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$exec_prefix" = 'xNONE'; then : + ax_lua_exec_prefix=$ax_lua_prefix +else + ax_lua_exec_prefix=$exec_prefix +fi + + ax_cv_lua_luaexecdir="$LUA_EXEC_PREFIX/lib/lua/$LUA_VERSION" + + + + ax_lua_prefixed_path=`$LUA -e ' + -- get the path based on search type + local searchtype = "module" + local paths = "" + if searchtype == "script" then + paths = (package and package.path) or LUA_PATH + elseif searchtype == "module" then + paths = (package and package.cpath) or LUA_CPATH + end + -- search for the prefix + local prefix = "'$ax_lua_exec_prefix'" + local minpath = "" + local mindepth = 1e9 + string.gsub(paths, "([^;]+)", + function (path) + path = string.gsub(path, "%?.*$", "") + path = string.gsub(path, "/[^/]*$", "") + if string.find(path, prefix) then + local depth = string.len(string.gsub(path, "[^/]", "")) + if depth < mindepth then + minpath = path + mindepth = depth + end + end + end) + print(minpath)'` + + if test "x$ax_lua_prefixed_path" != 'x'; then : + _ax_strip_prefix=`echo "$ax_lua_exec_prefix" | $SED 's|.|.|g'` + ax_cv_lua_luaexecdir=`echo "$ax_lua_prefixed_path" | \ + $SED "s|^$_ax_strip_prefix|$LUA_EXEC_PREFIX|"` + +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_lua_luaexecdir" >&5 +$as_echo "$ax_cv_lua_luaexecdir" >&6; } + luaexecdir=$ax_cv_lua_luaexecdir + + pkgluaexecdir=\${luaexecdir}/$PACKAGE + + + + +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if LUA_VERSION is defined" >&5 +$as_echo_n "checking if LUA_VERSION is defined... " >&6; } + if test "x$LUA_VERSION" != 'x'; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + as_fn_error $? "cannot check Lua headers without knowing LUA_VERSION" "$LINENO" 5 + +fi + + + + LUA_SHORT_VERSION=`echo "$LUA_VERSION" | $SED 's|\.||'` + + + _ax_lua_saved_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $LUA_INCLUDE" + for ac_header in lua.h lualib.h lauxlib.h luaconf.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + CPPFLAGS=$_ax_lua_saved_cppflags + + if test "x$LUA_INCLUDE" = 'x' && + test "x$ac_cv_header_lua_h" != 'xyes'; then : + for _ax_include_path in /usr/include/lua$LUA_VERSION \ + /usr/include/lua-$LUA_VERSION \ + /usr/include/lua/$LUA_VERSION \ + /usr/include/lua$LUA_SHORT_VERSION \ + /usr/local/include/lua$LUA_VERSION \ + /usr/local/include/lua-$LUA_VERSION \ + /usr/local/include/lua/$LUA_VERSION \ + /usr/local/include/lua$LUA_SHORT_VERSION \ + ; do + test ! -d "$_ax_include_path" && continue + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Lua headers in" >&5 +$as_echo_n "checking for Lua headers in... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_ax_include_path" >&5 +$as_echo "$_ax_include_path" >&6; } + + { ac_cv_header_lua_h=; unset ac_cv_header_lua_h;} + { ac_cv_header_lualib_h=; unset ac_cv_header_lualib_h;} + { ac_cv_header_lauxlib_h=; unset ac_cv_header_lauxlib_h;} + { ac_cv_header_luaconf_h=; unset ac_cv_header_luaconf_h;} + + _ax_lua_saved_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS -I$_ax_include_path" + for ac_header in lua.h lualib.h lauxlib.h luaconf.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + CPPFLAGS=$_ax_lua_saved_cppflags + + if test "x$ac_cv_header_lua_h" = 'xyes'; then : + LUA_INCLUDE="-I$_ax_include_path" + break + +fi + done + +fi + + if test "x$ac_cv_header_lua_h" = 'xyes'; then : + + if test "x$cross_compiling" != 'xyes'; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Lua header version" >&5 +$as_echo_n "checking for Lua header version... " >&6; } +if ${ax_cv_lua_header_version+:} false; then : + $as_echo_n "(cached) " >&6 +else + _ax_lua_saved_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $LUA_INCLUDE" + if test "$cross_compiling" = yes; then : + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run test program while cross compiling +See \`config.log' for more details" "$LINENO" 5; } +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#include +#include +int main(int argc, char ** argv) +{ + if(argc > 1) printf("%s", LUA_VERSION); + exit(EXIT_SUCCESS); +} + + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ax_cv_lua_header_version=`./conftest$EXEEXT p | \ + $SED -n "s|^Lua \([0-9]\{1,\}\.[0-9]\{1,\}\).\{0,\}|\1|p"` + +else + ax_cv_lua_header_version='unknown' +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + CPPFLAGS=$_ax_lua_saved_cppflags + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_lua_header_version" >&5 +$as_echo "$ax_cv_lua_header_version" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if Lua header version matches $LUA_VERSION" >&5 +$as_echo_n "checking if Lua header version matches $LUA_VERSION... " >&6; } + if test "x$ax_cv_lua_header_version" = "x$LUA_VERSION"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + ax_header_version_match='yes' + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ax_header_version_match='no' + +fi + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cross compiling so assuming header version number matches" >&5 +$as_echo "$as_me: WARNING: cross compiling so assuming header version number matches" >&2;} + ax_header_version_match='yes' + +fi + +fi + + if test "x$ax_header_version_match" != 'xyes' && + test "x$LUA_INCLUDE" != 'x'; then : + as_fn_error $? "cannot find headers for specified LUA_INCLUDE" "$LINENO" 5 +fi + + if test "x$ax_header_version_match" = 'xyes'; then : + +else + as_fn_error $? "cannot find Lua includes" "$LINENO" 5 +fi + +# Extract the first word of "specl", so it can be a program name with args. +set dummy specl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_SPECL+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $SPECL in + [\\/]* | ?:[\\/]*) + ac_cv_path_SPECL="$SPECL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_SPECL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_SPECL" && ac_cv_path_SPECL=":" + ;; +esac +fi +SPECL=$ac_cv_path_SPECL +if test -n "$SPECL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SPECL" >&5 +$as_echo "$SPECL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +## Perl +# Extract the first word of "perl", so it can be a program name with args. +set dummy perl; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PERL+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PERL in + [\\/]* | ?:[\\/]*) + ac_cv_path_PERL="$PERL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PERL=$ac_cv_path_PERL +if test -n "$PERL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 +$as_echo "$PERL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test -z "$PERL"; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot find perl +See \`config.log' for more details" "$LINENO" 5; } +fi + +## ldoc +# Extract the first word of "ldoc", so it can be a program name with args. +set dummy ldoc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_LDOC+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $LDOC in + [\\/]* | ?:[\\/]*) + ac_cv_path_LDOC="$LDOC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_LDOC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_LDOC" && ac_cv_path_LDOC="false" + ;; +esac +fi +LDOC=$ac_cv_path_LDOC +if test -n "$LDOC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LDOC" >&5 +$as_echo "$LDOC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test false != "$LDOC"; then + HAVE_LDOC_TRUE= + HAVE_LDOC_FALSE='#' +else + HAVE_LDOC_TRUE='#' + HAVE_LDOC_FALSE= +fi + + +## Generate output files +ac_config_headers="$ac_config_headers config.h" + +ac_config_files="$ac_config_files Makefile build-aux/config.ld lib/posix/init.lua:lib/posix.lua.in" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${GL_COND_LIBTOOL_TRUE}" && test -z "${GL_COND_LIBTOOL_FALSE}"; then + as_fn_error $? "conditional \"GL_COND_LIBTOOL\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + + gl_libobjs= + gl_ltlibobjs= + if test -n "$gl_LIBOBJS"; then + # Remove the extension. + sed_drop_objext='s/\.o$//;s/\.obj$//' + for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do + gl_libobjs="$gl_libobjs $i.$ac_objext" + gl_ltlibobjs="$gl_ltlibobjs $i.lo" + done + fi + gl_LIBOBJS=$gl_libobjs + + gl_LTLIBOBJS=$gl_ltlibobjs + + + + gltests_libobjs= + gltests_ltlibobjs= + if test -n "$gltests_LIBOBJS"; then + # Remove the extension. + sed_drop_objext='s/\.o$//;s/\.obj$//' + for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do + gltests_libobjs="$gltests_libobjs $i.$ac_objext" + gltests_ltlibobjs="$gltests_ltlibobjs $i.lo" + done + fi + gltests_LIBOBJS=$gltests_libobjs + + gltests_LTLIBOBJS=$gltests_ltlibobjs + + +if test -z "${HAVE_LDOC_TRUE}" && test -z "${HAVE_LDOC_FALSE}"; then + as_fn_error $? "conditional \"HAVE_LDOC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by luaposix $as_me 33.3.1, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +luaposix config.status 33.3.1 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' +configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_import \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +lt_cv_nm_interface \ +nm_file_list_spec \ +lt_cv_truncate_bin \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +configure_time_dlsearch_path \ +configure_time_lt_sys_library_path; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' + +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile' + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "build-aux/config.ld") CONFIG_FILES="$CONFIG_FILES build-aux/config.ld" ;; + "lib/posix/init.lua") CONFIG_FILES="$CONFIG_FILES lib/posix/init.lua:lib/posix.lua.in" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# The names of the tagged configurations supported by this script. +available_tags='' + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec=$shared_archive_member_spec + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# The name lister interface. +nm_interface=$lt_lt_cv_nm_interface + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot=$lt_sysroot + +# Command to truncate a binary pipe. +lt_truncate_bin=$lt_lt_cv_truncate_bin + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \$shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain=$ac_aux_dir/ltmain.sh + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..aa18318 --- /dev/null +++ b/configure.ac @@ -0,0 +1,205 @@ +## configure.ac +## Written by Gary V. Vaughan, 2012 + +## Copyright (c) 2012-2015 Gary V. Vaughan + +## This file is part of luaposix. +## See README for license. +## ------------------------------------------------------------------------ + +AC_INIT([luaposix], [33.3.1], [http://github.com/luaposix/luaposix/issues]) +AC_CONFIG_AUX_DIR([build-aux]) +AC_CONFIG_MACRO_DIR([m4]) + +AS_BOX([Configuring AC_PACKAGE_TARNAME AC_PACKAGE_VERSION]) +echo + +AM_INIT_AUTOMAKE([-Wall subdir-objects]) +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +## Check for programs +AC_PROG_CC +gl_EARLY +AC_PROG_MKDIR_P +AC_PROG_EGREP +AC_PROG_SED + + +## ------------------------------------------------------------------------ +## Compiler flags for POSIX 2008 or better compliance. +## ------------------------------------------------------------------------ + +AC_USE_SYSTEM_EXTENSIONS +AC_CANONICAL_HOST +case $host_os in + *nto*|*qnx*) + # QNX is only POSIX 2001, but _XOPEN_SOURCE turns off other + # functions luaposix can bind. + AC_SUBST([POSIX_EXTRA_CPPFLAGS], [-DLPOSIX_2001_COMPLIANT]) + ;; + + darwin*|openbsd*) + # Setting _XOPEN_SOURCE here messes up header declarations, but + # all functions luaposix can bind are available without it. + AC_SUBST([POSIX_EXTRA_CPPFLAGS], [-DLPOSIX_2008_COMPLIANT]) + ;; + + *) + # Enable POSIX 2008. Please send a $host_os match if your host + # is not compliant. + AC_SUBST([POSIX_EXTRA_CPPFLAGS], [-D_XOPEN_SOURCE=700]) + ;; +esac + + +AC_ARG_ENABLE([gcc-warnings], + [AS_HELP_STRING([--enable-gcc-warnings], + [turn on lots of GCC warnings (for developers)])], + [case $enableval in + yes|no) ;; + *) AC_MSG_ERROR([bad value $enableval for gcc-warnings option]) ;; + esac + gl_gcc_warnings=$enableval], + [gl_gcc_warnings=no] +) + +if test "$gl_gcc_warnings" = yes; then + gl_WARN_ADD([-Werror], [WERROR_CFLAGS]) + + # Set up the list of undesired warnings. + nw= + nw="$nw -Wsystem-headers" # Don't let system headers trigger warnings + nw="$nw -Wundef" # All compiler preprocessors support #if UNDEF + nw="$nw -Wtraditional" # All compilers nowadays support ANSI C + nw="$nw -Wstrict-overflow" # Use a lower level (see below). + nw="$nw -Wconversion" # These warnings usually don't point to mistakes. + nw="$nw -Wsign-conversion" # Likewise. + nw="$nw -Waggregate-return" # We do this on purpose. + nw="$nw -Wtraditional-conversion" # Don't care. + nw="$nw -Wpadded" # Don't care. + nw="$nw -Wc++-compat" # Don't care. + nw="$nw -Woverlength-strings" # Don't care. + nw="$nw -Wmissing-format-attribute" # Don't care. + nw="$nw -Wunreachable-code" # Seems buggy. + nw="$nw -Wunused-macros" # those macros might come in handy later + + gl_MANYWARN_ALL_GCC([warnings]) + + # Enable all GCC warnings not in this list. + gl_MANYWARN_COMPLEMENT([warnings], [$warnings], [$nw]) + for w in $warnings; do + gl_WARN_ADD([$w]) + done + + # Add an extra warning + gl_WARN_ADD([-Wstrict-overflow=1]) + # Add some more safety measures + gl_WARN_ADD([-D_FORTIFY_SOURCE=2]) + gl_WARN_ADD([-fmudflap]) +fi + +## required by automake 1.12.x, not available in 1.10.x +m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) + +LT_PREREQ([2.2.6]) +LT_INIT([disable-static]) + +module=yes eval shrext=$shrext_cmds + +AC_SUBST([objdir]) +AC_SUBST([shrext]) +AC_SUBST(LIBTOOL_DEPS) + +gl_INIT + +## Check for header files +AC_HEADER_STDC +AC_CHECK_HEADERS([crypt.h strings.h sys/statvfs.h]) +AC_CHECK_HEADERS([net/if.h linux/netlink.h], [], [], [ +#include +]) + +## SysV messaging +AC_CHECK_HEADERS([sys/msg.h]) +AC_CHECK_FUNCS([msgrcv msgsnd]) +case $ac_cv_header_sys_msg_h,$ac_cv_func_msgrcv,$ac_cv_func_msgsnd in + yes,yes,yes) + AC_DEFINE([HAVE_SYSV_MESSAGING], [1], [Define if your system has SysV message APIs]) + ;; +esac + + +AC_CHECK_DECLS_ONCE([fdatasync]) + +## Search libs +save_LIBS=$LIBS +LIBS= +AC_SEARCH_LIBS([crypt], [crypt], + [AC_DEFINE([HAVE_CRYPT], [1], [Define this if your system has a crypt() function])]) +AC_SUBST([LIBCRYPT], [$LIBS]) +LIBS=$save_LIBS + +## Socket (required for qnx, at least) +save_LIBS=$LIBS +LIBS= +AC_SEARCH_LIBS([socket], [socket], []) +AC_SUBST([LIBSOCKET], [$LIBS]) +LIBS=$save_LIBS + +# FIXME: Make -lrt conditional on _XOPEN_REALTIME +save_LIBS=$LIBS +LIBS= +AC_CHECK_LIB([rt], [clock_gettime]) +AC_SUBST([LIBRT], [$LIBS]) +LIBS=$save_LIBS + +## Curses +AX_WITH_CURSES +AC_ARG_VAR(CURSES_LIB, [linker flags for curses library]) + +save_LIBS=$LIBS +LIBS="$CURSES_LIB $LIBS" +AC_CHECK_FUNCS([resizeterm]) +LIBS=$save_LIBS + +## Use system implementation, or bundled replacement? +AC_CHECK_FUNCS([strlcpy]) + +## ------------------------------------------------------------------------ +## Don't add more AC_CHECK_FUNCS, unless for a mainstream platform for one +## of the reasons below (to detect whether to enable an optional set of +## POSIX APIs; to disable a deprecated or very new and not yet widely +## supported API). This is a POSIX binding, and requires a reasonably +## POSIX host to bind to - we definitely DON'T want to clutter up the code +## and configury to support partially compliant hosts! +## ------------------------------------------------------------------------ + +## Thread scheduling priority +AC_CHECK_FUNCS([sched_getsheduler sched_setscheduler]) + +## Statvfs support +AC_CHECK_FUNCS([statvfs]) + +## Deprecated or otherwise spottily supported POSIX functions +AC_CHECK_FUNCS([gethostid posix_fadvise]) + + +## Lua +AX_PROG_LUA(5.1, 5.4) +AX_LUA_HEADERS +AC_PATH_PROG([SPECL], [specl], [:]) + +## Perl +AC_PATH_PROG([PERL], [perl]) +if test -z "$PERL"; then + AC_MSG_FAILURE([cannot find perl]) +fi + +## ldoc +AC_PATH_PROG([LDOC], [ldoc], [false]) +AM_CONDITIONAL([HAVE_LDOC], [test false != "$LDOC"]) + +## Generate output files +AC_CONFIG_HEADER(config.h) +AC_CONFIG_FILES([Makefile build-aux/config.ld lib/posix/init.lua:lib/posix.lua.in]) +AC_OUTPUT diff --git a/doc/classes/posix.curses.chstr.html b/doc/classes/posix.curses.chstr.html new file mode 100644 index 0000000..10d0b3e --- /dev/null +++ b/doc/classes/posix.curses.chstr.html @@ -0,0 +1,381 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Class posix.curses.chstr

+

Curses attributed string buffers.

+

An array of characters, plus associated curses attributes and +colors at each position.

+ +

Although marginally useful alone, the constants used to set colors +and attributes in chstr buffers are not defined until after +curses.initscr () has been called.

+ + +

Methods

+ + + + + + + + + + + + + + + + + + + + + +
posix.curses.chstr:dup ()Duplicate chstr.
posix.curses.chstr:get (o)Get information from the chstr.
posix.curses.chstr:len (cs)Retrieve chstr length.
posix.curses.chstr:set_ch (o, int[, attr=A_NORMAL[, rep=1]])Set a character in the buffer.
posix.curses.chstr:set_str (o, s[, attr=A_NORMAL[, rep=1]])Change the contents of the chstr.
+

Metamethods

+ + + + + +
posix.curses.chstr:__call (len)Initialise a new chstr.
+ +
+
+ + +

Methods

+ +
+
+ + posix.curses.chstr:dup () +
+
+ Duplicate chstr. + + + +

Returns:

+
    + + chstr + duplicate of cs +
+ + + +

Usage:

+
    +
    dup = cs:dup ()
    +
+ +
+
+ + posix.curses.chstr:get (o) +
+
+ Get information from the chstr. + + +

Parameters:

+
    +
  • o + int + offset from start of cs +
  • +
+ +

Returns:

+
    +
  1. + int + character at offset o in cs
  2. +
  3. + int + bitwise-OR of attributes at offset o in cs
  4. +
  5. + int + colorpair at offset o in cs
  6. +
+ + + +

Usage:

+
    +
    +  cs = curses.chstr (10)
    +  cs:set_ch(0, 'A', curses.A_BOLD, 10)
    +  --> 65 2097152 0
    +  print (cs:get (9))
    +
+ +
+
+ + posix.curses.chstr:len (cs) +
+
+ Retrieve chstr length. + + +

Parameters:

+
    +
  • cs + chstr + buffer to act on +
  • +
+ +

Returns:

+
    + + int + length of cs +
+ + + +

Usage:

+
    +
    +  cs = curses.chstr (123)
    +  --> 123
    +  print (cs:len ())
    +
+ +
+
+ + posix.curses.chstr:set_ch (o, int[, attr=A_NORMAL[, rep=1]]) +
+
+ Set a character in the buffer. +ch* can be a one-character string, or an integer from string.byte + + +

Parameters:

+
    +
  • o + int + offset to start of change +
  • +
  • int + |string ch character to insert +
  • +
  • attr + int + attributes for changed elements + (default A_NORMAL) +
  • +
  • rep + int + repeat count + (default 1) +
  • +
+ + + + +

Usage:

+
    +
    +  -- Write a bold 'A' followed by normal 'a' chars to a new buffer
    +  size = 10
    +  cs = curses.chstr (size)
    +  cs:set_ch(0, 'A', curses.A_BOLD)
    +  cs:set_ch(1, 'a', curses.A_NORMAL, size - 1)
    +
+ +
+
+ + posix.curses.chstr:set_str (o, s[, attr=A_NORMAL[, rep=1]]) +
+
+ Change the contents of the chstr. + + +

Parameters:

+
    +
  • o + int + offset to start of change +
  • +
  • s + string + characters to insert into cs at o +
  • +
  • attr + int + attributes for changed elements + (default A_NORMAL) +
  • +
  • rep + int + repeat count + (default 1) +
  • +
+ + + + +

Usage:

+
    +
    +  cs = curses.chstr (10)
    +  cs:set_str(0, "0123456789", curses.A_BOLD)
    +
+ +
+
+

Metamethods

+ +
+
+ + posix.curses.chstr:__call (len) +
+
+ Initialise a new chstr. + + +

Parameters:

+
    +
  • len + int + buffer length +
  • +
+ +

Returns:

+
    + + chstr + a new chstr filled with spaces +
+ + + +

Usage:

+
    +
    cs = curses.chstr (10)
    +
+ +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/classes/posix.curses.window.html b/doc/classes/posix.curses.window.html new file mode 100644 index 0000000..4fadaa8 --- /dev/null +++ b/doc/classes/posix.curses.window.html @@ -0,0 +1,3713 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Class posix.curses.window

+

Curses Window objects.

+

+ + +

The methods documented on this page are available on any Curses Window + object, such as created by:

+ + +
+stdscr = curses.initscr ()
+window = curses.newwin (25, 80, 0, 0)
+
+ +

+ + +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
posix.curses.window:addch (ch)Advance the cursor after writing a character at the old position.
posix.curses.window:addchstr (chstr[, n])Copy a posix.curses.chstr starting at the current cursor position.
posix.curses.window:addstr (str[, n])Copy a Lua string starting at the current cursor position.
posix.curses.window:attroff (attrs)Turn off the given attributes for subsequent writes to the window.
posix.curses.window:attron (attrs)Turn on the given attributes for subsequent writes to the window.
posix.curses.window:attrset (attrs)Set the given attributes for subsequent writes to the window.
posix.curses.window:border ([ls[, rs[, ts[, bs[, tl[, tr[, bl[, br]]]]]]]])Draw a border around a window.
posix.curses.window:box (verch, horch)Draw a box around a window.
posix.curses.window:clear ()Call erase and then clearok.
posix.curses.window:clearok (bf)The next call to refresh will clear and completely redraw the window.
posix.curses.window:clone ()Make a duplicate of a window.
posix.curses.window:close ()Free all the resources associated with a window.
posix.curses.window:clrtobot ()Write blanks to every character position after the cursor.
posix.curses.window:clrtoeol ()Write blanks from the cursor to the end of the current line.
posix.curses.window:copywin (dst, st, sl, dt, dl, db, dr, overlay)Overlay a rectangle of this window over another.
posix.curses.window:cursyncup ()Mark cursor position of ancestors of a window for refresh.
posix.curses.window:delch ()Delete the character under the cursor.
posix.curses.window:deleteln ()Move the lines below the cursor up, to delete the current line.
posix.curses.window:derive (nlines, ncols, begin_y, begin_x)Create a new derived window.
posix.curses.window:echoch (ch)Call addch then refresh.
posix.curses.window:erase ()Write blanks to every character position in the window.
posix.curses.window:getbegyx ()Fetch the absolute top-left coordinates of a window.
posix.curses.window:getbkgd ()Fetch the current background attribute for the window.
posix.curses.window:getch ()Read a character from the window input.
posix.curses.window:getmaxyx ()Fetch the absolute bottom-right coordinates of a window.
posix.curses.window:getparyx ()Fetch the parent-relative coordinates of a subwindow.
posix.curses.window:getstr ([n])Read characters up to the next newline from the window input.
posix.curses.window:getyx ()Fetch the cursor position.
posix.curses.window:hline (ch, n)Draw a row of characters from the current cursor position.
posix.curses.window:idcok (bf)Use hardware character insert and delete on supporting terminals.
posix.curses.window:idlok (bf)Use hardware line insert and delete on supporting terminals.
posix.curses.window:immedok (bf)Automatically call refresh whenever the window content is changed.
posix.curses.window:insertln ()Move the current line and those below down one line, leaving a new blank line.
posix.curses.window:intrflush (bf)Set the flush on interrupt behaviour for the window.
posix.curses.window:is_linetouched (line)Has a particular window line changed since the last refresh?
posix.curses.window:is_wintouched ()Has a window changed since the last refresh?
posix.curses.window:keypad ([on])Set the single value keypad keys behaviour for the window.
posix.curses.window:leaveok (bf)No need to force synchronisation of hardware cursor.
posix.curses.window:meta (on)Force 8-bit (or 7-bit) input characters for the window.
posix.curses.window:move (y, x)Change the cursor position.
posix.curses.window:move_derived (par_y, par_x)Move the position of a derived window.
posix.curses.window:move_window (y, x)Move the position of a window.
posix.curses.window:mvaddch (ch)Call move, then addch.
posix.curses.window:mvaddchstr (y, x[, n])Call move then addchstr.
posix.curses.window:mvaddstr (y, x, str[, n])Call move then addstr.
posix.curses.window:mvdelch (y, x)Call move then delch.
posix.curses.window:mvgetch (y, x)Call move then getch
posix.curses.window:mvgetstr (y, x[, n=-1])Call move then getstr.
posix.curses.window:mvhline (y, x, ch, n)Move the cursor, then draw a row of characters from the new cursor position.
posix.curses.window:mvvline (y, x, ch, n)Move the cursor, then draw a column of characters from the new cursor position.
posix.curses.window:mvwinch (y, x)Call move then winch
posix.curses.window:mvwinchnstr (y, x, n)Call move then winchnstr.
posix.curses.window:mvwinnstr (y, x, n)Call move then winnstr.
posix.curses.window:mvwinsch (y, x, ch)Call move then winsch.
posix.curses.window:mvwinsnstr (y, x, str, n)Call move then winsnstr.
posix.curses.window:mvwinsstr (y, x, str)Call move then winsstr.
posix.curses.window:nodelay (on)Force getch to be non-blocking.
posix.curses.window:notimeout (bf)Return input immediately from this window.
posix.curses.window:noutrefresh ()Copy the window backing screen to the virtual screen.
posix.curses.window:overlay (dst)Overlay this window on top of another non-destructively.
posix.curses.window:overwrite (dst)Destructively overwrite another window with this one.
posix.curses.window:pechochar (ch)An efficient equivalent to addch followed by refresh.
posix.curses.window:pnoutrefresh (st, sl, dt, dl, db, dr)Equivalent to noutrefresh for use with pad windows.
posix.curses.window:prefresh (st, sl, dt, dl, db, dr)Equivalent to refresh for use with pad windows.
posix.curses.window:redrawln (beg_line, num_lines)Mark a range of lines in a window as corrupted and in need of redrawing.
posix.curses.window:redrawwin ()Mark a window as having corrupted display that needs fully redrawing.
posix.curses.window:refresh ()Refresh the window terminal display from the virtual screen.
posix.curses.window:resize (height, width)Change the size of a window.
posix.curses.window:scrl (n)Scroll the window up n lines.
posix.curses.window:scrollok (bf)Scroll up one line when the cursor writes to the last screen position.
posix.curses.window:standend ()Turn off all attributes for subsequent writes to the window.
posix.curses.window:standout ()Set A_STANDOUT for subsequent writes to the window.
posix.curses.window:sub (nlines, ncols, begin_y, begin_x)Create a new subwindow.
posix.curses.window:subpad (nlines, ncols, begin_y, begin_x)Return a new subpad window object.
posix.curses.window:syncdown ()Mark child windows for refresh.
posix.curses.window:syncok (bf)Automatically mark ancestors of a changed window for refresh.
posix.curses.window:syncup ()Mark ancestors of a window for refresh.
posix.curses.window:timeout (delay)For differentiating user input from terminal control sequences.
posix.curses.window:touch ([changed])Set the changed state of a window since the last refresh.
posix.curses.window:touchline (y, n[, changed])Mark a range of lines as changed since the last refresh.
posix.curses.window:vline (ch, n)Draw a column of characters from the current cursor position.
posix.curses.window:wbkgd (ch)Call wbkgdset and then set the background of every position accordingly.
posix.curses.window:wbkgdset (ch)Set the background attributes for subsequently written characters.
posix.curses.window:winch ()Fetch the attributed character at the current cursor position.
posix.curses.window:winchnstr (n)Fetch attributed characters from cursor position up to rightmost window position.
posix.curses.window:winnstr (n)Fetch a string from cursor position up to rightmost window position.
posix.curses.window:winsch (ch)Insert a character before the current cursor position.
posix.curses.window:winsdelln (n)Call deleteln n times.
posix.curses.window:winsnstr (str, n)Like winsstr, but no more than n characters.
posix.curses.window:winsstr (str)Insert a string of characters before the current cursor position.
posix.curses.window:wsetscrreg (top, bot)Set a software scrolling region for the window.
+

Metamethods

+ + + + + +
posix.curses.window:__tostring ()Unique string representation of a posix.curses.window.
+ +
+
+ + +

Methods

+ +
+
+ + posix.curses.window:addch (ch) +
+
+ Advance the cursor after writing a character at the old position. + + +

Parameters:

+
    +
  • ch + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:addchstr (chstr[, n]) +
+
+ Copy a posix.curses.chstr starting at the current cursor position. + + +

Parameters:

+
    +
  • chstr + int + cs +
  • +
  • n + int + + + + (optional) +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:addstr (str[, n]) +
+
+ Copy a Lua string starting at the current cursor position. + + +

Parameters:

+
    +
  • str + string + + + +
  • +
  • n + int + + + + (optional) +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:attroff (attrs) +
+
+ Turn off the given attributes for subsequent writes to the window. + + +

Parameters:

+
    +
  • attrs + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:attron (attrs) +
+
+ Turn on the given attributes for subsequent writes to the window. + + +

Parameters:

+
    +
  • attrs + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:attrset (attrs) +
+
+ Set the given attributes for subsequent writes to the window. + + +

Parameters:

+
    +
  • attrs + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:border ([ls[, rs[, ts[, bs[, tl[, tr[, bl[, br]]]]]]]]) +
+
+ Draw a border around a window. + + +

Parameters:

+
    +
  • ls + int + + + + (optional) +
  • +
  • rs + int + + + + (optional) +
  • +
  • ts + int + + + + (optional) +
  • +
  • bs + int + + + + (optional) +
  • +
  • tl + int + + + + (optional) +
  • +
  • tr + int + + + + (optional) +
  • +
  • bl + int + + + + (optional) +
  • +
  • br + int + + + + (optional) +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + +

Usage:

+
    +
    +  win:border (curses.ACS_VLINE, curses.ACS_VLINE,
    +              curses.ACS_HLINE, curses.ACS_HLINE,
    +	      curses.ACS_ULCORNER, curses.ACS_URCORNER,
    +	      curses.ACS_LLCORNER, curses.ACS_LRCORNER)
    +
+ +
+
+ + posix.curses.window:box (verch, horch) +
+
+ Draw a box around a window. + + +

Parameters:

+
    +
  • verch + int + + + +
  • +
  • horch + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + +

Usage:

+
    +
    win:box (curses.ACS_VLINE, curses.ACS_HLINE)
    +
+ +
+
+ + posix.curses.window:clear () +
+
+ Call erase and then clearok. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:clearok (bf) +
+
+ The next call to refresh will clear and completely redraw the window. + + +

Parameters:

+
    +
  • bf + bool + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:clone () +
+
+ Make a duplicate of a window. + + + +

Returns:

+
    + + window + a new duplicate of this window +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:close () +
+
+ Free all the resources associated with a window. + + + + + +

See also:

+ + + +
+
+ + posix.curses.window:clrtobot () +
+
+ Write blanks to every character position after the cursor. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:clrtoeol () +
+
+ Write blanks from the cursor to the end of the current line. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:copywin (dst, st, sl, dt, dl, db, dr, overlay) +
+
+ Overlay a rectangle of this window over another. + + +

Parameters:

+
    +
  • dst + window + destination window +
  • +
  • st + int + top row from this window +
  • +
  • sl + int + left column from this window +
  • +
  • dt + int + top row of rectangle +
  • +
  • dl + int + left column of rectangle +
  • +
  • db + int + bottom row of rectangle +
  • +
  • dr + int + right column of rectangle +
  • +
  • overlay + bool + if true, copy destructively like overlay +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:cursyncup () +
+
+ Mark cursor position of ancestors of a window for refresh. + + + + + +

See also:

+ + + +
+
+ + posix.curses.window:delch () +
+
+ Delete the character under the cursor. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:deleteln () +
+
+ Move the lines below the cursor up, to delete the current line. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:derive (nlines, ncols, begin_y, begin_x) +
+
+ Create a new derived window. + + +

Parameters:

+
    +
  • nlines + int + number of window lines +
  • +
  • ncols + int + number of window columns +
  • +
  • begin_y + int + top line of window +
  • +
  • begin_x + int + leftmost column of window +
  • +
+ +

Returns:

+
    + + window + a new relatively positioned subwindow +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:echoch (ch) +
+
+ Call addch then refresh. + + +

Parameters:

+
    +
  • ch + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:erase () +
+
+ Write blanks to every character position in the window. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:getbegyx () +
+
+ Fetch the absolute top-left coordinates of a window. + + + +

Returns:

+
    +
  1. + int + y coordinate of top line
  2. +
  3. + int + x coordinate of left column
  4. +
  5. + bool + true, if successful
  6. +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:getbkgd () +
+
+ Fetch the current background attribute for the window. + + + +

Returns:

+
    + + int + current window background attribute +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:getch () +
+
+ Read a character from the window input. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:getmaxyx () +
+
+ Fetch the absolute bottom-right coordinates of a window. + + + +

Returns:

+
    +
  1. + int + y coordinate of bottom line
  2. +
  3. + int + x coordinate of right column
  4. +
  5. + bool + true, if successful
  6. +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:getparyx () +
+
+ Fetch the parent-relative coordinates of a subwindow. + + + +

Returns:

+
    +
  1. + int + y coordinate of top line relative to parent window
  2. +
  3. + int + x coordinate of left column relative to parent window
  4. +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:getstr ([n]) +
+
+ Read characters up to the next newline from the window input. + + +

Parameters:

+
    +
  • n + int + + + + (optional) +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:getyx () +
+
+ Fetch the cursor position. + + + +

Returns:

+
    +
  1. + int + y coordinate of top line
  2. +
  3. + int + x coordinate of left column
  4. +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:hline (ch, n) +
+
+ Draw a row of characters from the current cursor position. + + +

Parameters:

+
    +
  • ch + int + + + +
  • +
  • n + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + +

Usage:

+
    +
    +  _, width = win:getmaxyx ()
    +  win:hline (curses.ACS_HLINE, width - curs_x)
    +
+ +
+
+ + posix.curses.window:idcok (bf) +
+
+ Use hardware character insert and delete on supporting terminals. + + +

Parameters:

+
    +
  • bf + bool + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:idlok (bf) +
+
+ Use hardware line insert and delete on supporting terminals. + + +

Parameters:

+
    +
  • bf + bool + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:immedok (bf) +
+
+ Automatically call refresh whenever the window content is changed. + + +

Parameters:

+
    +
  • bf + bool + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:insertln () +
+
+ Move the current line and those below down one line, leaving a new blank line. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:intrflush (bf) +
+
+ Set the flush on interrupt behaviour for the window. + + +

Parameters:

+
    +
  • bf + bool + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:is_linetouched (line) +
+
+ Has a particular window line changed since the last refresh? + + +

Parameters:

+
    +
  • line + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:is_wintouched () +
+
+ Has a window changed since the last refresh? + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:keypad ([on]) +
+
+ Set the single value keypad keys behaviour for the window. + + +

Parameters:

+
    +
  • on + bool + + + + (optional) +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:leaveok (bf) +
+
+ No need to force synchronisation of hardware cursor. + + +

Parameters:

+
    +
  • bf + bool + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:meta (on) +
+
+ Force 8-bit (or 7-bit) input characters for the window. + + +

Parameters:

+
    +
  • on + bool + true to force 8-bit input characters +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:move (y, x) +
+
+ Change the cursor position. + + +

Parameters:

+
    +
  • y + int + + + +
  • +
  • x + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:move_derived (par_y, par_x) +
+
+ Move the position of a derived window. + + +

Parameters:

+
    +
  • par_y + int + lines from top of parent window +
  • +
  • par_x + int + columns from left of parent window +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:move_window (y, x) +
+
+ Move the position of a window. + + +

Parameters:

+
    +
  • y + int + offset frow top of screen +
  • +
  • x + int + offset from left of screen +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:mvaddch (ch) +
+
+ Call move, then addch. + + +

Parameters:

+
    +
  • ch + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:mvaddchstr (y, x[, n]) +
+
+ Call move then addchstr. + + +

Parameters:

+
    +
  • y + int + + + +
  • +
  • x + int + + + +
  • +
  • n + int + + + + (optional) +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:mvaddstr (y, x, str[, n]) +
+
+ Call move then addstr. + + +

Parameters:

+
    +
  • y + int + + + +
  • +
  • x + int + + + +
  • +
  • str + string + + + +
  • +
  • n + int + + + + (optional) +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:mvdelch (y, x) +
+
+ Call move then delch. + + +

Parameters:

+
    +
  • y + int + + + +
  • +
  • x + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:mvgetch (y, x) +
+
+ Call move then getch + + +

Parameters:

+
    +
  • y + int + + + +
  • +
  • x + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:mvgetstr (y, x[, n=-1]) +
+
+ Call move then getstr. + + +

Parameters:

+
    +
  • y + int + + + +
  • +
  • x + int + + + +
  • +
  • n + int + + + + (default -1) +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:mvhline (y, x, ch, n) +
+
+ Move the cursor, then draw a row of characters from the new cursor position. + + +

Parameters:

+
    +
  • y + int + + + +
  • +
  • x + int + + + +
  • +
  • ch + int + + + +
  • +
  • n + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:mvvline (y, x, ch, n) +
+
+ Move the cursor, then draw a column of characters from the new cursor position. + + +

Parameters:

+
    +
  • y + int + + + +
  • +
  • x + int + + + +
  • +
  • ch + int + + + +
  • +
  • n + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:mvwinch (y, x) +
+
+ Call move then winch + + +

Parameters:

+
    +
  • y + int + + + +
  • +
  • x + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:mvwinchnstr (y, x, n) +
+
+ Call move then winchnstr. + + +

Parameters:

+
    +
  • y + int + + + +
  • +
  • x + int + + + +
  • +
  • n + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:mvwinnstr (y, x, n) +
+
+ Call move then winnstr. + + +

Parameters:

+
    +
  • y + int + + + +
  • +
  • x + int + + + +
  • +
  • n + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:mvwinsch (y, x, ch) +
+
+ Call move then winsch. + + +

Parameters:

+
    +
  • y + int + + + +
  • +
  • x + int + + + +
  • +
  • ch + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:mvwinsnstr (y, x, str, n) +
+
+ Call move then winsnstr. + + +

Parameters:

+
    +
  • y + int + + + +
  • +
  • x + int + + + +
  • +
  • str + string + + + +
  • +
  • n + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:mvwinsstr (y, x, str) +
+
+ Call move then winsstr. + + +

Parameters:

+
    +
  • y + int + + + +
  • +
  • x + int + + + +
  • +
  • str + string + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:nodelay (on) +
+
+ Force getch to be non-blocking. + + +

Parameters:

+
    +
  • on + bool + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:notimeout (bf) +
+
+ Return input immediately from this window. + + +

Parameters:

+
    +
  • bf + bool + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:noutrefresh () +
+
+ Copy the window backing screen to the virtual screen. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:overlay (dst) +
+
+ Overlay this window on top of another non-destructively. + + +

Parameters:

+
    +
  • dst + window + destination window +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:overwrite (dst) +
+
+ Destructively overwrite another window with this one. + + +

Parameters:

+
    +
  • dst + window + destination window +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:pechochar (ch) +
+
+ An efficient equivalent to addch followed by refresh. + + +

Parameters:

+
    +
  • ch + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:pnoutrefresh (st, sl, dt, dl, db, dr) +
+
+ Equivalent to noutrefresh for use with pad windows. + + +

Parameters:

+
    +
  • st + int + top row from this pad window +
  • +
  • sl + int + left column from this pad window +
  • +
  • dt + int + top row of rectangle +
  • +
  • dl + int + left column of rectangle +
  • +
  • db + int + bottom row of rectangle +
  • +
  • dr + int + right column of rectangle +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:prefresh (st, sl, dt, dl, db, dr) +
+
+ Equivalent to refresh for use with pad windows. + + +

Parameters:

+
    +
  • st + int + top row from this pad window +
  • +
  • sl + int + left column from this pad window +
  • +
  • dt + int + top row of rectangle +
  • +
  • dl + int + left column of rectangle +
  • +
  • db + int + bottom row of rectangle +
  • +
  • dr + int + right column of rectangle +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:redrawln (beg_line, num_lines) +
+
+ Mark a range of lines in a window as corrupted and in need of redrawing. + + +

Parameters:

+
    +
  • beg_line + int + + + +
  • +
  • num_lines + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:redrawwin () +
+
+ Mark a window as having corrupted display that needs fully redrawing. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:refresh () +
+
+ Refresh the window terminal display from the virtual screen. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:resize (height, width) +
+
+ Change the size of a window. + + +

Parameters:

+
    +
  • height + int + new number of lines +
  • +
  • width + int + new number of columns +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:scrl (n) +
+
+ Scroll the window up n lines. + + +

Parameters:

+
    +
  • n + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:scrollok (bf) +
+
+ Scroll up one line when the cursor writes to the last screen position. + + +

Parameters:

+
    +
  • bf + bool + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:standend () +
+
+ Turn off all attributes for subsequent writes to the window. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:standout () +
+
+ Set A_STANDOUT for subsequent writes to the window. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:sub (nlines, ncols, begin_y, begin_x) +
+
+ Create a new subwindow. + + +

Parameters:

+
    +
  • nlines + int + number of window lines +
  • +
  • ncols + int + number of window columns +
  • +
  • begin_y + int + top line of window +
  • +
  • begin_x + int + leftmost column of window +
  • +
+ +

Returns:

+
    + + window + a new absolutely positioned subwindow +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:subpad (nlines, ncols, begin_y, begin_x) +
+
+ Return a new subpad window object. + + +

Parameters:

+
    +
  • nlines + int + + + +
  • +
  • ncols + int + + + +
  • +
  • begin_y + int + + + +
  • +
  • begin_x + int + + + +
  • +
+ +

Returns:

+
    + + window + a new subpad window object +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:syncdown () +
+
+ Mark child windows for refresh. + + + + + +

See also:

+ + + +
+
+ + posix.curses.window:syncok (bf) +
+
+ Automatically mark ancestors of a changed window for refresh. + + +

Parameters:

+
    +
  • bf + bool + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:syncup () +
+
+ Mark ancestors of a window for refresh. + + + + + +

See also:

+ + + +
+
+ + posix.curses.window:timeout (delay) +
+
+ For differentiating user input from terminal control sequences. + + +

Parameters:

+
    +
  • delay + int + milliseconds, 0 for blocking, -1 for non-blocking +
  • +
+ + + +

See also:

+ + + +
+
+ + posix.curses.window:touch ([changed]) +
+
+ Set the changed state of a window since the last refresh. + + +

Parameters:

+
    +
  • changed + + + + (optional) +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:touchline (y, n[, changed]) +
+
+ Mark a range of lines as changed since the last refresh. + + +

Parameters:

+
    +
  • y + int + + + +
  • +
  • n + int + + + +
  • +
  • changed + + + + (optional) +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:vline (ch, n) +
+
+ Draw a column of characters from the current cursor position. + + +

Parameters:

+
    +
  • ch + int + + + +
  • +
  • n + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:wbkgd (ch) +
+
+ Call wbkgdset and then set the background of every position accordingly. + + +

Parameters:

+
    +
  • ch + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:wbkgdset (ch) +
+
+ Set the background attributes for subsequently written characters. + + +

Parameters:

+
    +
  • ch + int + + + +
  • +
+ + + +

See also:

+ + + +
+
+ + posix.curses.window:winch () +
+
+ Fetch the attributed character at the current cursor position. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:winchnstr (n) +
+
+ Fetch attributed characters from cursor position up to rightmost window position. + + +

Parameters:

+
    +
  • n + int + + + +
  • +
+ +

Returns:

+
    + + posix.curses.chstr + characters from cursor to end of line +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:winnstr (n) +
+
+ Fetch a string from cursor position up to rightmost window position. + + +

Parameters:

+
    +
  • n + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:winsch (ch) +
+
+ Insert a character before the current cursor position. + + +

Parameters:

+
    +
  • ch + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:winsdelln (n) +
+
+ Call deleteln n times. + + +

Parameters:

+
    +
  • n + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:winsnstr (str, n) +
+
+ Like winsstr, but no more than n characters. + + +

Parameters:

+
    +
  • str + string + + + +
  • +
  • n + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:winsstr (str) +
+
+ Insert a string of characters before the current cursor position. + + +

Parameters:

+ + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + posix.curses.window:wsetscrreg (top, bot) +
+
+ Set a software scrolling region for the window. + + +

Parameters:

+
    +
  • top + int + top line of the scrolling region (line 0 is the first line) +
  • +
  • bot + int + bottom line of the scrolling region +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+

Metamethods

+ +
+
+ + posix.curses.window:__tostring () +
+
+ Unique string representation of a posix.curses.window. + + + +

Returns:

+
    + + string + unique string representation of the window object. +
+ + + + +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/examples/curses.lua.html b/doc/examples/curses.lua.html new file mode 100644 index 0000000..db131c1 --- /dev/null +++ b/doc/examples/curses.lua.html @@ -0,0 +1,160 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

curses.lua

+
+local curses = require "curses"
+
+
+local function printf (fmt, ...)
+  return print (string.format (fmt, ...))
+end
+
+
+local function main ()
+  local stdscr = curses.initscr ()
+
+  curses.cbreak ()
+  curses.echo (0)	-- not noecho !
+  curses.nl( 0)		-- not nonl !
+
+  stdscr:clear()
+
+  local a = {}
+  for k, v in pairs (curses) do
+    if type (v) == "number" then a[#a+1] = k end
+  end
+
+  stdscr:mvaddstr (15, 20, "print out curses constants (y/n) ? ")
+  stdscr:refresh()
+
+  local c = stdscr:getch ()
+  if c < 256 then c = string.char (c) end
+
+  curses.endwin ()
+
+  if c == "y" then
+    table.sort (a, cmp)
+    for i, k in ipairs (a) do
+      printf (" %03d. %20s = 0x%08x (%d)",
+        i, "curses." .. k, curses[k], curses[k])
+    end
+  end
+end
+
+
+-- To display Lua errors, we must close curses to return to
+-- normal terminal mode, and then write the error to stdout.
+local function err (err)
+  curses.endwin ()
+  print "Caught an error:"
+  print (debug.traceback (err, 2))
+  os.exit (2)
+end
+
+xpcall (main, err)
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/examples/dir.lua.html b/doc/examples/dir.lua.html new file mode 100644 index 0000000..e3f5108 --- /dev/null +++ b/doc/examples/dir.lua.html @@ -0,0 +1,120 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

dir.lua

+
+local dirent = require "posix.dirent"
+
+local ok, files = pcall (dirent.dir "/var/log")
+if not ok then
+  print ("/var/log: " .. files)
+end
+
+for _, f in ipairs (files) do
+  print (f)
+end
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/examples/fork.lua.html b/doc/examples/fork.lua.html new file mode 100644 index 0000000..1bb0f9c --- /dev/null +++ b/doc/examples/fork.lua.html @@ -0,0 +1,130 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

fork.lua

+
+-- Lua version of example from pipe(2)
+local p = require 'posix'
+local r,w = p.pipe()
+local cpid = p.fork()
+if cpid == 0 then -- child reads from pipe
+    p.close(w)  -- close unused write end
+    local b = p.read(r,1)
+    while #b == 1 do
+        io.write(b)
+        b = p.read(r,1)
+    end
+    p.close(r)
+    p._exit(0)
+else -- parent writes to pipe
+    p.close(r)
+    p.write(w,"hello dolly\n")
+    p.close(w)
+    -- wait for child to finish
+    p.wait(cpid)
+end
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/examples/fork2.lua.html b/doc/examples/fork2.lua.html new file mode 100644 index 0000000..b94def4 --- /dev/null +++ b/doc/examples/fork2.lua.html @@ -0,0 +1,130 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

fork2.lua

+
+require "posix"
+
+print ("parent: my pid is: " .. posix.getpid ("pid"))
+
+local pid = posix.fork ()
+
+if pid == -1 then
+  print ("parent: The fork failed.")
+elseif pid == 0 then
+  print ("child: Hello World! I am pid: " .. posix.getpid ("pid"))
+  print ("child: I'll sleep for 1 second ... ")
+  posix.sleep (1)
+  print ("child: Good bye");
+else
+  print ("parent: While the child sleeps, I'm still running.")
+  print ("parent: waiting for child (pid:" .. pid .. ") to die...")
+  posix.wait (pid)
+  print ("parent: child died, but I'm still alive.")
+  print ("parent: Good bye")
+end
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/examples/getopt.lua.html b/doc/examples/getopt.lua.html new file mode 100644 index 0000000..5967532 --- /dev/null +++ b/doc/examples/getopt.lua.html @@ -0,0 +1,136 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

getopt.lua

+
+local P = require 'posix'
+
+local short = "ha:s:"
+
+local long = {
+  {"help",  "none", 'h'},
+  {"aleph", "required", 'a'},
+  {"start", "required", 's'}
+}
+
+local last_index = 1
+for r, optarg, optind, li in P.getopt (arg, short, long) do
+  if r == '?' then
+    return print  'unrecognized option'
+  end
+  last_index = optind
+  if r == 'h' then
+    print 'help'
+  elseif r == 'a' or r == 's' then
+    print ('we were passed', r, optarg)
+  end
+end
+
+for i = last_index, #arg do
+  print (i, arg[i])
+end
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/examples/glob.lua.html b/doc/examples/glob.lua.html new file mode 100644 index 0000000..f6e9305 --- /dev/null +++ b/doc/examples/glob.lua.html @@ -0,0 +1,115 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + + +
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/examples/limit.lua.html b/doc/examples/limit.lua.html new file mode 100644 index 0000000..4916318 --- /dev/null +++ b/doc/examples/limit.lua.html @@ -0,0 +1,130 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

limit.lua

+
+-- limit.lua
+-- Limiting the CPU time used by a child process;
+-- it will be killed and we don't get the final message
+
+local posix = require 'posix'
+
+posix.setrlimit ('cpu',1,1)
+
+local t = posix.times 'elapsed'
+
+local pid = posix.fork ()
+if pid == 0 then -- child
+  print 'start'
+  for i = 1, 1e9 do
+  end
+  print 'finish'
+else
+  print (posix.wait (pid))
+  print (posix.times 'elapsed' - t)
+end
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/examples/lock.lua.html b/doc/examples/lock.lua.html new file mode 100644 index 0000000..1cc6153 --- /dev/null +++ b/doc/examples/lock.lua.html @@ -0,0 +1,131 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

lock.lua

+
+local p = require "posix"
+local fd = p.creat("file.txt", "rw-r--r--")
+
+-- Set lock on file
+local lock = {
+    l_type = p.F_WRLCK;     -- Exclusive lock
+    l_whence = p.SEEK_SET;  -- Relative to beginning of file
+    l_start = 0;            -- Start from 1st byte
+    l_len = 0;              -- Lock whole file
+  }
+local result = p.fcntl(fd, p.F_SETLK, lock)
+if result == -1 then
+  error("file locked by another process")
+end
+
+-- Do something with file while it's locked
+p.write(fd, "Lorem ipsum\n")
+
+-- Release the lock
+lock.l_type = p.F_UNLCK
+p.fcntl(fd, p.F_SETLK, lock)
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/examples/netlink-uevent.lua.html b/doc/examples/netlink-uevent.lua.html new file mode 100644 index 0000000..4a83a02 --- /dev/null +++ b/doc/examples/netlink-uevent.lua.html @@ -0,0 +1,128 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

netlink-uevent.lua

+
+p = require "posix"
+
+if p.AF_NETLINK ~= nil then
+	local fd, err = p.socket(p.AF_NETLINK, p.SOCK_DGRAM, p.NETLINK_KOBJECT_UEVENT)
+	assert(fd, err)
+
+	local ok, err = p.bind(fd, { family = p.AF_NETLINK, pid = p.getpid("pid"), groups = -1 })
+	assert(ok, err)
+
+	while true do
+		local data, err = p.recv(fd, 16384)
+		assert(data, err)
+		for k, v in data:gmatch("%z(%u+)=([^%z]+)") do
+			print(k, v)
+		end
+		print("\n")
+	end
+end
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/examples/ping.lua.html b/doc/examples/ping.lua.html new file mode 100644 index 0000000..53b2801 --- /dev/null +++ b/doc/examples/ping.lua.html @@ -0,0 +1,141 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

ping.lua

+
+local p = require "posix"
+
+if p.SOCK_RAW and p.SO_BINDTODEVICE then
+	-- Open raw socket
+
+	local fd, err = p.socket(p.AF_INET, p.SOCK_RAW, p.IPPROTO_ICMP)
+	assert(fd, err)
+
+	-- Optionally, bind to specific device
+
+	local ok, err = p.setsockopt(fd, p.SOL_SOCKET, p.SO_BINDTODEVICE, "wlan0")
+	assert(ok, err)
+
+	-- Create raw ICMP echo (ping) message
+
+	local data = string.char(0x08, 0x00, 0x89, 0x98, 0x6e, 0x63, 0x00, 0x04, 0x00)
+
+	-- Send message
+
+	local ok, err = p.sendto(fd, data, { family = p.AF_INET, addr = "8.8.8.8", port = 0 })
+	assert(ok, err)
+
+	-- Read reply
+
+	local data, sa = p.recvfrom(fd, 1024)
+	assert(data, sa)
+
+	if data then
+		print("Received ICMP message from " .. sa.addr)
+	end
+end
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/examples/poll.lua.html b/doc/examples/poll.lua.html new file mode 100644 index 0000000..0df64ad --- /dev/null +++ b/doc/examples/poll.lua.html @@ -0,0 +1,134 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

poll.lua

+
+local P = require 'posix'
+
+local fd1 = P.open(arg[1], P.O_RDONLY)
+local fd2 = P.open(arg[2], P.O_RDONLY)
+
+local fds = {
+  [fd1] = { events = {IN=true} },
+  [fd2] = { events = {IN=true} }
+}
+
+while true do
+  P.poll(fds,-1)
+  for fd in pairs(fds) do
+    if  fds[fd].revents.IN then
+      local res = P.read(fd,1024)
+      P.write(1,res);
+    end
+    if  fds[fd].revents.HUP then
+      P.close(fd)
+      fds[fd] = nil
+      if not next(fds) then return end
+    end
+  end
+end
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/examples/signal.lua.html b/doc/examples/signal.lua.html new file mode 100644 index 0000000..3691f8f --- /dev/null +++ b/doc/examples/signal.lua.html @@ -0,0 +1,172 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

signal.lua

+
+local sig     = require "posix.signal"
+local unistd  = require "posix.unistd"
+local syswait = require "posix.sys.wait"
+
+local function go (fn, ...)
+  local cpid = unistd.fork ()
+  if cpid == 0 then -- run function as child
+    unistd._exit (fn (...) or 0)
+  else
+    return cpid
+  end
+end
+
+local verbose = #arg > 0
+
+local function sleepx (secs)
+  while true do
+    secs = unistd.sleep (secs)
+    if verbose then print ("sleep", secs) end
+    if secs == 0 then return end
+  end
+end
+
+local nchild, nsig = 0, 0
+
+sig.signal (sig.SIGCHLD, function()
+  local pid, status, code = syswait.wait (-1, syswait.WNOHANG)
+  while pid do
+    if pid ~= 0 then
+      if verbose then print ("wait", pid, status, code) end
+      nchild = nchild + 1
+    end
+    pid, status, code = syswait.wait (-1, syswait.WNOHANG)
+  end
+end)
+
+local function handler (signo)
+  if verbose then print ("handled", signo) end
+  nsig = nsig + 1
+end
+
+sig.signal (sig.SIGUSR1, handler)
+sig.signal (sig.SIGUSR2, handler)
+sig.signal (60, handler)
+
+local function killp (nsig)
+  return sig.kill (unistd.getppid (), nsig)
+end
+
+c1 = go (function() unistd.sleep (1); killp (sig.SIGUSR1); killp (sig.SIGUSR2) end)
+c2 = go (function() unistd.sleep (2); killp (sig.SIGUSR2); end)
+c3 = go (function() unistd.sleep (2); killp (sig.SIGUSR1) end)
+
+sleepx(3)
+
+if verbose then
+  print ("children", nchild, "signals", nsig)
+else
+  assert (nchild == 3)
+  assert (nsig ==  4)
+  print '+++ tests OK +++'
+end
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/examples/socket.lua.html b/doc/examples/socket.lua.html new file mode 100644 index 0000000..b749e9b --- /dev/null +++ b/doc/examples/socket.lua.html @@ -0,0 +1,155 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

socket.lua

+
+local sig    = require "posix.signal"
+local sock   = require "posix.sys.socket"
+local unistd = require "posix.unistd"
+
+sig.signal (sig.SIGPIPE, function () print "pipe" end)
+
+-- Get Lua web site title
+local r, err = sock.getaddrinfo ("www.lua.org", "http", { family = sock.AF_INET, socktype = sock.SOCK_STREAM })
+if not r then error (err) end
+
+local fd = sock.socket (sock.AF_INET, sock.SOCK_STREAM, 0)
+local ok, err, e = sock.connect (fd, r[1])
+local sa = sock.getsockname(fd)
+print("Local socket bound to " .. sa.addr .. ":" .. tostring(sa.port))
+if err then error (err) end
+
+sock.send (fd, "GET / HTTP/1.0\r\nHost: www.lua.org\r\n\r\n")
+local data = {}
+while true do
+	local b = sock.recv (fd, 1024)
+	if not b or #b == 0 then
+		break
+	end
+	table.insert (data, b)
+end
+unistd.close (fd)
+data = table.concat (data)
+print (data:match "<TITLE>(.+)</TITLE>")
+
+-- Loopback UDP test, IPV4 and IPV6
+local fd = sock.socket (sock.AF_INET6, sock.SOCK_DGRAM, 0)
+sock.bind (fd, { family = sock.AF_INET6, addr = "::", port = 9999 })
+sock.sendto (fd, "Test ipv4", { family = sock.AF_INET, addr = "127.0.0.1", port = 9999 })
+sock.sendto (fd, "Test ipv6", { family = sock.AF_INET6, addr = "::", port = 9999 })
+for i = 1, 2 do
+	local ok, r = sock.recvfrom (fd, 1024)
+	if ok then
+		print (ok, r.addr, r.port)
+	else
+		print (ok, r)
+	end
+end
+unistd.close (fd)
+
+os.exit (0)
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/examples/termios.lua.html b/doc/examples/termios.lua.html new file mode 100644 index 0000000..25e4f0c --- /dev/null +++ b/doc/examples/termios.lua.html @@ -0,0 +1,177 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

termios.lua

+
+local p = require "posix"
+local dev = arg[1] or "/dev/ttyUSB0"
+
+-- Open serial port and do settings
+
+local fds, err = p.open(dev, p.O_RDWR + p.O_NONBLOCK);
+if not fds then
+	print("Could not open serial port " .. dev .. ":", err)
+	os.exit(1)
+end
+
+p.tcsetattr(fds, 0, {
+	cflag = p.B115200 + p.CS8 + p.CLOCAL + p.CREAD,
+	iflag = p.IGNPAR,
+	oflag = p.OPOST,
+	cc = {
+		[p.VTIME] = 0,
+		[p.VMIN] = 1
+	}
+})
+
+-- Set stdin to non canonical mode. Save current settings
+
+local save = p.tcgetattr(0)
+p.tcsetattr(0, 0, {
+	cc = {
+		[p.VTIME] = 0,
+		[p.VMIN] = 1
+	}
+})
+
+-- Loop, reading and writing between ports. ^C stops
+
+local set = {
+	[0] = { events = { IN = true } },
+	[fds] = { events = { IN = true } },
+}
+
+p.write(1, "Starting terminal, hit ^C to exit\r\n")
+
+local function exit(msg)
+	p.tcsetattr(0, 0, save)
+	print("\n")
+	print(msg)
+	os.exit(0)
+end
+
+while true do
+	local r = p.poll(set, -1)
+	for fd, d in pairs(set) do
+		if d.revents and d.revents.IN then
+			if fd == 0 then
+				local d, err = p.read(0, 1024)
+				if not d then exit(err) end
+				if d == string.char(3) then exit("Bye") end
+				local ok, err = p.write(fds, d)
+				if not ok then exit(err) end
+			end
+			if fd == fds then
+				local d, err = p.read(fds, 1024)
+				if not d then exit(err) end
+				local ok, err = p.write(1, d)
+				if not ok then exit(err) end
+			end
+		end
+	end
+end
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/examples/tree.lua.html b/doc/examples/tree.lua.html new file mode 100644 index 0000000..2c3509a --- /dev/null +++ b/doc/examples/tree.lua.html @@ -0,0 +1,166 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

tree.lua

+
+-- tree view of the file system like the "tree" unix utility
+-- John Belmonte <jvb@prairienet.org>
+
+local posix = require 'posix'
+
+local leaf_indent = '|   '
+local tail_leaf_indent = '    '
+local leaf_prefix = '|-- '
+local tail_leaf_prefix = '`-- '
+local link_prefix = ' -> '
+
+local function printf(...)
+  io.write(string.format(...))
+end
+
+local function do_directory(directory, level, prefix)
+    local num_dirs = 0
+    local num_files = 0
+    local files = posix.dir(directory)
+    local last_file_index = #files
+    table.sort(files)
+    for i, name in ipairs(files) do
+        if name ~= '.' and name ~= '..' then
+            local full_name = string.format('%s/%s', directory, name)
+            local info = assert(posix.stat(full_name))
+            local is_tail = (i==last_file_index)
+            local prefix2 = is_tail and tail_leaf_prefix or leaf_prefix
+            local link = ''
+            if info.type == 'link' then
+                linked_name = assert(posix.readlink(full_name))
+                link = string.format('%s%s', link_prefix, linked_name)
+            end
+            printf('%s%s%s%s\n', prefix, prefix2, name, link)
+            if info.type == 'directory' then
+                local indent = is_tail and tail_leaf_indent or leaf_indent
+                -- TODO: cache string concatination
+                sub_dirs, sub_files = do_directory(full_name, level+1,
+                    prefix .. indent)
+                num_dirs = num_dirs + sub_dirs + 1
+                num_files = num_files + sub_files
+            else
+                num_files = num_files + 1
+            end
+        end
+    end
+    return num_dirs, num_files
+end
+
+local function fore(directory)
+    print(directory)
+    num_dirs, num_files = do_directory(directory, 0, '')
+    printf('\n%d directories, %d files\n', num_dirs, num_files)
+end
+
+directory = (arg and #arg > 0) and arg[1] or '.'
+fore(directory)
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/index.html b/doc/index.html new file mode 100644 index 0000000..b2c761c --- /dev/null +++ b/doc/index.html @@ -0,0 +1,312 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ + +

POSIX bindings for Lua (including curses)

+ +

Modules

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
posixLua POSIX bindings.
posix.ctypeCharacter tests.
posix.cursesFull-screen Text Terminal Manipulation.
posix.direntDirectory Iterators.
posix.errnoSystem error codes and messages.
posix.fcntlFile Control.
posix.fnmatchFilename matching.
posix.getoptCommand Line Argument Processing.
posix.globGenerate pathnames matching a shell-style pattern.
posix.grpGroup Database Operations.
posix.libgenGeneral Library.
posix.pollSynchronous I/O Multiplexing.
posix.pwdPassword Database Operations.
posix.schedKernel Thread Scheduling Priority.
posix.signalSoftware Signal Facilities.
posix.stdioA few Standard I/O functions not already in Lua core.
posix.stdlibStandard Posix Library functions.
posix.sys.msgSys V Message Queue Operations.
posix.sys.resourceControl Maximum System Resource Consumption.
posix.sys.socketBSD Sockets.
posix.sys.statFile Status Querying and Setting.
posix.sys.statvfsRetrieve File System Information.
posix.sys.timeGet and Set System Date and Time.
posix.sys.timesProcess Times.
posix.sys.utsnameGet System Identification.
posix.sys.waitWait for Process Termination.
posix.syslogControl System Log.
posix.termioControl Terminal I/O.
posix.timeTime and Clock Functions.
posix.unistdUnix Standard APIs.
posix.utimeSet File Times.
+

Classes

+ + + + + + + + + +
posix.curses.chstrCurses attributed string buffers.
posix.curses.windowCurses Window objects.
+

Examples

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
curses.lua
dir.lua
fork.lua
fork2.lua
getopt.lua
glob.lua
limit.lua
lock.lua
netlink-uevent.lua
ping.lua
poll.lua
rt_sched.lua
signal.lua
socket.lua
termios.lua
tree.lua
+ +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/ldoc.css b/doc/ldoc.css new file mode 100644 index 0000000..7d74ca2 --- /dev/null +++ b/doc/ldoc.css @@ -0,0 +1,307 @@ +/* BEGIN RESET + +Copyright (c) 2010, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.com/yui/license.html +version: 2.8.2r1 +*/ +html { + color: #000; + background: #FFF; +} +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blockquote,th,td { + margin: 0; + padding: 0; +} +table { + border-collapse: collapse; + border-spacing: 0; +} +fieldset,img { + border: 0; +} +address,caption,cite,code,dfn,em,strong,th,var,optgroup { + font-style: inherit; + font-weight: inherit; +} +del,ins { + text-decoration: none; +} +li { + list-style: disc; + margin-left: 20px; +} +caption,th { + text-align: left; +} +h1,h2,h3,h4,h5,h6 { + font-size: 100%; + font-weight: bold; +} +q:before,q:after { + content: ''; +} +abbr,acronym { + border: 0; + font-variant: normal; +} +sup { + vertical-align: baseline; +} +sub { + vertical-align: baseline; +} +legend { + color: #000; +} +input,button,textarea,select,optgroup,option { + font-family: inherit; + font-size: inherit; + font-style: inherit; + font-weight: inherit; +} +input,button,textarea,select {*font-size:100%; +} +/* END RESET */ + +body { + margin-left: 1em; + margin-right: 1em; + font-family: arial, helvetica, geneva, sans-serif; + background-color: #ffffff; margin: 0px; +} + +code, tt { font-family: monospace; font-size: 1.1em; } +span.parameter { font-family:monospace; } +span.parameter:after { content:":"; } +span.types:before { content:"("; } +span.types:after { content:")"; } +.type { font-weight: bold; font-style:italic } + +body, p, td, th { font-size: .95em; line-height: 1.2em;} + +p, ul { margin: 10px 0 0 0px;} + +strong { font-weight: bold;} + +em { font-style: italic;} + +h1 { + font-size: 1.5em; + margin: 0 0 20px 0; +} +h2, h3, h4 { margin: 15px 0 10px 0; } +h2 { font-size: 1.25em; } +h3 { font-size: 1.15em; } +h4 { font-size: 1.06em; } + +a:link { font-weight: bold; color: #004080; text-decoration: none; } +a:visited { font-weight: bold; color: #006699; text-decoration: none; } +a:link:hover { text-decoration: underline; } + +hr { + color:#cccccc; + background: #00007f; + height: 1px; +} + +blockquote { margin-left: 3em; } + +ul { list-style-type: disc; } + +p.name { + font-family: "Andale Mono", monospace; + padding-top: 1em; +} + +pre.example { + background-color: rgb(245, 245, 245); + border: 1px solid silver; + padding: 10px; + margin: 10px 0 10px 0; + font-family: "Andale Mono", monospace; + font-size: .85em; +} + +pre { + background-color: rgb(245, 245, 245); + border: 1px solid silver; + padding: 10px; + margin: 10px 0 10px 0; + overflow: auto; + font-family: "Andale Mono", monospace; +} + + +table.index { border: 1px #00007f; } +table.index td { text-align: left; vertical-align: top; } + +#container { + margin-left: 1em; + margin-right: 1em; + background-color: #f0f0f0; +} + +#product { + text-align: center; + border-bottom: 1px solid #cccccc; + background-color: #ffffff; +} + +#product big { + font-size: 2em; +} + +#main { + background-color: #f0f0f0; + border-left: 2px solid #cccccc; +} + +#navigation { + float: left; + width: 14em; + vertical-align: top; + background-color: #f0f0f0; + overflow: visible; +} + +#navigation h2 { + background-color:#e7e7e7; + font-size:1.1em; + color:#000000; + text-align: left; + padding:0.2em; + border-top:1px solid #dddddd; + border-bottom:1px solid #dddddd; +} + +#navigation ul +{ + font-size:1em; + list-style-type: none; + margin: 1px 1px 10px 1px; +} + +#navigation li { + text-indent: -1em; + display: block; + margin: 3px 0px 0px 22px; +} + +#navigation li li a { + margin: 0px 3px 0px -1em; +} + +#content { + margin-left: 14em; + padding: 1em; + width: 700px; + border-left: 2px solid #cccccc; + border-right: 2px solid #cccccc; + background-color: #ffffff; +} + +#about { + clear: both; + padding: 5px; + border-top: 2px solid #cccccc; + background-color: #ffffff; +} + +@media print { + body { + font: 12pt "Times New Roman", "TimeNR", Times, serif; + } + a { font-weight: bold; color: #004080; text-decoration: underline; } + + #main { + background-color: #ffffff; + border-left: 0px; + } + + #container { + margin-left: 2%; + margin-right: 2%; + background-color: #ffffff; + } + + #content { + padding: 1em; + background-color: #ffffff; + } + + #navigation { + display: none; + } + pre.example { + font-family: "Andale Mono", monospace; + font-size: 10pt; + page-break-inside: avoid; + } +} + +table.module_list { + border-width: 1px; + border-style: solid; + border-color: #cccccc; + border-collapse: collapse; +} +table.module_list td { + border-width: 1px; + padding: 3px; + border-style: solid; + border-color: #cccccc; +} +table.module_list td.name { background-color: #f0f0f0; min-width: 200px; } +table.module_list td.summary { width: 100%; } + + +table.function_list { + border-width: 1px; + border-style: solid; + border-color: #cccccc; + border-collapse: collapse; +} +table.function_list td { + border-width: 1px; + padding: 3px; + border-style: solid; + border-color: #cccccc; +} +table.function_list td.name { background-color: #f0f0f0; min-width: 200px; } +table.function_list td.summary { width: 100%; } + +ul.nowrap { + overflow:auto; + white-space:nowrap; +} + +dl.table dt, dl.function dt {border-top: 1px solid #ccc; padding-top: 1em;} +dl.table dd, dl.function dd {padding-bottom: 1em; margin: 10px 0 0 20px;} +dl.table h3, dl.function h3 {font-size: .95em;} + +/* stop sublists from having initial vertical space */ +ul ul { margin-top: 0px; } +ol ul { margin-top: 0px; } +ol ol { margin-top: 0px; } +ul ol { margin-top: 0px; } + +/* make the target distinct; helps when we're navigating to a function */ +a:target + * { + background-color: #FF9; +} + +/* styles for prettification of source */ +pre .comment { color: #558817; } +pre .constant { color: #a8660d; } +pre .escape { color: #844631; } +pre .keyword { color: #aa5050; font-weight: bold; } +pre .library { color: #0e7c6b; } +pre .marker { color: #512b1e; background: #fedc56; font-weight: bold; } +pre .string { color: #8080ff; } +pre .number { color: #f8660d; } +pre .operator { color: #2239a8; font-weight: bold; } +pre .preprocessor, pre .prepro { color: #a33243; } +pre .global { color: #800080; } +pre .prompt { color: #558817; } +pre .url { color: #272fc2; text-decoration: underline; } diff --git a/doc/modules/posix.ctype.html b/doc/modules/posix.ctype.html new file mode 100644 index 0000000..f812d80 --- /dev/null +++ b/doc/modules/posix.ctype.html @@ -0,0 +1,201 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.ctype

+

Character tests.

+

+ +

+ + +

Functions

+ + + + + + + + + +
isgraph (character)Check for any printable character except space.
isprint (character)Check for any printable character including space.
+ +
+
+ + +

Functions

+ +
+
+ + isgraph (character) +
+
+ Check for any printable character except space. + + +

Parameters:

+
    +
  • character + string + to act on +
  • +
+ +

Returns:

+
    + + int + non-zero if character is not in the class +
+ + +

See also:

+ + + +
+
+ + isprint (character) +
+
+ Check for any printable character including space. + + +

Parameters:

+
    +
  • character + string + to act on +
  • +
+ +

Returns:

+
    + + int + non-zero if character is not in the class +
+ + +

See also:

+ + + +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.curses.html b/doc/modules/posix.curses.html new file mode 100644 index 0000000..7632505 --- /dev/null +++ b/doc/modules/posix.curses.html @@ -0,0 +1,2935 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.curses

+

Full-screen Text Terminal Manipulation.

+

In the underlying curses C library, the following functions:

+ + +
+getstr()   (and wgetstr(), mvgetstr(), and mvwgetstr())
+inchstr()  (and winchstr(), mvinchstr(), and mvwinchstr())
+instr()    (and winstr(), mvinstr(), and mvwinstr())
+
+ +

are subject to buffer overflow attack. This is because you pass in the + buffer to be filled in, which has to be of finite length. But in this + Lua module, a buffer is assigned automatically and the function returns + the string, so there is no security issue. You may still use the alternate + functions:

+ + +
+s = stdscr:getnstr()
+s = stdscr:inchnstr()
+s = stdscr:innstr()
+
+ +

which take an extra "size of buffer" argument, in order to impose a maximum + length on the string the user may type in.

+ +

Some of the C functions beginning with "no" do not exist in Lua. You should + use curses.nl(false) and curses.nl(true) instead of nonl() and nl(), + and likewise curses.echo(false) and curses.echo(true) instead of + noecho() and echo() .

+ +

In this Lua module the stdscr:getch() function always returns an integer. + In C, a single character is an integer, but in Lua (and Perl) a single + character is a short string. The Perl Curses function getch() returns a + char if it was a char, and a number if it was a constant; to get this + behaviour in Lua you have to convert explicitly, e.g.:

+ + +
+if c < 256 then c = string.char(c) end
+
+ +

Some Lua functions take a different set of parameters than their C + counterparts; for example, you should use str = stdscr.getstr() and + y, x = stdscr.getyx() instead of getstr(str) and getyx(y, x), and + likewise for getbegyx and getmaxyx and getparyx and pair_content. + The Perl Curses module now uses the C-compatible parameters, so be aware of + this difference when translating code from Perl into Lua, as well as from C + into Lua.

+ +

Many curses functions have variants starting with the prefixes w-, mv-, + and/or wmv-. These variants differ only in the explicit addition of a + window, or by the addition of two coordinates that are used to move the + cursor first. For example, in C addch() has three other variants: + waddch(), mvaddch() and mvwaddch(). The Lua equivalents, + respectively being stdscr:addch(), somewindow:addch(), + stdscr:mvaddch() and somewindow:mvaddch(), with the window argument + passed implicitly with Lua's : syntax sugar.

+ + +

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
baudrate ()Fetch the output speed of the terminal.
beep ()Send the terminal audible bell.
cbreak ([on])Put the terminal into cbreak mode.
color_pair (pair)Return the attributes for the given color pair id.
color_pairs ()How may distinct color pairs are supported by this terminal?
colors ()How many colors are available for this terminal?
cols ()Number of columns in the main screen window.
curs_set (vis)Change the visibility of the cursor.
delay_output (ms)Insert padding characters to force a short delay.
doupdate ()Refresh the visible terminal screen.
echo ([on])Whether characters are echoed to the terminal as they are typed.
endwin ()Clean up terminal prior to exiting or escaping curses.
erasechar ()Fetch the terminal's current erase character.
flash ()Send the terminal visible bell.
flushinp ()Throw away any typeahead in the keyboard input buffer.
halfdelay (tenths)Put the terminal into halfdelay mode.
has_colors ()Does the terminal have color capability?
has_ic ()Fetch the character insert and delete capability of the terminal.
has_il ()Fetch the line insert and delete capability of the terminal.
init_pair (pair, f, b)Associate a color pair id with a specific foreground and background color.
initscr ()Initialise screen.
isendwin ()Has endwin been called more recently than posix.curses.window:refresh?
keyname (c)Return a printable representation of a key.
killchar ()Fetch the terminal's current kill character.
lines ()Number of lines in the main screen window.
longname ()Fetch the verbose name of the terminal.
napms (ms)Sleep for a few milliseconds.
new_chstr (len)Create a new line drawing buffer instance.
newpad (nlines, ncols)Create a new pad.
newwin (nlines, ncols, begin_y, begin_x)Create a new window.
nl ([on])Whether to translate a return key to newline on input.
pair_content (pair)Return the foreground and background colors associated with a color pair id.
raw ([on])Put the terminal into raw mode.
resizeterm (nlines, ncols)Change the terminal size.
ripoffline (top_line, callback)Reduce the available size of the main screen.
slk_attroff (attrs)Disable an attribute for soft labels.
slk_attron (attrs)Enable an attribute for soft labels.
slk_attrset (attrs)Set the attributes for soft labels.
slk_clear ()Clears the soft labels from the screen.
slk_init (fmt)Initialise the soft label keys area.
slk_label (labnum)Fetch the label for a soft label key.
slk_noutrefresh ()Copy the soft label key area backing screen to the virtual screen.
slk_refresh ()Refresh the soft label key area.
slk_restore ()Restores the soft labels to the screen.
slk_set (labnum, label, fmt)Set the label for a soft label key.
slk_touch ()Mark the soft label key area for refresh.
start_color ()Initialise color output facility.
stdscr ()Retern the main screen window.
termattrs ([a])Bitwise OR of all (or selected) video attributes supported by the terminal.
termname ()Fetch the name of the terminal.
tigetflag (capname)Fetch terminfo boolean capability.
tigetnum (capname)Fetch terminfo numeric capability.
tigetstr (capname)Fetch terminfo string capability.
unctrl (c)Return a printable representation of a character, ignoring attributes.
ungetch (c)Return a character to the keyboard input buffer.
use_default_colors ()Reserve -1 to represent terminal default colors.
+

Constants

+ + + + + +
posix.cursesCurses constants.
+ +
+
+ + +

Functions

+ +
+
+ + baudrate () +
+
+ Fetch the output speed of the terminal. + + + +

Returns:

+
    + + int + output speed of the terminal in bits-per-second +
+ + +

See also:

+ + + +
+
+ + beep () +
+
+ Send the terminal audible bell. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + cbreak ([on]) +
+
+ Put the terminal into cbreak mode. + + +

Parameters:

+
    +
  • on + bool + + + + (optional) +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + color_pair (pair) +
+
+ Return the attributes for the given color pair id. + + +

Parameters:

+
    +
  • pair + int + color pair id to act on +
  • +
+ +

Returns:

+
    + + int + attributes for color pair pair +
+ + +

See also:

+ + + +
+
+ + color_pairs () +
+
+ How may distinct color pairs are supported by this terminal? + + + +

Returns:

+
    + + int + total number of available color pairs +
+ + +

See also:

+ + + +
+
+ + colors () +
+
+ How many colors are available for this terminal? + + + +

Returns:

+
    + + int + total number of available colors +
+ + +

See also:

+ + + +
+
+ + cols () +
+
+ Number of columns in the main screen window. + + + +

Returns:

+
    + + int + number of columns in the main screen +
+ + +

See also:

+ + + +
+
+ + curs_set (vis) +
+
+ Change the visibility of the cursor. + + +

Parameters:

+
    +
  • vis + int + one of 0 (invisible), 1 (visible) or 2 (very visible) +
  • +
+ +

Returns:

+
    + + int + previous cursor state +
+

Or

+
    + + nil if vis is not supported +
+ + +

See also:

+ + + +
+
+ + delay_output (ms) +
+
+ Insert padding characters to force a short delay. + + +

Parameters:

+
    +
  • ms + int + delay time in milliseconds +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + doupdate () +
+
+ Refresh the visible terminal screen. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + echo ([on]) +
+
+ Whether characters are echoed to the terminal as they are typed. + + +

Parameters:

+
    +
  • on + bool + + + + (optional) +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + endwin () +
+
+ Clean up terminal prior to exiting or escaping curses. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + erasechar () +
+
+ Fetch the terminal's current erase character. + + + +

Returns:

+
    + + int + current erase character +
+ + +

See also:

+ + + +
+
+ + flash () +
+
+ Send the terminal visible bell. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + flushinp () +
+
+ Throw away any typeahead in the keyboard input buffer. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + halfdelay (tenths) +
+
+ Put the terminal into halfdelay mode. + + +

Parameters:

+
    +
  • tenths + int + delay in tenths of a second +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + has_colors () +
+
+ Does the terminal have color capability? + + + +

Returns:

+
    + + bool + true, if the terminal supports colors +
+ + +

See also:

+ + +

Usage:

+
    +
    +if curses.has_colors () then
    +  curses.start_color ()
    +end
    +
+ +
+
+ + has_ic () +
+
+ Fetch the character insert and delete capability of the terminal. + + + +

Returns:

+
    + + bool + true, if the terminal has insert and delete character + operations +
+ + +

See also:

+ + + +
+
+ + has_il () +
+
+ Fetch the line insert and delete capability of the terminal. + + + +

Returns:

+
    + + bool + true, if the terminal has insert and delete line operations +
+ + +

See also:

+ + + +
+
+ + init_pair (pair, f, b) +
+
+ Associate a color pair id with a specific foreground and background color. + + +

Parameters:

+
    +
  • pair + int + color pair id to act on +
  • +
  • f + int + foreground color to assign +
  • +
  • b + int + background color to assign +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + initscr () +
+
+ Initialise screen. + + + +

Returns:

+
    + + window + main screen +
+ + +

See also:

+ + + +
+
+ + isendwin () +
+
+ Has endwin been called more recently than posix.curses.window:refresh? + + + +

Returns:

+
    + + bool + whether endwin has been called +
+ + +

See also:

+ + + +
+
+ + keyname (c) +
+
+ Return a printable representation of a key. + + +

Parameters:

+
    +
  • c + int + a key +
  • +
+ +

Returns:

+
    + + string + key name of c +
+ + +

See also:

+ + + +
+
+ + killchar () +
+
+ Fetch the terminal's current kill character. + + + +

Returns:

+
    + + int + current line kill character +
+ + +

See also:

+ + + +
+
+ + lines () +
+
+ Number of lines in the main screen window. + + + +

Returns:

+
    + + int + number of lines in the main screen +
+ + +

See also:

+ + + +
+
+ + longname () +
+
+ Fetch the verbose name of the terminal. + + + +

Returns:

+
    + + string + verbose description of the current terminal +
+ + +

See also:

+ + + +
+
+ + napms (ms) +
+
+ Sleep for a few milliseconds. + + +

Parameters:

+
    +
  • ms + int + time to wait in milliseconds +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + new_chstr (len) +
+
+ Create a new line drawing buffer instance. + + +

Parameters:

+
    +
  • len + int + number of element to allocate +
  • +
+ +

Returns:

+
    + + chstr + a new char buffer object +
+ + +

See also:

+ + + +
+
+ + newpad (nlines, ncols) +
+
+ Create a new pad. + + +

Parameters:

+
    +
  • nlines + int + + + +
  • +
  • ncols + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + newwin (nlines, ncols, begin_y, begin_x) +
+
+ Create a new window. + + +

Parameters:

+
    +
  • nlines + int + number of window lines +
  • +
  • ncols + int + number of window columns +
  • +
  • begin_y + int + top line of window +
  • +
  • begin_x + int + leftmost column of window +
  • +
+ +

Returns:

+
    + + window + a new window object +
+ + +

See also:

+ + + +
+
+ + nl ([on]) +
+
+ Whether to translate a return key to newline on input. + + +

Parameters:

+
    +
  • on + bool + + + + (optional) +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + pair_content (pair) +
+
+ Return the foreground and background colors associated with a color pair id. + + +

Parameters:

+
    +
  • pair + int + color pair id to act on +
  • +
+ +

Returns:

+
    +
  1. + int + foreground color of pair
  2. +
  3. + int + background color of pair
  4. +
+ + +

See also:

+ + + +
+
+ + raw ([on]) +
+
+ Put the terminal into raw mode. + + +

Parameters:

+
    +
  • on + bool + + + + (optional) +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + resizeterm (nlines, ncols) +
+
+ Change the terminal size. + + +

Parameters:

+
    +
  • nlines + int + number of lines +
  • +
  • ncols + int + number of columns +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ +

Raises:

+ unimplemented + + + +
+
+ + ripoffline (top_line, callback) +
+
+ Reduce the available size of the main screen. + + +

Parameters:

+
    +
  • top_line + bool + + + +
  • +
  • callback + func + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + slk_attroff (attrs) +
+
+ Disable an attribute for soft labels. + + +

Parameters:

+
    +
  • attrs + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + slk_attron (attrs) +
+
+ Enable an attribute for soft labels. + + +

Parameters:

+
    +
  • attrs + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + slk_attrset (attrs) +
+
+ Set the attributes for soft labels. + + +

Parameters:

+
    +
  • attrs + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + slk_clear () +
+
+ Clears the soft labels from the screen. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + slk_init (fmt) +
+
+ Initialise the soft label keys area. +This must be called before initscr. + + +

Parameters:

+
    +
  • fmt + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + slk_label (labnum) +
+
+ Fetch the label for a soft label key. + + +

Parameters:

+
    +
  • labnum + int + + + +
  • +
+ +

Returns:

+
    + + string + current label for labnum +
+ + +

See also:

+ + + +
+
+ + slk_noutrefresh () +
+
+ Copy the soft label key area backing screen to the virtual screen. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + slk_refresh () +
+
+ Refresh the soft label key area. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + slk_restore () +
+
+ Restores the soft labels to the screen. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + slk_set (labnum, label, fmt) +
+
+ Set the label for a soft label key. + + +

Parameters:

+
    +
  • labnum + int + + + +
  • +
  • label + string + + + +
  • +
  • fmt + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + slk_touch () +
+
+ Mark the soft label key area for refresh. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + start_color () +
+
+ Initialise color output facility. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + stdscr () +
+
+ Retern the main screen window. + + + +

Returns:

+
    + + window + main screen +
+ + +

See also:

+ + + +
+
+ + termattrs ([a]) +
+
+ Bitwise OR of all (or selected) video attributes supported by the terminal. + + +

Parameters:

+
    +
  • a + int + terminal attribute bits + (optional) +
  • +
+ +

Returns:

+
    + + bool + true, if the terminal supports attribute a +
+

Or

+
    + + int + bitarray of supported terminal attributes +
+ + +

See also:

+ + + +
+
+ + termname () +
+
+ Fetch the name of the terminal. + + + +

Returns:

+
    + + string + terminal name +
+ + +

See also:

+ + + +
+
+ + tigetflag (capname) +
+
+ Fetch terminfo boolean capability. + + +

Parameters:

+
    +
  • capname + string + + + +
  • +
+ +

Returns:

+
    + + bool + content of terminal boolean capability +
+ + +

See also:

+ + + +
+
+ + tigetnum (capname) +
+
+ Fetch terminfo numeric capability. + + +

Parameters:

+
    +
  • capname + string + + + +
  • +
+ +

Returns:

+
    + + int + content of terminal numeric capability +
+ + +

See also:

+ + + +
+
+ + tigetstr (capname) +
+
+ Fetch terminfo string capability. + + +

Parameters:

+
    +
  • capname + string + + + +
  • +
+ +

Returns:

+
    + + string + content of terminal string capability +
+ + +

See also:

+ + + +
+
+ + unctrl (c) +
+
+ Return a printable representation of a character, ignoring attributes. + + +

Parameters:

+
    +
  • c + int + character to act on +
  • +
+ +

Returns:

+
    + + string + printable representation of c +
+ + +

See also:

+ + + +
+
+ + ungetch (c) +
+
+ Return a character to the keyboard input buffer. + + +

Parameters:

+
    +
  • c + int + + + +
  • +
+ +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+ + use_default_colors () +
+
+ Reserve -1 to represent terminal default colors. + + + +

Returns:

+
    + + bool + true, if successful +
+ + +

See also:

+ + + +
+
+

Constants

+ + +
+
+ + posix.curses +
+
+ Curses constants. +Any constants not available in the underlying system will be nil valued, +see curses.lua. Many of the KEY_ constants cannot be generated by +modern keyboards and are mostly for historical compatibility with ancient +terminal hardware keyboards.

+ +

Note that, unlike the other posix submodules, almost all of these constants +remain undefined (nil) until after posix.curses.initscr has returned +successfully. + + +

Fields:

+
    +
  • ACS_BLOCK + int + alternate character set solid block +
  • +
  • ACS_BOARD + int + alternate character set board of squares +
  • +
  • ACS_BTEE + int + alternate character set bottom-tee +
  • +
  • ACS_BULLET + int + alternate character set bullet +
  • +
  • ACS_CKBOARD + int + alternate character set stipple +
  • +
  • ACS_DARROW + int + alternate character set down arrow +
  • +
  • ACS_DEGREE + int + alternate character set degrees mark +
  • +
  • ACS_DIAMOND + int + alternate character set diamond +
  • +
  • ACS_HLINE + int + alternate character set horizontal line +
  • +
  • ACS_LANTERN + int + alternate character set lantern +
  • +
  • ACS_LARROW + int + alternate character set left arrow +
  • +
  • ACS_LLCORNER + int + alternate character set lower left corner +
  • +
  • ACS_LRCORNER + int + alternate character set lower right corner +
  • +
  • ACS_LTEE + int + alternate character set left tee +
  • +
  • ACS_PLMINUS + int + alternate character set plus/minus +
  • +
  • ACS_PLUS + int + alternate character set plus +
  • +
  • ACS_RARROW + int + alternate character set right arrow +
  • +
  • ACS_RTEE + int + alternate character set right tee +
  • +
  • ACS_S1 + int + alternate character set scan-line 1 +
  • +
  • ACS_S9 + int + alternate character set scan-line 9 +
  • +
  • ACS_TTEE + int + alternate character set top tee +
  • +
  • ACS_UARROW + int + alternate character set up arrow +
  • +
  • ACS_ULCORNER + int + alternate character set upper left corner +
  • +
  • ACS_URCORNER + int + alternate character set upper right corner +
  • +
  • ACS_VLINE + int + alternate character set vertical line +
  • +
  • A_ALTCHARSET + int + alternatate character set attribute +
  • +
  • A_ATTRIBUTES + int + attributed character attributes bitmask +
  • +
  • A_BLINK + int + blinking attribute +
  • +
  • A_BOLD + int + bold attribute +
  • +
  • A_CHARTEXT + int + attributed character text bitmask +
  • +
  • A_COLOR + int + attributed character color-pair bitmask +
  • +
  • A_DIM + int + half-bright attribute +
  • +
  • A_INVIS + int + invisible attribute +
  • +
  • A_NORMAL + int + normal attribute (all attributes off) +
  • +
  • A_PROTECT + int + protected attribute +
  • +
  • A_REVERSE + int + reverse video attribute +
  • +
  • A_STANDOUT + int + standout attribute +
  • +
  • A_UNDERLINE + int + underline attribute +
  • +
  • COLOR_BLACK + int + black color attribute +
  • +
  • COLOR_BLUE + int + blue color attribute +
  • +
  • COLOR_CYAN + int + cyan color attribute +
  • +
  • COLOR_GREEN + int + green color attribute +
  • +
  • COLOR_MAGENTA + int + magenta color attribute +
  • +
  • COLOR_RED + int + red color attribute +
  • +
  • COLOR_WHITE + int + white color attribute +
  • +
  • COLOR_YELLOW + int + yellow color attribute +
  • +
  • KEY_A1 + int + upper-left of keypad key +
  • +
  • KEY_A3 + int + upper-right of keypad key +
  • +
  • KEY_B2 + int + center of keypad key +
  • +
  • KEY_BACKSPACE + int + backspace key +
  • +
  • KEY_BEG + int + beginning key +
  • +
  • KEY_BREAK + int + break key +
  • +
  • KEY_BTAB + int + backtab key +
  • +
  • KEY_C1 + int + bottom-left of keypad key +
  • +
  • KEY_C3 + int + bottom-right of keypad key +
  • +
  • KEY_CANCEL + int + cancel key +
  • +
  • KEY_CATAB + int + clear all tabs key +
  • +
  • KEY_CLEAR + int + clear screen key +
  • +
  • KEY_CLOSE + int + close key +
  • +
  • KEY_COMMAND + int + command key +
  • +
  • KEY_COPY + int + copy key +
  • +
  • KEY_CREATE + int + create key +
  • +
  • KEY_CTAB + int + clear tab key +
  • +
  • KEY_DC + int + delete character key +
  • +
  • KEY_DL + int + delete line key +
  • +
  • KEY_DOWN + int + down arrow key +
  • +
  • KEY_EIC + int + exit insert char mode key +
  • +
  • KEY_END + int + end key +
  • +
  • KEY_ENTER + int + enter key +
  • +
  • KEY_EOL + int + clear to end of line key +
  • +
  • KEY_EOS + int + clear to end of screen key +
  • +
  • KEY_EXIT + int + exit key +
  • +
  • KEY_F0 + int + f0 key +
  • +
  • KEY_F1 + int + f1 key +
  • +
  • KEY_F2 + int + f2 key +
  • +
  • KEY_F3 + int + f3 key +
  • +
  • KEY_F4 + int + f4 key +
  • +
  • KEY_F5 + int + f5 key +
  • +
  • KEY_F6 + int + f6 key +
  • +
  • KEY_F7 + int + f7 key +
  • +
  • KEY_F8 + int + f8 key +
  • +
  • KEY_F9 + int + f9 key +
  • +
  • KEY_F10 + int + f10 key +
  • +
  • KEY_F11 + int + f11 key +
  • +
  • KEY_F12 + int + f12 key +
  • +
  • KEY_F13 + int + f13 key +
  • +
  • KEY_F14 + int + f14 key +
  • +
  • KEY_F15 + int + f15 key +
  • +
  • KEY_F16 + int + f16 key +
  • +
  • KEY_F17 + int + f17 key +
  • +
  • KEY_F18 + int + f18 key +
  • +
  • KEY_F19 + int + f19 key +
  • +
  • KEY_F20 + int + f20 key +
  • +
  • KEY_F21 + int + f21 key +
  • +
  • KEY_F22 + int + f22 key +
  • +
  • KEY_F23 + int + f23 key +
  • +
  • KEY_F24 + int + f24 key +
  • +
  • KEY_F25 + int + f25 key +
  • +
  • KEY_F26 + int + f26 key +
  • +
  • KEY_F27 + int + f27 key +
  • +
  • KEY_F28 + int + f28 key +
  • +
  • KEY_F29 + int + f29 key +
  • +
  • KEY_F30 + int + f30 key +
  • +
  • KEY_F31 + int + f31 key +
  • +
  • KEY_F32 + int + f32 key +
  • +
  • KEY_F33 + int + f33 key +
  • +
  • KEY_F34 + int + f34 key +
  • +
  • KEY_F35 + int + f35 key +
  • +
  • KEY_F36 + int + f36 key +
  • +
  • KEY_F37 + int + f37 key +
  • +
  • KEY_F38 + int + f38 key +
  • +
  • KEY_F39 + int + f39 key +
  • +
  • KEY_F40 + int + f40 key +
  • +
  • KEY_F41 + int + f41 key +
  • +
  • KEY_F42 + int + f42 key +
  • +
  • KEY_F43 + int + f43 key +
  • +
  • KEY_F44 + int + f44 key +
  • +
  • KEY_F45 + int + f45 key +
  • +
  • KEY_F46 + int + f46 key +
  • +
  • KEY_F47 + int + f47 key +
  • +
  • KEY_F48 + int + f48 key +
  • +
  • KEY_F49 + int + f49 key +
  • +
  • KEY_F50 + int + f50 key +
  • +
  • KEY_F51 + int + f51 key +
  • +
  • KEY_F52 + int + f52 key +
  • +
  • KEY_F53 + int + f53 key +
  • +
  • KEY_F54 + int + f54 key +
  • +
  • KEY_F55 + int + f55 key +
  • +
  • KEY_F56 + int + f56 key +
  • +
  • KEY_F57 + int + f57 key +
  • +
  • KEY_F58 + int + f58 key +
  • +
  • KEY_F59 + int + f59 key +
  • +
  • KEY_F60 + int + f60 key +
  • +
  • KEY_F61 + int + f61 key +
  • +
  • KEY_F62 + int + f62 key +
  • +
  • KEY_F63 + int + f63 key +
  • +
  • KEY_FIND + int + find key +
  • +
  • KEY_HELP + int + help key +
  • +
  • KEY_HOME + int + home key +
  • +
  • KEY_IC + int + enter insert char mode key +
  • +
  • KEY_IL + int + insert line key +
  • +
  • KEY_LEFT + int + cursor left key +
  • +
  • KEY_LL + int + home down or bottom key +
  • +
  • KEY_MARK + int + mark key +
  • +
  • KEY_MESSAGE + int + message key +
  • +
  • KEY_MOUSE + int + mouse event available virtual key +
  • +
  • KEY_MOVE + int + move key +
  • +
  • KEY_NEXT + int + next object key +
  • +
  • KEY_NPAGE + int + next page key +
  • +
  • KEY_OPEN + int + open key +
  • +
  • KEY_OPTIONS + int + options key +
  • +
  • KEY_PPAGE + int + previous page key +
  • +
  • KEY_PREVIOUS + int + prewious object key +
  • +
  • KEY_PRINT + int + print key +
  • +
  • KEY_REDO + int + redo key +
  • +
  • KEY_REFERENCE + int + reference key +
  • +
  • KEY_REFRESH + int + refresh key +
  • +
  • KEY_REPLACE + int + replace key +
  • +
  • KEY_RESET + int + hard reset key +
  • +
  • KEY_RESIZE + int + resize event virtual key +
  • +
  • KEY_RESTART + int + restart key +
  • +
  • KEY_RESUME + int + resume key +
  • +
  • KEY_RIGHT + int + cursor right key +
  • +
  • KEY_SAVE + int + save key +
  • +
  • KEY_SBEG + int + shift beginning key +
  • +
  • KEY_SCANCEL + int + shift cancel key +
  • +
  • KEY_SCOMMAND + int + shift command key +
  • +
  • KEY_SCOPY + int + shift copy key +
  • +
  • KEY_SCREATE + int + shift create key +
  • +
  • KEY_SDC + int + shift delete character key +
  • +
  • KEY_SDL + int + shift delete line key +
  • +
  • KEY_SELECT + int + select key +
  • +
  • KEY_SEND + int + send key +
  • +
  • KEY_SEOL + int + shift clear to end of line key +
  • +
  • KEY_SEXIT + int + shift exit key +
  • +
  • KEY_SF + int + scroll one line forward key +
  • +
  • KEY_SFIND + int + shift find key +
  • +
  • KEY_SHELP + int + shift help key +
  • +
  • KEY_SHOME + int + shift home key +
  • +
  • KEY_SIC + int + shift enter insert mode key +
  • +
  • KEY_SLEFT + int + shift cursor left key +
  • +
  • KEY_SMESSAGE + int + shift message key +
  • +
  • KEY_SMOVE + int + shift move key +
  • +
  • KEY_SNEXT + int + shift next object key +
  • +
  • KEY_SOPTIONS + int + shift options key +
  • +
  • KEY_SPREVIOUS + int + shift previous object key +
  • +
  • KEY_SPRINT + int + shift print key +
  • +
  • KEY_SR + int + scroll one line backward key +
  • +
  • KEY_SREDO + int + shift redo key +
  • +
  • KEY_SREPLACE + int + shift replace key +
  • +
  • KEY_SRESET + int + soft reset key +
  • +
  • KEY_SRIGHT + int + shift cursor right key +
  • +
  • KEY_SRSUME + int + shift resume key +
  • +
  • KEY_SSAVE + int + shift save key +
  • +
  • KEY_SSUSPEND + int + shift suspend key +
  • +
  • KEY_STAB + int + shift tab key +
  • +
  • KEY_SUNDO + int + shift undo key +
  • +
  • KEY_SUSPEND + int + suspend key +
  • +
  • KEY_UNDO + int + undo key +
  • +
  • KEY_UP + int + cursor up key +
  • +
+ + + + +

Usage:

+
    +
    +  -- Print curses constants supported on this host.
    +  for name, value in pairs (require "posix.curses") do
    +    if type (value) == "number" then
    +      print (name, value)
    +     end
    +  end
    +
+ +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.dirent.html b/doc/modules/posix.dirent.html new file mode 100644 index 0000000..2b79453 --- /dev/null +++ b/doc/modules/posix.dirent.html @@ -0,0 +1,198 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.dirent

+

Directory Iterators.

+

+ +

+ + +

Functions

+ + + + + + + + + +
dir ([path="."])Contents of directory.
files ([path="."])Iterator over all files in named directory.
+ +
+
+ + +

Functions

+ +
+
+ + dir ([path="."]) +
+
+ Contents of directory. + + +

Parameters:

+
    +
  • path + string + directory to act on + (default ".") +
  • +
+ +

Returns:

+
    + + table + contents of path +
+ + +

See also:

+ + + +
+
+ + files ([path="."]) +
+
+ Iterator over all files in named directory. + + +

Parameters:

+
    +
  • path + string + directory to act on + (default ".") +
  • +
+ +

Returns:

+
    + + an iterator +
+ + + + +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.errno.html b/doc/modules/posix.errno.html new file mode 100644 index 0000000..68eb264 --- /dev/null +++ b/doc/modules/posix.errno.html @@ -0,0 +1,536 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.errno

+

System error codes and messages.

+

Usually, you'll be able to work with the error messages returned as the + second value from failed calls directly, without having to manually save + and stringify the system messages as you would in C. For completeness, + the functions are still available here.

+ + +

Functions

+ + + + + + + + + +
errno ([n=current errno])Describe an error code/and or read errno
set_errno (n)Set errno.
+

Constants

+ + + + + +
posix.errnoError constants.
+ +
+
+ + +

Functions

+ +
+
+ + errno ([n=current errno]) +
+
+ Describe an error code/and or read errno + + +

Parameters:

+
    +
  • n + int + optional error code + (default current errno) +
  • +
+ +

Returns:

+
    +
  1. + description
  2. +
  3. + error code
  4. +
+ + +

See also:

+ + +

Usage:

+
    +
    local strerr, nerr = P.errno ()
    +
+ +
+
+ + set_errno (n) +
+
+ Set errno. + + +

Parameters:

+
    +
  • n + int + error code +
  • +
+ + + +

See also:

+ + +

Usage:

+
    +
    P.errno (P.EBADF)
    +
+ +
+
+

Constants

+ + +
+
+ + posix.errno +
+
+ Error constants. +Any constants not available in the underlying system will be nil valued.

+ +

If you find one of the luaposix APIs returns an error code not listed here, +please raise an issue here, stating +the symbolic name of the constant (from /usr/include/errno.h or equivalent). + + +

Fields:

+
    +
  • E2BIG + int + argument list too long +
  • +
  • EACCES + int + permission denied +
  • +
  • EADDRINUSE + int + address already in use +
  • +
  • EADDRNOTAVAIL + int + can't assign requested address +
  • +
  • EAFNOSUPPORT + int + address family not supported by protocol family +
  • +
  • EAGAIN + int + resource temporarily unavailable +
  • +
  • EALREADY + int + operation already in progress +
  • +
  • EBADF + int + bad file descriptor +
  • +
  • EBADMSG + int + bad message +
  • +
  • EBUSY + int + resource busy +
  • +
  • ECANCELED + int + operation canceled +
  • +
  • ECHILD + int + no child processes +
  • +
  • ECONNABORTED + int + software caused connection abort +
  • +
  • ECONNREFUSED + int + connection refused +
  • +
  • ECONNRESET + int + connection reset by peer +
  • +
  • EDEADLK + int + resource deadlock avoided +
  • +
  • EDESTADDRREQ + int + destination address required +
  • +
  • EDOM + int + numerical argument out of domain +
  • +
  • EEXIST + int + file exists +
  • +
  • EFAULT + int + bad address +
  • +
  • EFBIG + int + file too large +
  • +
  • EHOSTUNREACH + int + no route to host +
  • +
  • EIDRM + int + identifier removed +
  • +
  • EILSEQ + int + illegal byte sequence +
  • +
  • EINPROGRESS + int + operation now in progress +
  • +
  • EINTR + int + interrupted system call +
  • +
  • EINVAL + int + invalid argument +
  • +
  • EIO + int + input/output error +
  • +
  • EISCONN + int + socket is already connected +
  • +
  • EISDIR + int + is a directory +
  • +
  • ELOOP + int + too many levels of symbolic links +
  • +
  • EMFILE + int + too many open files +
  • +
  • EMLINK + int + too many links +
  • +
  • EMSGSIZE + int + message too long +
  • +
  • ENAMETOOLONG + int + file name too long +
  • +
  • ENETDOWN + int + network is down +
  • +
  • ENETRESET + int + network dropped connection on reset +
  • +
  • ENETUNREACH + int + network is unreachable +
  • +
  • ENFILE + int + too many open files in system +
  • +
  • ENOBUFS + int + no buffer space available +
  • +
  • ENODEV + int + operation not supported by device +
  • +
  • ENOENT + int + no such file or directory +
  • +
  • ENOEXEC + int + exec format error +
  • +
  • ENOLCK + int + no locks available +
  • +
  • ENOMEM + int + cannot allocate memory +
  • +
  • ENOMSG + int + no message of desired type +
  • +
  • ENOPROTOOPT + int + protocol not available +
  • +
  • ENOSPC + int + no space left on device +
  • +
  • ENOSYS + int + function not implemented +
  • +
  • ENOTCONN + int + socket is not connected +
  • +
  • ENOTDIR + int + not a directory +
  • +
  • ENOTEMPTY + int + directory not empty +
  • +
  • ENOTSOCK + int + socket operation on non-socket +
  • +
  • ENOTSUP + int + operation not supported +
  • +
  • ENOTTY + int + inappropriate ioctl for device +
  • +
  • ENXIO + int + device not configured +
  • +
  • EOPNOTSUPP + int + operation not supported on socket +
  • +
  • EOVERFLOW + int + value too large to be stored in data type +
  • +
  • EPERM + int + operation not permitted +
  • +
  • EPIPE + int + broken pipe +
  • +
  • EPROTO + int + protocol error +
  • +
  • EPROTONOSUPPORT + int + protocol not supported +
  • +
  • EPROTOTYPE + int + protocol wrong type for socket +
  • +
  • ERANGE + int + result too large +
  • +
  • EROFS + int + read-only file system +
  • +
  • ESPIPE + int + illegal seek +
  • +
  • ESRCH + int + no such process +
  • +
  • ETIMEDOUT + int + operation timed out +
  • +
  • ETXTBSY + int + text file busy +
  • +
  • EWOULDBLOCK + int + operation would block +
  • +
  • EXDEV + int + cross-device link +
  • +
+ + + + +

Usage:

+
    +
    +  -- Print errno constants supported on this host.
    +  for name, value in pairs (require "posix.errno") do
    +    if type (value) == "number" then
    +      print (name, value)
    +    end
    +  end
    +
+ +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.fcntl.html b/doc/modules/posix.fcntl.html new file mode 100644 index 0000000..5fa6aee --- /dev/null +++ b/doc/modules/posix.fcntl.html @@ -0,0 +1,530 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.fcntl

+

File Control.

+

Low-level control over file descriptors, including creating new file + descriptors with open.

+ + +

Functions

+ + + + + + + + + + + + + +
fcntl (fd, cmd[, arg=0])Manipulate file descriptor.
open (path, oflags[, mode=511])Open a file.
posix_fadvise (fd, offset, len, advice)Instruct kernel on appropriate cache behaviour for a file or file segment.
+

Constants

+ + + + + +
posix.fcntlFcntl constants.
+

Tables

+ + + + + +
flockAdvisory file locks.
+ +
+
+ + +

Functions

+ +
+
+ + fcntl (fd, cmd[, arg=0]) +
+
+ Manipulate file descriptor. + + +

Parameters:

+
    +
  • fd + int + file descriptor to act on +
  • +
  • cmd + int + operation to perform +
  • +
  • arg + int or flock + when cmd is F_GETLK, F_SETLK or F_SETLKW, + then arg is a flock table, otherwise an integer with meaning dependent + upon the value of cmd. + (default 0) +
  • +
+ +

Returns:

+
    + + integer return value depending on cmd, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    local flag = P.fcntl (fd, P.F_GETFL)
    +
+ +
+
+ + open (path, oflags[, mode=511]) +
+
+ Open a file. + + +

Parameters:

+
    +
  • path + string + + + +
  • +
  • oflags + int + bitwise OR of zero or more of O_RDONLY, O_WRONLY, O_RDWR, + O_APPEND, O_CREAT, O_DSYNC, O_EXCL, O_NOCTTY, O_NONBLOCK, + O_RSYNC, O_SYNC, O_TRUNC +
  • +
  • mode + int + access modes used by O_CREAT + (default 511) +
  • +
+ +

Returns:

+
    + + int + file descriptor for path, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    fd = P.open ("data", bit.bor (P.O_CREAT, P.O_RDWR), bit.bor (P.S_IRWXU, P.S_IRGRP))
    +
+ +
+
+ + posix_fadvise (fd, offset, len, advice) +
+
+ Instruct kernel on appropriate cache behaviour for a file or file segment. + + +

Parameters:

+
    +
  • fd + int + open file descriptor +
  • +
  • offset + int + start of region +
  • +
  • len + int + number of bytes in region +
  • +
  • advice + int + one of POSIX_FADV_NORMAL, POSIX_FADV_SEQUENTIAL, + POSIX_FADV_RANDOM, POSIX_FADV_NOREUSE, POSIX_FADV_WILLNEED or + POSIX_FADV_DONTNEED +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+

Constants

+ + +
+
+ + posix.fcntl +
+
+ Fcntl constants. +Any constants not available in the underlying system will be nil valued. + + +

Fields:

+
    +
  • F_DUPFD + int + duplicate file descriptor +
  • +
  • F_GETFD + int + get file descriptor flags +
  • +
  • F_SETFD + int + set file descriptor flags +
  • +
  • F_GETFL + int + get file status flags +
  • +
  • F_SETFL + int + set file status flags +
  • +
  • F_GETLK + int + get record locking information +
  • +
  • F_SETLK + int + set record locking information +
  • +
  • F_SETLKW + int + set lock, and wait if blocked +
  • +
  • F_GETOWN + int + get SIGIO/SIGURG process owner +
  • +
  • F_SETOWN + int + set SIGIO/SIGURG process owner +
  • +
  • F_RDLCK + int + shared or read lock +
  • +
  • F_WRLCK + int + exclusive or write lock +
  • +
  • F_UNLCK + int + unlock +
  • +
  • O_RDONLY + int + open for reading only +
  • +
  • O_WRONLY + int + open for writing only +
  • +
  • O_RDWR + int + open for reading and writing +
  • +
  • O_APPEND + int + set append mode +
  • +
  • O_CREAT + int + create if nonexistent +
  • +
  • O_DSYNC + int + synchronise io data integrity +
  • +
  • O_EXCL + int + error if file already exists +
  • +
  • O_NOCTTY + int + don't assign controlling terminal +
  • +
  • O_NONBLOCK + int + no delay +
  • +
  • O_RSYNC + int + synchronise file read integrity +
  • +
  • O_SYNC + int + synchronise file write integrity +
  • +
  • O_TRUNC + int + truncate to zero length +
  • +
  • POSIX_FADV_NORMAL + int + no advice +
  • +
  • POSIX_FADV_SEQUENTIAL + int + expecting to access data sequentially +
  • +
  • POSIX_FADV_RANDOM + int + expecting to access data randomly +
  • +
  • POSIX_FADV_NOREUSE + int + expecting to access data once only +
  • +
  • POSIX_FADV_WILLNEED + int + expecting to access data in the near future +
  • +
  • POSIX_FADV_DONTNEED + int + not expecting to access the data in the near future +
  • +
+ + + + +

Usage:

+
    +
    +  -- Print fcntl constants supported on this host.
    +  for name, value in pairs (require "posix.fcntl") do
    +    if type (value) == "number" then
    +      print (name, value)
    +     end
    +  end
    +
+ +
+
+

Tables

+ + +
+
+ + flock +
+
+ Advisory file locks. +Passed as arg to fcntl when cmd is F_GETLK, F_SETLK or F_SETLKW. + + +

Fields:

+
    +
  • l_start + int + starting offset +
  • +
  • l_len + int + len = 0 means until end of file +
  • +
  • l_pid + int + lock owner +
  • +
  • l_type + int + lock type +
  • +
  • l_whence + int + one of SEEK_SET, SEEK_CUR or SEEK_END +
  • +
+ + + + + +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.fnmatch.html b/doc/modules/posix.fnmatch.html new file mode 100644 index 0000000..922148c --- /dev/null +++ b/doc/modules/posix.fnmatch.html @@ -0,0 +1,243 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.fnmatch

+

Filename matching.

+

Functions and constants for matching known filenames against shell-style + pattern strings.

+ + +

Functions

+ + + + + +
fnmatch (pat, name[, flags=0])Match a filename against a shell pattern.
+

Constants

+ + + + + +
posix.fnmatchFnmatch constants.
+ +
+
+ + +

Functions

+ +
+
+ + fnmatch (pat, name[, flags=0]) +
+
+ Match a filename against a shell pattern. + + +

Parameters:

+
    +
  • pat + string + shell pattern +
  • +
  • name + string + filename +
  • +
  • flags + int + optional + (default 0) +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    + + int + FNM_NOMATCH +
+

Or

+
    + + int + some other non-zero integer if fnmatch itself failed +
+ + +

See also:

+ + + +
+
+

Constants

+ + +
+
+ + posix.fnmatch +
+
+ Fnmatch constants. +Any constants not available in the underlying system will be nil valued. + + +

Fields:

+
    +
  • FNM_PATHNAME + int + slashes in pathname must be matched by slash in pattern +
  • +
  • FNM_NOESCAPE + int + disable backslash escaping +
  • +
  • FNM_NOMATCH + int + match failed +
  • +
  • FNM_PERIOD + int + periods in pathname must be matched by period in pattern +
  • +
+ + + + +

Usage:

+
    +
    +  -- Print fnmatch constants supported on this host.
    +  for name, value in pairs (require "posix.fnmatch") do
    +    if type (value) == "number" then
    +      print (name, value)
    +     end
    +  end
    +
+ +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.getopt.html b/doc/modules/posix.getopt.html new file mode 100644 index 0000000..d70edf5 --- /dev/null +++ b/doc/modules/posix.getopt.html @@ -0,0 +1,196 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.getopt

+

Command Line Argument Processing.

+

+ +

+ + +

Functions

+ + + + + +
getopt (arg, shortopts[, longopts[, opterr=0[, optind=1]]])Parse command-line options.
+ +
+
+ + +

Functions

+ +
+
+ + getopt (arg, shortopts[, longopts[, opterr=0[, optind=1]]]) +
+
+ Parse command-line options. + + +

Parameters:

+
    +
  • arg + command line arguments +
  • +
  • shortopts + string + short option specifier +
  • +
  • longopts + table + long options table + (optional) +
  • +
  • opterr + int + index of the option with an error + (default 0) +
  • +
  • optind + int + index of the next unprocessed option + (default 1) +
  • +
+ +

Returns:

+
    + + option iterator, returning 4 values +
+ + +

See also:

+ + +

Usage:

+
    +
    +local longopts = {
    +  {"help", "none", 1},
    +  {"version", "none", 3},
    +}
    +for r, longindex, err, i in P.getopt (arg, "ho:v", longopts, err, i) do
    +  process (arg, err, i)
    +end
    +
+ +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.glob.html b/doc/modules/posix.glob.html new file mode 100644 index 0000000..83aa410 --- /dev/null +++ b/doc/modules/posix.glob.html @@ -0,0 +1,167 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.glob

+

Generate pathnames matching a shell-style pattern.

+

Functions generating a table of filenames that match a shell-style + pattern string.

+ + +

Functions

+ + + + + +
glob ([pat="*"])Find all files in this directory matching a shell pattern.
+ +
+
+ + +

Functions

+ +
+
+ + glob ([pat="*"]) +
+
+ Find all files in this directory matching a shell pattern. + + +

Parameters:

+
    +
  • pat + string + shell glob pattern + (default "*") +
  • +
+ +

Returns:

+
    + + table + matching filenames +
+ + +

See also:

+ + + +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.grp.html b/doc/modules/posix.grp.html new file mode 100644 index 0000000..8a74e04 --- /dev/null +++ b/doc/modules/posix.grp.html @@ -0,0 +1,322 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.grp

+

Group Database Operations.

+

Query the system group database.

+ + +

Functions

+ + + + + + + + + + + + + + + + + + + + + +
endgrent ()Release group database resources.
getgrent ()Fetch next group.
getgrgid (gid)Fetch group with given group id.
getgrnam (name)Fetch named group.
setgrent ()Rewind next getgrent back to start of database.
+

Tables

+ + + + + +
PosixGroupGroup record.
+ +
+
+ + +

Functions

+ +
+
+ + endgrent () +
+
+ Release group database resources. + + + + + +

See also:

+ + + +
+
+ + getgrent () +
+
+ Fetch next group. + + + +

Returns:

+
    + + PosixGroup + next group record +
+ + +

See also:

+ + +

Usage:

+
    +
    +  t = P.getgrent ()
    +  while t ~= nil do
    +    process (t)
    +    t = P.getgrent ()
    +  end
    +  P.endgrent ()
    +
+ +
+
+ + getgrgid (gid) +
+
+ Fetch group with given group id. + + +

Parameters:

+
    +
  • gid + int + group id +
  • +
+ +

Returns:

+
    + + PosixGroup + group record for gid +
+ + + +

Usage:

+
    +
    t = P.getgrgid (0)
    +
+ +
+
+ + getgrnam (name) +
+
+ Fetch named group. + + +

Parameters:

+
    +
  • name + string + group name +
  • +
+ +

Returns:

+
    + + PosixGroup + group record for name +
+ + + +

Usage:

+
    +
    t = P.getgrnam "wheel"
    +
+ +
+
+ + setgrent () +
+
+ Rewind next getgrent back to start of database. + + + + + +

See also:

+ + + +
+
+

Tables

+ +
+
+ + PosixGroup +
+
+ Group record. + + +

Fields:

+
    +
  • gr_mem + list + a list of group members +
  • +
  • gr_name + string + name of group +
  • +
  • gr_gid + int + unique group id +
  • +
+ + + + + +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.html b/doc/modules/posix.html new file mode 100644 index 0000000..df8ac46 --- /dev/null +++ b/doc/modules/posix.html @@ -0,0 +1,846 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix

+

Lua POSIX bindings.

+

In addition to the convenience functions documented in this module, all + APIs from submodules are copied into the return table for convenience and + backwards compatibility.

+ + +

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
chmod (path, mode)Change the mode of the path.
creat (path, mode)Create a file.
euidaccess (file, mode)Check permissions like posix.unistd.access, but for euid.
execx (task, ...)Exec a command or Lua function.
mkdir (path)Make a directory.
mkfifo (path)Make a FIFO pipe.
msgget (key[, flags=0[, mode="rw-rw-rw-"]])Get a message queue identifier
open (path, oflags, modestr)Open a file.
pclose (pfd)Close a pipeline opened with popen or popen_pipeline.
popen (as, mode[, pipe_fn])Run a commands or Lua function in a sub-process.
popen_pipeline (t, mode[, pipe_fn])Perform a series of commands and Lua functions as a pipeline.
setlogmask (...)Set log priority mask
spawn (task, ...)Run a command or function in a sub-process using P.execx.
timeradd (x, y)Add one gettimeofday() returned timeval to another.
timercmp (x, y)Compare one gettimeofday() returned timeval with another
timersub (x, y)Subtract one gettimeofday() returned timeval from another.
umask ([mode])Set file mode creation mask.
+ +
+
+ + +

Functions

+ +
+
+ + chmod (path, mode) +
+
+ Change the mode of the path. + + +

Parameters:

+
    +
  • path + string + existing file path +
  • +
  • mode + string + +

    one of the following formats:

    + +
      +
    • "rwxrwxrwx" (e.g. "rw-rw-r--")
    • +
    • "ugo+-=rwx" (e.g. "u+w")
    • +
    • +-=rwx" (e.g. "+w")
    • +
    + + +
  • +
+ +

Returns:

+
    + + int 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    P.chmod ('bin/dof', '+x')
    +
+ +
+
+ + creat (path, mode) +
+
+ Create a file. + This function is obsoleted by posix.fcntl.open with posix.O_CREAT. + + +

Parameters:

+
    +
  • path + string + name of file to create +
  • +
  • mode + string + permissions with which to create file +
  • +
+ +

Returns:

+
    + + int + file descriptor of file at path, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    fd = P.creat ("data", "rw-r-----")
    +
+ +
+
+ + euidaccess (file, mode) +
+
+ Check permissions like posix.unistd.access, but for euid. + Based on the glibc function of the same name. Does not always check + for read-only file system, text busy, etc., and does not work with + ACLs &c. + + +

Parameters:

+
    +
  • file + string + file to check +
  • +
  • mode + string + checks to perform (as for access) +
  • +
+ +

Returns:

+
    + + 0 if access allowed; nil otherwise (and errno is set) +
+ + + + +
+
+ + execx (task, ...) +
+
+ Exec a command or Lua function. + + +

Parameters:

+
    +
  • task + , a string to be executed as a shell command, or a + table of arguments to P.execp or a Lua function, which should read + from standard input, write to standard output, and return an exit code +
  • +
  • ... + string + positional arguments to the program or function +
  • +
+ +

Returns:

+
    +
  1. + nil + on error (normally does not return)
  2. +
  3. + string + error message
  4. +
+ + + + +
+
+ + mkdir (path) +
+
+ Make a directory. + + +

Parameters:

+
    +
  • path + string + location in file system to create directory +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + + + +
+
+ + mkfifo (path) +
+
+ Make a FIFO pipe. + + +

Parameters:

+
    +
  • path + string + location in file system to create fifo +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + + + +
+
+ + msgget (key[, flags=0[, mode="rw-rw-rw-"]]) +
+
+ Get a message queue identifier + + +

Parameters:

+
    +
  • key + int + message queue id, or IPC_PRIVATE for a new queue +
  • +
  • flags + int + bitwise OR of zero or more from IPC_CREAT and IPC_EXCL + (default 0) +
  • +
  • mode + string + execute bits are ignored + (default "rw-rw-rw-") +
  • +
+ +

Returns:

+
    + + int + message queue identifier, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + open (path, oflags, modestr) +
+
+ Open a file. + + +

Parameters:

+
    +
  • path + string + file to act on +
  • +
  • oflags + int + bitwise OR of zero or more of O_RDONLY, O_WRONLY, O_RDWR, + O_APPEND, O_CREAT, O_DSYNC, O_EXCL, O_NOCTTY, O_NONBLOCK, + O_RSYNC, O_SYNC, O_TRUNC +
  • +
  • modestr + string + (used with O_CREAT; see chmod for format) +
  • +
+ +

Returns:

+
    + + int + file descriptor for path, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    fd = P.open ("data", bit.bor (P.O_CREAT, P.O_RDWR), "rw-r-----")
    +
+ +
+
+ + pclose (pfd) +
+
+ Close a pipeline opened with popen or popen_pipeline. + + +

Parameters:

+
    +
  • pfd + table + pipeline object +
  • +
+ +

Returns:

+
    + + values as for P.wait, for the last (or only) stage of the pipeline +
+ + + + +
+
+ + popen (as, mode[, pipe_fn]) +
+
+ Run a commands or Lua function in a sub-process. + + +

Parameters:

+
    +
  • as + task, + for execx +
  • +
  • mode + string + "r" for read or "w" for write +
  • +
  • pipe_fn + func + function returning a paired read and + write file descriptor (default posix.unistd.pipe) + (optional) +
  • +
+ +

Returns:

+
    + + pfd + pipeline object +
+ + + + +
+
+ + popen_pipeline (t, mode[, pipe_fn]) +
+
+ Perform a series of commands and Lua functions as a pipeline. + + +

Parameters:

+
    +
  • t + table + tasks for execx +
  • +
  • mode + string + "r" for read or "w" for write +
  • +
  • pipe_fn + func + function returning a paired read and + write file descriptor (default posix.unistd.pipe) + (optional) +
  • +
+ +

Returns:

+
    + + pfd + pipeline object +
+ + + + +
+
+ + setlogmask (...) +
+
+ Set log priority mask + + +

Parameters:

+
    +
  • ... + int + zero or more of LOG_EMERG, LOG_ALERT, LOG_CRIT, + LOG_WARNING, LOG_NOTICE, LOG_INFO and LOG_DEBUG +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + + + +
+
+ + spawn (task, ...) +
+
+ Run a command or function in a sub-process using P.execx. + + +

Parameters:

+
    +
  • task + , as for P.execx. +
  • +
  • ... + string + as for P.execx +
  • +
+ +

Returns:

+
    + + values as for P.wait +
+ + + + +
+
+ + timeradd (x, y) +
+
+ Add one gettimeofday() returned timeval to another. + + +

Parameters:

+
    +
  • x + a timeval +
  • +
  • y + another timeval +
  • +
+ +

Returns:

+
    + + x + y, adjusted for usec overflow +
+ + + + +
+
+ + timercmp (x, y) +
+
+ Compare one gettimeofday() returned timeval with another + + +

Parameters:

+
    +
  • x + a timeval +
  • +
  • y + another timeval +
  • +
+ +

Returns:

+
    + + 0 if x and y are equal, >0 if x is newer, <0 if y is newer +
+ + + + +
+
+ + timersub (x, y) +
+
+ Subtract one gettimeofday() returned timeval from another. + + +

Parameters:

+
    +
  • x + a timeval +
  • +
  • y + another timeval +
  • +
+ +

Returns:

+
    + + x - y, adjusted for usec underflow +
+ + + + +
+
+ + umask ([mode]) +
+
+ Set file mode creation mask. + + +

Parameters:

+
    +
  • mode + string + file creation mask string + (optional) +
  • +
+ +

Returns:

+
    + + string + previous umask +
+ + +

See also:

+ + + +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.libgen.html b/doc/modules/posix.libgen.html new file mode 100644 index 0000000..4b0c7ed --- /dev/null +++ b/doc/modules/posix.libgen.html @@ -0,0 +1,199 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.libgen

+

General Library.

+

Functions for separating a pathname into file and directory components.

+ + +

Functions

+ + + + + + + + + +
basename (path)File part of path.
dirname (path)Directory name of path.
+ +
+
+ + +

Functions

+ +
+
+ + basename (path) +
+
+ File part of path. + + +

Parameters:

+
    +
  • path + string + file to act on +
  • +
+ +

Returns:

+
    + + string + filename part of path +
+ + +

See also:

+ + + +
+
+ + dirname (path) +
+
+ Directory name of path. + + +

Parameters:

+
    +
  • path + string + file to act on +
  • +
+ +

Returns:

+
    + + string + directory part of path +
+ + +

See also:

+ + + +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.poll.html b/doc/modules/posix.poll.html new file mode 100644 index 0000000..b3513cd --- /dev/null +++ b/doc/modules/posix.poll.html @@ -0,0 +1,249 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.poll

+

Synchronous I/O Multiplexing.

+

Examine file descriptors for events, such as readyness for I/O.

+ + +

Functions

+ + + + + + + + + +
poll (fds[, timeout=-1])Wait for events on multiple file descriptors.
rpoll (fd[, timeout=-1])Wait for some event on a file descriptor.
+ +
+
+ + +

Functions

+ +
+
+ + poll (fds[, timeout=-1]) +
+
+ Wait for events on multiple file descriptors. + + +

Parameters:

+
    +
  • fds + table + list of file descriptors +
  • +
  • timeout + int + maximum timeout in milliseconds, or -1 to block indefinitely + (default -1) +
  • +
+ +

Returns:

+
    + + int + 0 if timed out, 1 if fd is ready +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + rpoll (fd[, timeout=-1]) +
+
+ Wait for some event on a file descriptor. +Based on http://lua-users.org/lists/lua-l/2007-11/msg00346.html. + + +

Parameters:

+
    +
  • fd + int + file descriptor +
  • +
  • timeout + int + maximum timeout in milliseconds, or -1 to block indefinitely + (default -1) +
  • +
+ +

Returns:

+
    + + int + 0 if timed out, 1 if fd is ready +
+

Or

+
    +
  1. + nil
  2. +
  3. + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+
    + +
+ +

Usage:

+
    +
    +fh = io.open "one"
    +while true do
    +  r = rpoll (fh, 500)
    +  if r == 0 then
    +    print 'timeout'
    +  elseif r == 1 then
    +    print (fh:read ())
    +  else
    +    print "finish!"
    +    break
    +  end
    +end
    +
+ +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.pwd.html b/doc/modules/posix.pwd.html new file mode 100644 index 0000000..7fe103c --- /dev/null +++ b/doc/modules/posix.pwd.html @@ -0,0 +1,330 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.pwd

+

Password Database Operations.

+

Query the system password database.

+ + +

Functions

+ + + + + + + + + + + + + + + + + + + + + +
endpwent ()Release password database resources.
getpwent ()Fetch next password entry.
getpwnam (name)Fetch named user.
getpwuid (uid)Fetch password entry with given user id.
setpwent ()Rewind next getpwent back to start of database.
+

Tables

+ + + + + +
PosixPasswdPassword record.
+ +
+
+ + +

Functions

+ +
+
+ + endpwent () +
+
+ Release password database resources. + + + + + +

See also:

+ + + +
+
+ + getpwent () +
+
+ Fetch next password entry. + + + +

Returns:

+
    + + PosixPasswd + next password record +
+ + +

See also:

+ + +

Usage:

+
    +
    +  t = P.getpwent ()
    +  while t ~= nil do
    +    process (t)
    +    t = P.getpwent ()
    +  end
    +  P.endpwent ()
    +
+ +
+
+ + getpwnam (name) +
+
+ Fetch named user. + + +

Parameters:

+
    +
  • name + string + user name +
  • +
+ +

Returns:

+
    + + PosixPasswd + passwd record for name +
+ + + +

Usage:

+
    +
    t = P.getpwnam "root"
    +
+ +
+
+ + getpwuid (uid) +
+
+ Fetch password entry with given user id. + + +

Parameters:

+
    +
  • uid + int + user id +
  • +
+ +

Returns:

+
    + + PosixPasswd + passwd record for uid +
+ + + +

Usage:

+
    +
    t = P.getpwuid (0)
    +
+ +
+
+ + setpwent () +
+
+ Rewind next getpwent back to start of database. + + + + + +

See also:

+ + + +
+
+

Tables

+ +
+
+ + PosixPasswd +
+
+ Password record. + + +

Fields:

+
    +
  • pw_name + string + user's login name +
  • +
  • pw_uid + int + unique user id +
  • +
  • pw_gid + int + user's default group id +
  • +
  • pw_dir + string + initial working directory +
  • +
  • pw_shell + string + user's login shell path +
  • +
+ + + + + +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.sched.html b/doc/modules/posix.sched.html new file mode 100644 index 0000000..ee3e564 --- /dev/null +++ b/doc/modules/posix.sched.html @@ -0,0 +1,292 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.sched

+

Kernel Thread Scheduling Priority.

+

Where supported by the underlying system, functions to discover and + change the kernel thread scheduling priority. If the module loads + successfully, but there is no kernel support, then posix.sched.version + will be set, but the unsupported APIs will be nil.

+ + +

Functions

+ + + + + + + + + +
sched_getscheduler ([pid=0])get scheduling policy
sched_setscheduler ([pid=0[, policy=`SCHED_OTHER`[, priority=0]]])set scheduling policy/priority
+

Constants

+ + + + + +
posix.schedScheduler constants.
+ +
+
+ + +

Functions

+ +
+
+ + sched_getscheduler ([pid=0]) +
+
+ get scheduling policy + + +

Parameters:

+
    +
  • pid + int + process to act on, or 0 for caller process + (default 0) +
  • +
+ +

Returns:

+
    + + int + scheduling policy SCHED_FIFO, SCHED_RR, SCHED_OTHER, + if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + sched_setscheduler ([pid=0[, policy=`SCHED_OTHER`[, priority=0]]]) +
+
+ set scheduling policy/priority + + +

Parameters:

+
    +
  • pid + int + process to act on, or 0 for caller process + (default 0) +
  • +
  • policy + int + one of SCHED_FIFO, SCHED_RR or + SCHED_OTHER + (default `SCHED_OTHER`) +
  • +
  • priority + int + must be 0 for SCHED_OTHER, or else a positive + number below 100 for real-time policies + (default 0) +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+

Constants

+ + +
+
+ + posix.sched +
+
+ Scheduler constants. +Any constants not available in the underlying system will be nil valued. + + +

Fields:

+
    +
  • SCHED_FIFO + int + first-in, first-out scheduling policy +
  • +
  • SCHED_RR + int + round-robin scheduling policy +
  • +
  • SCHED_OTHER + int + another scheduling policy +
  • +
+ + + + +

Usage:

+
    +
    +  -- Print scheduler constants supported on this host.
    +  for name, value in pairs (require "posix.sched") do
    +    if type (value) == "number" then
    +      print (name, value)
    +     end
    +  end
    +
+ +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.signal.html b/doc/modules/posix.signal.html new file mode 100644 index 0000000..8428f25 --- /dev/null +++ b/doc/modules/posix.signal.html @@ -0,0 +1,488 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.signal

+

Software Signal Facilities.

+

Constants and functions for propagating signals among processes.

+ +

Note that posix.signal.signal is implemented with sigaction(2) for + consistent semantics across platforms.

+ + +

Functions

+ + + + + + + + + + + + + + + + + +
kill (pid, opt)Send a signal to the given process.
killpg (pgrp[, sig=`SIGTERM`])Send a signal to the given process group.
raise (sig)Raise a signal on this process.
signal (signum[, handler=SIG_DFL[, flags]])Install a signal handler for this signal number.
+

Constants

+ + + + + +
posix.signalSignal constants.
+ +
+
+ + +

Functions

+ +
+
+ + kill (pid, opt) +
+
+ Send a signal to the given process. + + +

Parameters:

+
    +
  • pid + int + process to act on +
  • +
  • opt + int + =SIGTERM sig signal to send +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + killpg (pgrp[, sig=`SIGTERM`]) +
+
+ Send a signal to the given process group. + + +

Parameters:

+
    +
  • pgrp + int + group id to act on, or 0 for the sending process`s group +
  • +
  • sig + int + signal to send + (default `SIGTERM`) +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + raise (sig) +
+
+ Raise a signal on this process. + + +

Parameters:

+
    +
  • sig + int + signal to send +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + signal (signum[, handler=SIG_DFL[, flags]]) +
+
+ Install a signal handler for this signal number. +Although this is the same API as signal(2), it uses sigaction for guaranteed semantics. + + +

Parameters:

+
    +
  • signum + int + + + +
  • +
  • handler + function + function, or SIG_IGN or SIG_DFL constants + (default SIG_DFL) +
  • +
  • flags + the sa_flags element of struct sigaction + (optional) +
  • +
+ +

Returns:

+
    + + function + previous handler function +
+ + +

See also:

+ + + +
+
+

Constants

+ + +
+
+ + posix.signal +
+
+ Signal constants. +Any constants not available in the underlying system will be nil valued. + + +

Fields:

+
    +
  • SIGABRT + int + abort () +
  • +
  • SIGALRM + int + alarm clock +
  • +
  • SIGBUS + int + bus error +
  • +
  • SIGCHLD + int + to parent on child stop or exit +
  • +
  • SIGCONT + int + continue a stopped process +
  • +
  • SIGFPE + int + floating point error +
  • +
  • SIGHUP + int + hangup +
  • +
  • SIGILL + int + illegal instruction +
  • +
  • SIGINT + int + interrupt +
  • +
  • SIGKILL + int + kill +
  • +
  • SIGPIPE + int + write on pipe with no reader +
  • +
  • SIGQUIT + int + quit +
  • +
  • SIGSEGV + int + segmentation violation +
  • +
  • SIGSTOP + int + stop +
  • +
  • SIGTERM + int + terminate +
  • +
  • SIGTSTP + int + stop signal from tty +
  • +
  • SIGTTIN + int + to readers process group on background tty read +
  • +
  • SIGTTOU + int + to readers process group on background tty output +
  • +
  • SIGUSR1 + int + user defined +
  • +
  • SIGUSR2 + int + user defined +
  • +
  • SIGSYS + int + bad argument to system call +
  • +
  • SIGTRAP + int + trace trap +
  • +
  • SIGURG + int + urgent condition on i/o channel +
  • +
  • SIGVTALRM + int + virtual time alarm +
  • +
  • SIGXCPU + int + exceeded cpu time limit +
  • +
  • SIGXFSZ + int + exceeded file size limit +
  • +
  • SA_NOCLDSTOP + int + do not generate a SIGCHLD on child stop +
  • +
  • SA_NOCLDWAIT + int + don't keep zombies child processes +
  • +
  • SA_RESETHAND + int + reset to SIG_DFL when taking a signal +
  • +
  • SA_NODEFER + int + don't mask the signal we're delivering +
  • +
+ + + + +

Usage:

+
    +
    +  -- Print signal constants supported on this host.
    +  for name, value in pairs (require "posix.signal") do
    +    if type (value) == "number" then
    +      print (name, value)
    +     end
    +  end
    +
+ +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.stdio.html b/doc/modules/posix.stdio.html new file mode 100644 index 0000000..f207da9 --- /dev/null +++ b/doc/modules/posix.stdio.html @@ -0,0 +1,320 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.stdio

+

A few Standard I/O functions not already in Lua core.

+

+ +

+ + +

Functions

+ + + + + + + + + + + + + +
ctermid ()Name of controlling terminal.
fdopen (fd)Create a Lua file object from a file descriptor.
fileno (file)File descriptor corresponding to a Lua file object.
+

Constants

+ + + + + +
posix.stdioStdio constants.
+ +
+
+ + +

Functions

+ +
+
+ + ctermid () +
+
+ Name of controlling terminal. + + + +

Returns:

+
    + + string + controlling terminal for current process +
+ + +

See also:

+ + + +
+
+ + fdopen (fd) +
+
+ Create a Lua file object from a file descriptor. + + +

Parameters:

+
    +
  • fd + int + file descriptor +
  • +
+ +

Returns:

+
    + + file + file Lua file object fd, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + + +

Usage:

+
    +
    stdout = P.fdopen (posix.STDOUT_FILENO)
    +
+ +
+
+ + fileno (file) +
+
+ File descriptor corresponding to a Lua file object. + + +

Parameters:

+
    +
  • file + file + Lua file object +
  • +
+ +

Returns:

+
    + + int + file descriptor for file, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + + +

Usage:

+
    +
    STDOUT_FILENO = P.fileno (io.stdout)
    +
+ +
+
+

Constants

+ + +
+
+ + posix.stdio +
+
+ Stdio constants. +Any constants not available in the underlying system will be nil valued. + + +

Fields:

+
    +
  • _IOFBF + int + fully buffered +
  • +
  • _IOLBF + int + line buffered +
  • +
  • _IONBF + int + unbuffered +
  • +
  • BUFSIZ + int + size of buffer +
  • +
  • EOF + int + end of file +
  • +
  • FOPEN_MAX + int + maximum number of open files +
  • +
  • FILENAME_MAX + int + maximum length of filename +
  • +
+ + + + +

Usage:

+
    +
    +  -- Print stdio constants supported on this host.
    +  for name, value in pairs (require "posix.stdio") do
    +    if type (value) == "number" then
    +      print (name, value)
    +     end
    +  end
    +
+ +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.stdlib.html b/doc/modules/posix.stdlib.html new file mode 100644 index 0000000..a61f6ef --- /dev/null +++ b/doc/modules/posix.stdlib.html @@ -0,0 +1,588 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.stdlib

+

Standard Posix Library functions.

+

+ +

+ + +

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
abort ()Abort the program immediately.
getenv ([name])Get value of environment variable, or all variables.
grantpt (fd)Grant access to a slave pseudoterminal
mkdtemp (templ)Create a unique temporary directory.
mkstemp (templ)Create a unique temporary file.
openpt (oflags)Open a pseudoterminal.
ptsname (fd)Get the name of a slave pseudo-terminal
realpath (path)Find canonicalized absolute pathname.
setenv (name[, value[, overwrite]])Set an environment variable for this process.
unlockpt (fd)Unlock a pseudoterminal master/slave pair
+ +
+
+ + +

Functions

+ +
+
+ + abort () +
+
+ Abort the program immediately. + + + + + +

See also:

+ + + +
+
+ + getenv ([name]) +
+
+ Get value of environment variable, or all variables. + + +

Parameters:

+
    +
  • name + string + if nil, get all + (optional) +
  • +
+ +

Returns:

+
    + + value if name given, otherwise a name-indexed table of values. +
+ + +

See also:

+ + +

Usage:

+
    +
    for a,b in pairs(posix.getenv()) do print(a, b) end
    +
+ +
+
+ + grantpt (fd) +
+
+ Grant access to a slave pseudoterminal + + +

Parameters:

+
    +
  • fd + int + descriptor returned by openpt +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + mkdtemp (templ) +
+
+ Create a unique temporary directory. + + +

Parameters:

+
    +
  • templ + string + pattern that ends in six 'X' characters +
  • +
+ +

Returns:

+
    + + string + path to directory, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + mkstemp (templ) +
+
+ Create a unique temporary file. + + +

Parameters:

+
    +
  • templ + string + pattern that ends in six 'X' characters +
  • +
+ +

Returns:

+
    + + int + open file descriptor +
+

Or

+
    +
  1. + string + path to file, if successful
  2. +
  3. + nil
  4. +
  5. + string + error message
  6. +
  7. + int + errnum
  8. +
+ + +

See also:

+ + +

Usage:

+
    +
    P.mkstemp 'wooXXXXXX'
    +
+ +
+
+ + openpt (oflags) +
+
+ Open a pseudoterminal. + + +

Parameters:

+
    +
  • oflags + int + bitwise OR of zero or more of O_RDWR and O_NOCTTY +
  • +
+ +

Returns:

+
    + + file descriptor of pseudoterminal, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + ptsname (fd) +
+
+ Get the name of a slave pseudo-terminal + + +

Parameters:

+
    +
  • fd + int + descriptor returned by openpt +
  • +
+ +

Returns:

+
    + + path name of the slave terminal device, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + realpath (path) +
+
+ Find canonicalized absolute pathname. + + +

Parameters:

+
    +
  • path + string + file to act on +
  • +
+ +

Returns:

+
    + + string + canonicalized absolute path, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error messag
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + setenv (name[, value[, overwrite]]) +
+
+ Set an environment variable for this process. +(Child processes will inherit this) + + +

Parameters:

+
    +
  • name + string + + + +
  • +
  • value + string + (maybe nil, meaning 'unset') + (optional) +
  • +
  • overwrite + non-nil prevents overwriting a variable + (optional) +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + unlockpt (fd) +
+
+ Unlock a pseudoterminal master/slave pair + + +

Parameters:

+
    +
  • fd + int + descriptor returned by openpt +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.sys.msg.html b/doc/modules/posix.sys.msg.html new file mode 100644 index 0000000..d30bec4 --- /dev/null +++ b/doc/modules/posix.sys.msg.html @@ -0,0 +1,372 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.sys.msg

+

Sys V Message Queue Operations.

+

Where supported by the underlying system, functions to send and receive + interprocess messages. If the module loads successfully, but there is + no system support, then posix.sys.msg.version will be set, but the + unsupported APIs wil be nil.

+ + +

Functions

+ + + + + + + + + + + + + +
msgget (key[, flags=0])Get a message queue identifier
msgrcv (id, size, type[, flags=0])Receive message from a message queue
msgsnd (id, type, message[, flags=0])Send message to a message queue
+

Constants

+ + + + + +
posix.sys.msgMessage constants.
+ +
+
+ + +

Functions

+ +
+
+ + msgget (key[, flags=0]) +
+
+ Get a message queue identifier + + +

Parameters:

+
    +
  • key + int + message queue id, or IPC_PRIVATE for a new queue +
  • +
  • flags + int + bitwise OR of zero or more from IPC_CREAT and IPC_EXCL, + and access permissions S_IRUSR, S_IWUSR, S_IRGRP, S_IWGRP, S_IROTH + and S_IWOTH (from posix.sys.stat) + (default 0) +
  • +
+ +

Returns:

+
    + + int + message queue identifier, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + msgrcv (id, size, type[, flags=0]) +
+
+ Receive message from a message queue + + +

Parameters:

+
    +
  • id + int + message queue identifier returned by msgget +
  • +
  • size + int + maximum message size +
  • +
  • type + int + message type (optional, default - 0) +
  • +
  • flags + int + bitwise OR of zero or more of IPC_NOWAIT, MSG_EXCEPT + and MSG_NOERROR + (default 0) +
  • +
+ +

Returns:

+
    +
  1. + int + message type from msgsnd
  2. +
  3. + string + message text, if successful
  4. +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + msgsnd (id, type, message[, flags=0]) +
+
+ Send message to a message queue + + +

Parameters:

+
    +
  • id + int + message queue identifier returned by msgget +
  • +
  • type + int + arbitrary message type +
  • +
  • message + string + content +
  • +
  • flags + int + optionally IPC_NOWAIT + (default 0) +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+

Constants

+ + +
+
+ + posix.sys.msg +
+
+ Message constants. +Any constants not available in the underlying system will be nil valued. + + +

Fields:

+
    +
  • IPC_CREAT + int + create entry if key does not exist +
  • +
  • IPC_EXCL + int + fail if key exists +
  • +
  • IPC_PRIVATE + int + private key +
  • +
  • IPC_NOWAIT + int + error if request must wait +
  • +
  • MSG_EXCEPT + int + read messages with differing type +
  • +
  • MSG_NOERROR + int + truncate received message rather than erroring +
  • +
+ + + + +

Usage:

+
    +
    +  -- Print msg constants supported on this host.
    +  for name, value in pairs (require "posix.sys.msg") do
    +    if type (value) == "number" then
    +      print (name, value)
    +     end
    +  end
    +
+ +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.sys.resource.html b/doc/modules/posix.sys.resource.html new file mode 100644 index 0000000..bba6a3d --- /dev/null +++ b/doc/modules/posix.sys.resource.html @@ -0,0 +1,359 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.sys.resource

+

Control Maximum System Resource Consumption.

+

+ +

+ + +

Functions

+ + + + + + + + + +
getrlimit (resource)Get resource limits for this process.
setrlimit (resource[, softlimit[, hardlimit]])Set a resource limit for subsequent child processes.
+

Tables

+ + + + + +
PosixRlimitResource limit record.
+

Constants

+ + + + + +
posix.sys.resourceRlimit constants.
+ +
+
+ + +

Functions

+ +
+
+ + getrlimit (resource) +
+
+ Get resource limits for this process. + + +

Parameters:

+
    +
  • resource + int + one of RLIMIT_CORE, RLIMIT_CPU, RLIMIT_DATA, RLIMIT_FSIZE, + RLIMIT_NOFILE, RLIMIT_STACK or RLIMIT_AS +
  • +
+ +

Returns:

+
    +
  1. + int + softlimit
  2. +
  3. + int + hardlimit, if successful
  4. +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + setrlimit (resource[, softlimit[, hardlimit]]) +
+
+ Set a resource limit for subsequent child processes. + + +

Parameters:

+
    +
  • resource + string + one of "core", "cpu", "data", "fsize", + "nofile", "stack" or "as" +
  • +
  • softlimit + process may receive a signal when reached + (optional) +
  • +
  • hardlimit + process may be terminated when reached + (optional) +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    P.setrlimit ("nofile", 1000, 2000)
    +
+ +
+
+

Tables

+ +
+
+ + PosixRlimit +
+
+ Resource limit record. + + +

Fields:

+
    +
  • rlim_cur + int + current soft limit +
  • +
  • rlim_max + int + hard limit +
  • +
+ + + + + +
+
+

Constants

+ + +
+
+ + posix.sys.resource +
+
+ Rlimit constants. + + +

Fields:

+
    +
  • RLIM_INFINITY + int + unlimited resource usage +
  • +
  • RLIM_SAVED_CUR + int + saved current resource soft limit +
  • +
  • RLIM_SAVED_MAX + int + saved resource hard limit +
  • +
  • RLIMIT_CORE + int + maximum bytes allowed for a core file +
  • +
  • RLIMIT_CPU + int + maximum cputime secconds allowed per process +
  • +
  • RLIMIT_DATA + int + maximum data segment bytes per process +
  • +
  • RLIMIT_FSIZE + int + maximum bytes in any file +
  • +
  • RLIMIT_NOFILE + int + maximum number of open files per process +
  • +
  • RLIMIT_STACK + int + maximum stack segment bytes per process +
  • +
  • RLIMIT_AS + int + maximum bytes total address space per process +
  • +
+ + + + +

Usage:

+
    +
    +  -- Print resource constants supported on this host.
    +  for name, value in pairs (require "posix.sys.resource") do
    +    if type (value) == "number" then
    +      print (name, value)
    +     end
    +  end
    +
+ +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.sys.socket.html b/doc/modules/posix.sys.socket.html new file mode 100644 index 0000000..c1c0ca4 --- /dev/null +++ b/doc/modules/posix.sys.socket.html @@ -0,0 +1,1335 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.sys.socket

+

BSD Sockets.

+

Where supported by the underlying system, functions and constants to create, + connect and communicate over BSD sockets. If the module loads successfully, + but there is no kernel support, then posix.sys.socket.version will be set, + but the unsupported APIs will be nil.

+ + +

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
accept (fd)Accept a connection on a socket.
bind (fd, addr)Bind an address to a socket.
connect (fd, addr)Initiate a connection on a socket.
getaddrinfo (host, service[, hints])Network address and service translation.
getsockname (sockfd)Get socket name.
listen (fd, backlog)Listen for connections on a socket.
recv (fd, count)Receive a message from a socket.
recvfrom (fd, count)Receive a message from a socket.
send (fd, buffer)Send a message from a socket.
sendto (fd, buffer, destination)Send a message from a socket.
setsockopt (fd, level, name, value1[, value2])Get and set options on sockets.
shutdown (fd, how)Shut down part of a full-duplex connection.
socket (domain, type, options)Create an endpoint for communication.
socketpair (domain, socktype, options)Create a pair of connected sockets.
+

Tables

+ + + + + + + + + +
PosixAddrInfoAddress information hints.
sockaddrSocket address.
+

Constants

+ + + + + +
posix.sys.socketSocket constants.
+ +
+
+ + +

Functions

+ +
+
+ + accept (fd) +
+
+ Accept a connection on a socket. + + +

Parameters:

+
    +
  • fd + int + socket descriptor to act on +
  • +
+ +

Returns:

+
    +
  1. + int + connection descriptor
  2. +
  3. + table + connection address, if successful
  4. +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + bind (fd, addr) +
+
+ Bind an address to a socket. + + +

Parameters:

+
    +
  • fd + int + socket descriptor to act on +
  • +
  • addr + sockaddr + socket address +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + connect (fd, addr) +
+
+ Initiate a connection on a socket. + + +

Parameters:

+
    +
  • fd + int + socket descriptor to act on +
  • +
  • addr + sockaddr + socket address +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + getaddrinfo (host, service[, hints]) +
+
+ Network address and service translation. + + +

Parameters:

+ + +

Returns:

+
    + + list + of sockaddr tables +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    +local res, errmsg, errcode = posix.getaddrinfo ("www.lua.org", "http",
    +  { family = P.IF_INET, socktype = P.SOCK_STREAM }
    +)
    +
+ +
+
+ + getsockname (sockfd) +
+
+ Get socket name. + + +

Parameters:

+
    +
  • sockfd + int + socket descriptor +
  • +
+ +

Returns:

+
    + + sockaddr + the current address to which the socket sockfd is bound +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    sa, err = posix.getsockname (sockfd)
    +
+ +
+
+ + listen (fd, backlog) +
+
+ Listen for connections on a socket. + + +

Parameters:

+
    +
  • fd + int + socket descriptor to act on +
  • +
  • backlog + int + maximum length for queue of pending connections +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + recv (fd, count) +
+
+ Receive a message from a socket. + + +

Parameters:

+
    +
  • fd + int + socket descriptor to act on +
  • +
  • count + int + maximum number of bytes to receive +
  • +
+ +

Returns:

+
    + + int + received bytes, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + recvfrom (fd, count) +
+
+ Receive a message from a socket. + + +

Parameters:

+
    +
  • fd + int + socket descriptor to act on +
  • +
  • count + int + maximum number of bytes to receive +
  • +
+ +

Returns:

+
    +
  1. + int + received bytes
  2. +
  3. + sockaddr + address of message source, if successful
  4. +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + send (fd, buffer) +
+
+ Send a message from a socket. + + +

Parameters:

+
    +
  • fd + int + socket descriptor to act on +
  • +
  • buffer + string + message bytes to send +
  • +
+ +

Returns:

+
    + + int + number of bytes sent, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + sendto (fd, buffer, destination) +
+
+ Send a message from a socket. + + +

Parameters:

+
    +
  • fd + int + socket descriptor to act on +
  • +
  • buffer + string + message bytes to send +
  • +
  • destination + sockaddr + socket address +
  • +
+ +

Returns:

+
    + + int + number of bytes sent, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + setsockopt (fd, level, name, value1[, value2]) +
+
+ Get and set options on sockets. + + +

Parameters:

+
    +
  • fd + int + socket descriptor +
  • +
  • level + int + one of SOL_SOCKET, IPPROTO_IPV6, IPPROTO_TCP +
  • +
  • name + int + option name, varies according to level value +
  • +
  • value1 + option value to set +
  • +
  • value2 + some option names need an additional value + (optional) +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    ok, errmsg = P.setsockopt (sock, P.SOL_SOCKET, P.SO_SNDTIMEO, 1, 0)
    +
+ +
+
+ + shutdown (fd, how) +
+
+ Shut down part of a full-duplex connection. + + +

Parameters:

+
    +
  • fd + int + socket descriptor to act on +
  • +
  • how + int + one of SHUT_RD, SHUT_WR or SHUT_RDWR +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    ok, errmsg = P.shutdown (sock, P.SHUT_RDWR)
    +
+ +
+
+ + socket (domain, type, options) +
+
+ Create an endpoint for communication. + + +

Parameters:

+
    +
  • domain + int + one of AF_INET, AF_INET6, AF_UNIX or AF_NETLINK +
  • +
  • type + int + one of SOCK_STREAM, SOCK_DGRAM or SOCK_RAW +
  • +
  • options + int + usually 0, but some socket types might implement other protocols. +
  • +
+ +

Returns:

+
    + + int + socket descriptor, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    sockd = P.socket (P.AF_INET, P.SOCK_STREAM, 0)
    +
+ +
+
+ + socketpair (domain, socktype, options) +
+
+ Create a pair of connected sockets. + + +

Parameters:

+
    +
  • domain + int + one of AF_INET, AF_INET6, AF_UNIX or AF_NETLINK +
  • +
  • socktype + int + one of SOCK_STREAM, SOCK_DGRAM or SOCK_RAW +
  • +
  • options + int + usually 0, but some socket types might implement other protocols. +
  • +
+ +

Returns:

+
    +
  1. + int + descriptor of one end of the socket pair
  2. +
  3. + int + descriptor of the other end of the pair, if successful
  4. +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + + +

Usage:

+
    +
    sockr, sockw = P.socketpair (P.AF_INET, P.SOCK_STREAM, 0)
    +
+ +
+
+

Tables

+ +
+
+ + PosixAddrInfo +
+
+ Address information hints. + + +

Fields:

+
    +
  • family + int + one of AF_INET, AF_INET6, AF_UNIX or AF_NETLINK +
  • +
  • flags + int + bitwise OR of zero or more of AI_ADDRCONFIG, AI_ALL, + AI_CANONNAME, AI_NUMERICHOST, AI_NUMERICSERV, AI_PASSIVE and + AI_V4MAPPED +
  • +
  • socktype + int + one of SOCK_STREAM, SOCK_DGRAM or SOCK_RAW +
  • +
  • protocol + int + one of IPPROTO_TCP or IPPROTO_UDP +
  • +
+ + + + + +
+
+ + sockaddr +
+
+ Socket address. +All sockaddr tables have the family field, and depending on its value, also +a subset of the following fields too. + + +

Fields:

+
    +
  • family + int + one of AF_INET, AF_INET6, AF_UNIX or (where supported) AF_NETLINK +
  • +
  • port + int + socket port number for AF_INET (and equivalently AF_INET6) family + (optional) +
  • +
  • addr + string + socket host address in correct format, for AF_INET family + (optional) +
  • +
  • socktype + int + one of SOCK_STREAM, SOCK_DGRAM or SOCK_RAW for AF_INET family + (optional) +
  • +
  • canonname + string + canonical name for service location, for AF_INET family + (optional) +
  • +
  • protocol + int + one of IPPROTO_TCP or IPPROTO_UDP, for AF_INET family + (optional) +
  • +
  • path + string + location in file system, for AF_UNIX family + (optional) +
  • +
  • pid + int + process identifier, for AF_NETLINK family + (optional) +
  • +
  • groups + int + process group owner identifier, for AF_NETLINK family + (optional) +
  • +
+ + + + + +
+
+

Constants

+ + +
+
+ + posix.sys.socket +
+
+ Socket constants. +Any constants not available in the underlying system will be nil valued. + + +

Fields:

+
    +
  • AF_INET + int + IP protocol family +
  • +
  • AF_INET6 + int + IP version 6 +
  • +
  • AF_NETLINK + int + Netlink protocol family +
  • +
  • AF_UNIX + int + local to host +
  • +
  • AF_UNSPEC + int + unspecified +
  • +
  • AI_ADDRCONFIG + int + use host configuration for returned address type +
  • +
  • AI_ALL + int + return IPv4 mapped and IPv6 addresses +
  • +
  • AI_CANONNAME + int + request canonical name +
  • +
  • AI_NUMERICHOST + int + don't use domain name resolution +
  • +
  • AI_NUMERICSERV + int + don't use service name resolution +
  • +
  • AI_PASSIVE + int + address is intended for bind +
  • +
  • AI_V4MAPPED + int + IPv4 mapped addresses are acceptable +
  • +
  • IPPROTO_ICMP + int + internet control message protocol +
  • +
  • IPPROTO_IP + int + internet protocol +
  • +
  • IPPROTO_IPV6 + int + IPv6 header +
  • +
  • IPPROTO_TCP + int + transmission control protocol +
  • +
  • IPPROTO_UDP + int + user datagram protocol +
  • +
  • IPV6_JOIN_GROUP + int + + + +
  • +
  • IPV6_LEAVE_GROUP + int + + + +
  • +
  • IPV6_MULTICAST_HOPS + int + + + +
  • +
  • IPV6_MULTICAST_IF + int + + + +
  • +
  • IPV6_MULTICAST_LOOP + int + + + +
  • +
  • IPV6_UNICAST_HOPS + int + + + +
  • +
  • IPV6_V6ONLY + int + + + +
  • +
  • NETLINK_AUDIT + int + auditing +
  • +
  • NETLINK_CONNECTOR + int + + + +
  • +
  • NETLINK_DNRTMSG + int + decnet routing messages +
  • +
  • NETLINK_ECRYPTFS + int + + + +
  • +
  • NETLINK_FIB_LOOKUP + int + + + +
  • +
  • NETLINK_FIREWALL + int + firewalling hook +
  • +
  • NETLINK_GENERIC + int + + + +
  • +
  • NETLINK_IP6_FW + int + + + +
  • +
  • NETLINK_ISCSI + int + open iSCSI +
  • +
  • NETLINK_KOBJECT_UEVENT + int + kernel messages to userspace +
  • +
  • NETLINK_NETFILTER + int + netfilter subsystem +
  • +
  • NETLINK_NFLOG + int + netfilter/iptables ULOG +
  • +
  • NETLINK_ROUTE + int + routing/device hook +
  • +
  • NETLINK_SCSITRANSPORT + int + SCSI transports +
  • +
  • NETLINK_SELINUX + int + SELinux event notifications +
  • +
  • NETLINK_UNUSED + int + unused number +
  • +
  • NETLINK_USERSOCK + int + reserved for user mode socket protocols +
  • +
  • NETLINK_XFRM + int + ipsec +
  • +
  • SHUT_RD + int + no more receptions +
  • +
  • SHUT_RDWR + int + no more receptions or transmissions +
  • +
  • SHUT_WR + int + no more transmissions +
  • +
  • SOCK_DGRAM + int + connectionless unreliable datagrams +
  • +
  • SOCK_RAW + int + raw protocol interface +
  • +
  • SOCK_STREAM + int + connection based byte stream +
  • +
  • SOL_SOCKET + int + socket level +
  • +
  • SOMAXCONN + int + maximum concurrent connections +
  • +
  • SO_ACCEPTCONN + int + does this socket accept connections +
  • +
  • SO_BINDTODEVICE + int + bind to a particular device +
  • +
  • SO_BROADCAST + int + permit broadcasts +
  • +
  • SO_DEBUG + int + turn-on socket debugging +
  • +
  • SO_DONTROUTE + int + bypass standard routing +
  • +
  • SO_ERROR + int + set socket error flag +
  • +
  • SO_KEEPALIVE + int + periodically transmit keep-alive message +
  • +
  • SO_LINGER + int + linger on a posix.unistd.close if data is still present +
  • +
  • SO_OOBINLINE + int + leave out-of-band data inline +
  • +
  • SO_RCVBUF + int + set receive buffer size +
  • +
  • SO_RCVLOWAT + int + set receive buffer low water mark +
  • +
  • SO_RCVTIMEO + int + set receive timeout +
  • +
  • SO_REUSEADDR + int + reuse local addresses +
  • +
  • SO_SNDBUF + int + set send buffer size +
  • +
  • SO_SNDLOWAT + int + set send buffer low water mark +
  • +
  • SO_SNDTIMEO + int + set send timeout +
  • +
  • SO_TYPE + int + get the socket type +
  • +
  • TCP_NODELAY + int + don't delay send for packet coalescing +
  • +
+ + + + +

Usage:

+
    +
    +  -- Print socket constants supported on this host.
    +  for name, value in pairs (require "posix.sys.socket") do
    +    if type (value) == "number" then
    +      print (name, value)
    +     end
    +  end
    +
+ +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.sys.stat.html b/doc/modules/posix.sys.stat.html new file mode 100644 index 0000000..108a3a7 --- /dev/null +++ b/doc/modules/posix.sys.stat.html @@ -0,0 +1,833 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.sys.stat

+

File Status Querying and Setting.

+

+ +

+ + +

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
S_ISBLK (mode)Test for a block special file.
S_ISCHR (mode)Test for a character special file.
S_ISDIR (mode)Test for a directory.
S_ISFIFO (mode)Test for a fifo special file.
S_ISLNK (mode)Test for a symbolic link.
S_ISREG (mode)Test for a regular file.
S_ISSOCK (mode)Test for a socket.
chmod (path, mode)Change the mode of the path.
lstat (path)Information about an existing file path.
mkdir (path[, mode=511])Make a directory.
mkfifo (path[, mode=511])Make a FIFO pipe.
stat (path)Information about an existing file path.
umask ([mode])Set file mode creation mask.
+

Tables

+ + + + + +
PosixStatFile state record.
+

Constants

+ + + + + +
posix.sys.statStat constants.
+ +
+
+ + +

Functions

+ +
+
+ + S_ISBLK (mode) +
+
+ Test for a block special file. + + +

Parameters:

+
    +
  • mode + int + the st_mode field of a PosixStat +
  • +
+ +

Returns:

+
    + + int + non-zero if mode represents a block special file +
+ + + + +
+
+ + S_ISCHR (mode) +
+
+ Test for a character special file. + + +

Parameters:

+
    +
  • mode + int + the st_mode field of a PosixStat +
  • +
+ +

Returns:

+
    + + int + non-zero if mode represents a character special file +
+ + + + +
+
+ + S_ISDIR (mode) +
+
+ Test for a directory. + + +

Parameters:

+
    +
  • mode + int + the st_mode field of a PosixStat +
  • +
+ +

Returns:

+
    + + int + non-zero if mode represents a directory +
+ + + + +
+
+ + S_ISFIFO (mode) +
+
+ Test for a fifo special file. + + +

Parameters:

+
    +
  • mode + int + the st_mode field of a PosixStat +
  • +
+ +

Returns:

+
    + + int + non-zero if mode represents a fifo special file +
+ + + + +
+
+ + S_ISLNK (mode) +
+
+ Test for a symbolic link. + + +

Parameters:

+
    +
  • mode + int + the st_mode field of a PosixStat +
  • +
+ +

Returns:

+
    + + int + non-zero if mode represents a symbolic link +
+ + + + +
+
+ + S_ISREG (mode) +
+
+ Test for a regular file. + + +

Parameters:

+
    +
  • mode + int + the st_mode field of a PosixStat +
  • +
+ +

Returns:

+
    + + int + non-zero if mode represents a regular file +
+ + + + +
+
+ + S_ISSOCK (mode) +
+
+ Test for a socket. + + +

Parameters:

+
    +
  • mode + int + the st_mode field of a PosixStat +
  • +
+ +

Returns:

+
    + + int + non-zero if mode represents a socket +
+ + + + +
+
+ + chmod (path, mode) +
+
+ Change the mode of the path. + + +

Parameters:

+
    +
  • path + string + existing file path to act on +
  • +
  • mode + int + access modes to set for path +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    P.chmod ('bin/dof', bit.bor (P.S_IRWXU, P.S_IRGRP))
    +
+ +
+
+ + lstat (path) +
+
+ Information about an existing file path. +If file is a symbolic link, return information about the link itself. + + +

Parameters:

+
    +
  • path + string + file to act on +
  • +
+ +

Returns:

+
    + + PosixStat + information about path +
+ + +

See also:

+ + +

Usage:

+
    +
    for a, b in pairs (P.lstat "/etc/") do print (a, b) end
    +
+ +
+
+ + mkdir (path[, mode=511]) +
+
+ Make a directory. + + +

Parameters:

+
    +
  • path + string + location in file system to create directory +
  • +
  • mode + int + access modes to set for path + (default 511) +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + mkfifo (path[, mode=511]) +
+
+ Make a FIFO pipe. + + +

Parameters:

+
    +
  • path + string + location in file system to create fifo +
  • +
  • mode + int + access modes to set for path + (default 511) +
  • +
+ +

Returns:

+
    + + int + file descriptor for path, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + stat (path) +
+
+ Information about an existing file path. +If file is a symbolic link, return information about the file the link points to. + + +

Parameters:

+
    +
  • path + string + file to act on +
  • +
+ +

Returns:

+
    + + PosixStat + information about path +
+ + +

See also:

+ + +

Usage:

+
    +
    for a, b in pairs (P.stat "/etc/") do print (a, b) end
    +
+ +
+
+ + umask ([mode]) +
+
+ Set file mode creation mask. + + +

Parameters:

+
    +
  • mode + int + new file creation mask + (optional) +
  • +
+ +

Returns:

+
    + + int + previous umask +
+ + +

See also:

+ + + +
+
+

Tables

+ +
+
+ + PosixStat +
+
+ File state record. + + +

Fields:

+
    +
  • st_dev + int + device id +
  • +
  • st_ino + int + inode number +
  • +
  • st_mode + int + mode of file +
  • +
  • st_nlink + int + number of hardlinks to file +
  • +
  • st_uid + int + user id of file owner +
  • +
  • st_gid + int + group id of file owner +
  • +
  • st_rdev + int + additional device specific id for special files +
  • +
  • st_size + int + file size in bytes +
  • +
  • st_atime + int + time of last access +
  • +
  • st_mtime + int + time of last data modification +
  • +
  • st_ctime + int + time of last state change +
  • +
  • st_blksize + int + preferred block size +
  • +
  • st_blocks + int + number of blocks allocated +
  • +
+ + + + + +
+
+

Constants

+ + +
+
+ + posix.sys.stat +
+
+ Stat constants. +Any constants not available in the underlying system will be nil valued. + + +

Fields:

+
    +
  • S_IFMT + int + file type mode bitmask +
  • +
  • S_IFBLK + int + block special +
  • +
  • S_IFCHR + int + character special +
  • +
  • S_IFDIR + int + directory +
  • +
  • S_IFIFO + int + fifo +
  • +
  • S_IFLNK + int + symbolic link +
  • +
  • S_IFREG + int + regular file +
  • +
  • S_IFSOCK + int + socket +
  • +
  • S_IRWXU + int + user read, write and execute +
  • +
  • S_IRUSR + int + user read +
  • +
  • S_IWUSR + int + user write +
  • +
  • S_IXUSR + int + user execute +
  • +
  • S_IRWXG + int + group read, write and execute +
  • +
  • S_IRGRP + int + group read +
  • +
  • S_IWGRP + int + group write +
  • +
  • S_IXGRP + int + group execute +
  • +
  • S_IRWXO + int + other read, write and execute +
  • +
  • S_IROTH + int + other read +
  • +
  • S_IWOTH + int + other write +
  • +
  • S_IXOTH + int + other execute +
  • +
  • S_ISGID + int + set group id on execution +
  • +
  • S_ISUID + int + set user id on execution +
  • +
+ + + + +

Usage:

+
    +
    +  -- Print stat constants supported on this host.
    +  for name, value in pairs (require "posix.sys.stat") do
    +    if type (value) == "number" then
    +      print (name, value)
    +     end
    +  end
    +
+ +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.sys.statvfs.html b/doc/modules/posix.sys.statvfs.html new file mode 100644 index 0000000..bb1b9e5 --- /dev/null +++ b/doc/modules/posix.sys.statvfs.html @@ -0,0 +1,292 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.sys.statvfs

+

Retrieve File System Information.

+

Where supported by the underlying system, query the file system. If the + module loads, but there is no kernel support, then posix.sys.statvfs.version + will be set, but the unsupported APIs will be nil.

+ + +

Functions

+ + + + + +
statvfs (path)Get file system statistics.
+

Tables

+ + + + + +
PosixStatvfsFiles system information record.
+

Constants

+ + + + + +
posix.sys.statvfsStatvfs constants.
+ +
+
+ + +

Functions

+ +
+
+ + statvfs (path) +
+
+ Get file system statistics. + + +

Parameters:

+
    +
  • path + string + any path within the mounted file system +
  • +
+ +

Returns:

+
    + + PosixStatvfs + information about file system containing path +
+ + +

See also:

+ + +

Usage:

+
    +
    for a, b in pairs (P.statvfs "/") do print (a, b) end
    +
+ +
+
+

Tables

+ +
+
+ + PosixStatvfs +
+
+ Files system information record. + + +

Fields:

+
    +
  • f_bsize + int + file system block size +
  • +
  • f_frsize + int + fundamental file system block size +
  • +
  • f_blocks + int + number of *f_frsize* sized blocks in file system +
  • +
  • f_bfree + int + number of free blocks +
  • +
  • f_bavail + int + number of free blocks available to non-privileged process +
  • +
  • f_files + int + number of file serial numbers +
  • +
  • f_ffree + int + number of free file serial numbers +
  • +
  • f_favail + int + number of free file serial numbers available +
  • +
  • f_fsid + int + file system id +
  • +
  • f_flag + int + flag bits +
  • +
  • f_namemax + int + maximum filename length +
  • +
+ + + + + +
+
+

Constants

+ + +
+
+ + posix.sys.statvfs +
+
+ Statvfs constants. +Any constants not available in the underlying system will be nil valued. + + +

Fields:

+
    +
  • ST_RDONLY + int + read-only file system +
  • +
  • ST_NOSUID + int + does not support S_ISUID nor S_ISGID file mode bits +
  • +
+ + + + +

Usage:

+
    +
    +  -- Print statvfs constants supported on this host.
    +  for name, value in pairs (require "posix.sys.statvfs") do
    +    if type (value) == "number" then
    +      print (name, value)
    +     end
    +  end
    +
+ +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.sys.time.html b/doc/modules/posix.sys.time.html new file mode 100644 index 0000000..c38065d --- /dev/null +++ b/doc/modules/posix.sys.time.html @@ -0,0 +1,200 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.sys.time

+

Get and Set System Date and Time.

+

+ +

+ + +

Functions

+ + + + + +
gettimeofday ()Get time of day.
+

Tables

+ + + + + +
PosixTimevalTime value.
+ +
+
+ + +

Functions

+ +
+
+ + gettimeofday () +
+
+ Get time of day. + + + +

Returns:

+
    + + PosixTimeval + time elapsed since epoch +
+ + +

See also:

+ + + +
+
+

Tables

+ +
+
+ + PosixTimeval +
+
+ Time value. + + +

Fields:

+
    +
  • tv_sec + int + seconds elapsed +
  • +
  • tv_usec + int + remainder in microseconds +
  • +
+ + + +

See also:

+ + + +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.sys.times.html b/doc/modules/posix.sys.times.html new file mode 100644 index 0000000..8bef50f --- /dev/null +++ b/doc/modules/posix.sys.times.html @@ -0,0 +1,216 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.sys.times

+

Process Times.

+

+ +

+ + +

Functions

+ + + + + +
times ()Get the current process times.
+

Tables

+ + + + + +
PosixTmsProcess times record.
+ +
+
+ + +

Functions

+ +
+
+ + times () +
+
+ Get the current process times. + + + +

Returns:

+
    + + PosixTms + time accounting for this process, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+

Tables

+ +
+
+ + PosixTms +
+
+ Process times record. +All times are measured in cpu seconds. + + +

Fields:

+
    +
  • tms_utime + int + time spent executing user instructions +
  • +
  • tms_stime + int + time spent in system execution +
  • +
  • tms_cutime + int + sum of *tms_utime* for calling process and its children +
  • +
  • tms_cstime + int + sum of *tms_stime* for calling process and its children +
  • +
+ + + + + +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.sys.utsname.html b/doc/modules/posix.sys.utsname.html new file mode 100644 index 0000000..f96ae84 --- /dev/null +++ b/doc/modules/posix.sys.utsname.html @@ -0,0 +1,219 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.sys.utsname

+

Get System Identification.

+

+ +

+ + +

Functions

+ + + + + +
uname ()Return information about this machine.
+

Tables

+ + + + + +
utsnameSystem identification record.
+ +
+
+ + +

Functions

+ +
+
+ + uname () +
+
+ Return information about this machine. + + + +

Returns:

+
    + + utsname + system information +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+

Tables

+ +
+
+ + utsname +
+
+ System identification record. + + +

Fields:

+
    +
  • machine + string + hardware platform name +
  • +
  • nodename + string + network node name +
  • +
  • release + string + operating system release level +
  • +
  • sysname + string + operating system name +
  • +
  • version + string + operating system version +
  • +
+ + + + + +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.sys.wait.html b/doc/modules/posix.sys.wait.html new file mode 100644 index 0000000..27aca1a --- /dev/null +++ b/doc/modules/posix.sys.wait.html @@ -0,0 +1,239 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.sys.wait

+

Wait for Process Termination.

+

+ +

+ + +

Functions

+ + + + + +
wait ([pid=-1[, options]])Wait for child process to terminate.
+

Constants

+ + + + + +
posix.sys.waitWait constants.
+ +
+
+ + +

Functions

+ +
+
+ + wait ([pid=-1[, options]]) +
+
+ Wait for child process to terminate. + + +

Parameters:

+
    +
  • pid + int + child process id to wait for, or -1 for any child process + (default -1) +
  • +
  • options + int + bitwise OR of WNOHANG and WUNTRACED + (optional) +
  • +
+ +

Returns:

+
    +
  1. + int + pid of terminated child, if successful
  2. +
  3. + string + "exited", "killed" or "stopped"
  4. +
  5. + int + exit status, or signal number responsible for "killed" or "stopped"
  6. +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+

Constants

+ + +
+
+ + posix.sys.wait +
+
+ Wait constants. +Any constants not available in the underlying system will be nil valued. + + +

Fields:

+
    +
  • WNOHANG + int + don't block waiting +
  • +
  • WUNTRACED + int + report status of stopped children +
  • +
+ + + + +

Usage:

+
    +
    +  -- Print wait constants supported on this host.
    +  for name, value in pairs (require "posix.sys.wait") do
    +    if type (value) == "number" then
    +      print (name, value)
    +     end
    +  end
    +
+ +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.syslog.html b/doc/modules/posix.syslog.html new file mode 100644 index 0000000..aa9de32 --- /dev/null +++ b/doc/modules/posix.syslog.html @@ -0,0 +1,477 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.syslog

+

Control System Log.

+

+ +

+ + +

Functions

+ + + + + + + + + + + + + + + + + + + + + +
LOG_MASK (priority)Mask bit for given log priority.
closelog ()Close system log.
openlog (ident[, option[, facility=`LOG_USER`]])Open the system logger.
setlogmask (mask)Set log priority mask.
syslog (priority, message)Write to the system logger.
+

Constants

+ + + + + +
posix.syslogSystem logging constants.
+ +
+
+ + +

Functions

+ +
+
+ + LOG_MASK (priority) +
+
+ Mask bit for given log priority. + + +

Parameters:

+
    +
  • priority + int + one of LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_WARNING, + LOG_NOTICE, LOG_INFO or LOG_DEBUG +
  • +
+ +

Returns:

+
    + + int + mask bit corresponding to priority +
+ + +

See also:

+ + + +
+
+ + closelog () +
+
+ Close system log. + + + + + +

See also:

+ + + +
+
+ + openlog (ident[, option[, facility=`LOG_USER`]]) +
+
+ Open the system logger. + + +

Parameters:

+
    +
  • ident + string + all messages will start with this +
  • +
  • option + int + bitwise OR of zero or more of LOG_CONS, LOG_NDELAY, + or LOG_PID + (optional) +
  • +
  • facility + int + one of LOG_AUTH, LOG_AUTHPRIV, LOG_CRON, + LOG_DAEMON, LOG_FTP, LOG_KERN, LOG_LPR, LOG_MAIL, LOG_NEWS, + LOG_SECURITY, LOG_SYSLOG, LOG_USER, LOG_UUCP or LOG_LOCAL0 + through LOG_LOCAL7 + (default `LOG_USER`) +
  • +
+ + + +

See also:

+ + + +
+
+ + setlogmask (mask) +
+
+ Set log priority mask. + + +

Parameters:

+
    +
  • mask + int + bitwise OR of LOG_MASK bits. +
  • +
+ +

Returns:

+
    + + int + previous mask, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + syslog (priority, message) +
+
+ Write to the system logger. + + +

Parameters:

+
    +
  • priority + int + one of LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_WARNING, + LOG_NOTICE, LOG_INFO or LOG_DEBUG +
  • +
  • message + string + log message +
  • +
+ + + +

See also:

+ + + +
+
+

Constants

+ + +
+
+ + posix.syslog +
+
+ System logging constants. +Any constants not available in the underlying system will be nil valued. + + +

Fields:

+
    +
  • LOG_AUTH + int + security/authorisation messages +
  • +
  • LOG_AUTHPRIV + int + private authorisation messages +
  • +
  • LOG_CONS + int + write directly to system console +
  • +
  • LOG_CRON + int + clock daemon +
  • +
  • LOG_DAEMON + int + system daemons +
  • +
  • LOG_FTP + int + ftp daemon +
  • +
  • LOG_KERN + int + kernel messages +
  • +
  • LOG_LOCAL0 + int + reserved for local use +
  • +
  • LOG_LOCAL1 + int + reserved for local use +
  • +
  • LOG_LOCAL2 + int + reserved for local use +
  • +
  • LOG_LOCAL3 + int + reserved for local use +
  • +
  • LOG_LOCAL4 + int + reserved for local use +
  • +
  • LOG_LOCAL5 + int + reserved for local use +
  • +
  • LOG_LOCAL6 + int + reserved for local use +
  • +
  • LOG_LOCAL7 + int + reserved for local use +
  • +
  • LOG_LPR + int + line printer subsystem +
  • +
  • LOG_MAIL + int + mail system +
  • +
  • LOG_NDELAY + int + open the connection immediately +
  • +
  • LOG_NEWS + int + network news subsystem +
  • +
  • LOG_PID + int + include process id with each log message +
  • +
  • LOG_SYSLOG + int + messages generated internally by syslogd +
  • +
  • LOG_USER + int + random user-level messages +
  • +
  • LOG_UUCP + int + unix-to-unix copy subsystem +
  • +
  • LOG_EMERG + int + system is unusable +
  • +
  • LOG_ALERT + int + action must be taken immediately +
  • +
  • LOG_CRIT + int + critical conditions +
  • +
  • LOG_ERR + int + error conditions +
  • +
  • LOG_WARNING + int + warning conditions +
  • +
  • LOG_NOTICE + int + normal but significant conditions +
  • +
  • LOG_INFO + int + informational +
  • +
  • LOG_DEBUG + int + debug-level messages +
  • +
+ + + + +

Usage:

+
    +
    +  -- Print syslog constants supported on this host.
    +  for name, value in pairs (require "posix.syslog") do
    +    if type (value) == "number" then
    +      print (name, value)
    +     end
    +  end
    +
+ +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.termio.html b/doc/modules/posix.termio.html new file mode 100644 index 0000000..5ead1eb --- /dev/null +++ b/doc/modules/posix.termio.html @@ -0,0 +1,551 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.termio

+

Control Terminal I/O.

+

Functions and constants for controlling terminal behaviour.

+ + +

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + +
tcdrain (fd)Wait for all written output to reach the terminal.
tcflow (fd, action)Suspend transmission or receipt of data.
tcflush (fd, action)Discard any data already written but not yet sent to the terminal.
tcgetattr (fd)Get termios state.
tcsendbreak (fd, duration)Send a stream of zero valued bits.
tcsetattr (fd, actions, a)Set termios state.
+

Tables

+ + + + + + + + + +
ccsControl characters.
termiosTerminal attributes.
+ +
+
+ + +

Functions

+ +
+
+ + tcdrain (fd) +
+
+ Wait for all written output to reach the terminal. + + +

Parameters:

+
    +
  • fd + int + terminal descriptor to act on +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + tcflow (fd, action) +
+
+ Suspend transmission or receipt of data. + + +

Parameters:

+
    +
  • fd + int + terminal descriptor to act on +
  • +
  • action + int + one of TCOOFF, TCOON, TCIOFF or TCION +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + tcflush (fd, action) +
+
+ Discard any data already written but not yet sent to the terminal. + + +

Parameters:

+
    +
  • fd + int + terminal descriptor to act on +
  • +
  • action + int + one of TCIFLUSH, TCOFLUSH, TCIOFLUSH +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + tcgetattr (fd) +
+
+ Get termios state. + + +

Parameters:

+
    +
  • fd + int + terminal descriptor +
  • +
+ +

Returns:

+
    + + error message if failed +
+

Or

+
    + + termios + terminal attributes, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    local termios, errmsg = tcgetattr (fd)
    +
+ +
+
+ + tcsendbreak (fd, duration) +
+
+ Send a stream of zero valued bits. + + +

Parameters:

+
    +
  • fd + int + terminal descriptor +
  • +
  • duration + int + if non-zero, stream for some implementation defined time +
  • +
+ +

Returns:

+
    +
  1. + 0 if successful, otherwise nil
  2. +
  3. + error message if failed
  4. +
+ + +

See also:

+ + + +
+
+ + tcsetattr (fd, actions, a) +
+
+ Set termios state. + + +

Parameters:

+
    +
  • fd + int + terminal descriptor to act on +
  • +
  • actions + int + bitwise OR of one or more of TCSANOW, TCSADRAIN, + TCSAFLUSH and TSASOFT +
  • +
  • a + termios + table with fields from iflag, oflag, cflag, lflag and cc, + each formed by bor operations with various posix constants +
  • +
+ +

Returns:

+
    +
  1. + 0 if successful, otherwise nil
  2. +
  3. + error message if failed
  4. +
+ + +

See also:

+ + +

Usage:

+
    +
    ok, errmsg = tcsetattr (fd, 0, { cc = { [P.VTIME] = 0, [P.VMIN] = 1 })
    +
+ +
+
+

Tables

+ +
+
+ + ccs +
+
+ Control characters. +The field names below are not strings, but index constants each +referring to a terminal control character. + + +

Fields:

+
    +
  • VINTR + int + interrupt control character +
  • +
  • VQUIT + int + quit control character +
  • +
  • WERASE + int + erase control character +
  • +
  • VKILL + int + kill control character +
  • +
  • VEOF + int + end-of-file control character +
  • +
  • VEOL + int + end-of-line control charactor +
  • +
  • VEOL2 + int + another end-of-line control charactor +
  • +
  • VMIN + int + 1 +
  • +
  • VTIME + int + 0 +
  • +
  • VSTART + int + xon/xoff start control character +
  • +
  • VSTOP + int + xon/xoff stop control character +
  • +
  • VSUSP + int + suspend control character +
  • +
+ + + + + +
+
+ + termios +
+
+ Terminal attributes. +The constants named below are all available in this submodule's namespace, +as long as they are supported by the underlying system. + + +

Fields:

+
    +
  • cc + ccs + array of terminal control characters +
  • +
  • cflag + int + bitwise OR of zero or more of B0, B50, B75, B110, + B134, B150, B200, B300, B600, B1200, B1800, B2400, + B4800, B9600, B19200, B38400, B57600, B115200, CSIZE, + CS5, CS6, CS7, CS8, CSTOPB, CREAD, PARENB, PARODD, + HUPCL, CLOCAL and CRTSCTS +
  • +
  • iflag + int + input flags; bitwise OR of zero or more of IGNBRK, BRKINT, + IGNPAR, PARMRK, INPCK, ISTRIP, INLCR, IGNCR, ICRNL, + IXON, IXOFF, IXANY, IMAXBEL and IUTF8 +
  • +
  • lflags + int + local flags; bitwise OR of zero or more of ISIG, ICANON, + ECHO, ECHOE, ECHOK', 'ECHONL, NOFLSH, IEXTEN and TOSTOP +
  • +
  • oflag + int + output flags; bitwise OR of zero or more of OPOST, ONLCR, + OXTABS, ONOEOT, OCRNL, ONOCR, ONLRET, OFILL, NLDLY, + TABDLY, CRDLY, FFDLY, BSDLY, VTDLY and OFDEL +
  • +
+ + + + + +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.time.html b/doc/modules/posix.time.html new file mode 100644 index 0000000..a04149b --- /dev/null +++ b/doc/modules/posix.time.html @@ -0,0 +1,599 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.time

+

Time and Clock Functions.

+

+ +

+ + +

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
clock_getres (clk)Find the precision of a clock.
clock_gettime (clk)Read a clock.
gmtime (t)Convert epoch time value to a broken-down UTC time.
localtime (t)Convert epoch time value to a broken-down local time.
mktime (broken)Convert a broken-down localtime table into an epoch time.
nanosleep (requested)Sleep with nanosecond precision.
strftime (format, tm)Write a time out according to a format.
strptime (s, format)Parse a date string.
time ()Get current time.
+

Tables

+ + + + + + + + + +
PosixTimespecTimespec record.
PosixTmDatetime record.
+ +
+
+ + +

Functions

+ +
+
+ + clock_getres (clk) +
+
+ Find the precision of a clock. + + +

Parameters:

+
    +
  • clk + int + name of clock, one of CLOCK_REALTIME, CLOCK_PROCESS_CPUTIME_ID, + CLOCK_MONOTONIC or CLOCK_THREAD_CPUTIME_ID +
  • +
+ +

Returns:

+
    + + PosixTimespec + resolution of clk, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + clock_gettime (clk) +
+
+ Read a clock. + + +

Parameters:

+
    +
  • clk + int + name of clock, one of CLOCK_REALTIME, CLOCK_PROCESS_CPUTIME_ID, + CLOCK_MONOTONIC or CLOCK_THREAD_CPUTIME_ID +
  • +
+ +

Returns:

+
    + + PosixTimespec + current value of clk, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + gmtime (t) +
+
+ Convert epoch time value to a broken-down UTC time. + + +

Parameters:

+
    +
  • t + int + seconds since epoch +
  • +
+ +

Returns:

+
    + + PosixTm + broken-down time +
+ + +

See also:

+ + + +
+
+ + localtime (t) +
+
+ Convert epoch time value to a broken-down local time. + + +

Parameters:

+
    +
  • t + int + seconds since epoch +
  • +
+ +

Returns:

+
    + + PosixTm + broken-down time +
+ + +

See also:

+ + + +
+
+ + mktime (broken) +
+
+ Convert a broken-down localtime table into an epoch time. + + +

Parameters:

+
    +
  • broken + PosixTm + -down localtime +
  • +
+ +

Returns:

+
    + + int + seconds since epoch +
+ + +

See also:

+ + + +
+
+ + nanosleep (requested) +
+
+ Sleep with nanosecond precision. + + +

Parameters:

+ + +

Returns:

+
    + + int + 0 if requested time has elapsed +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
  7. + PosixTimespec + unslept time remaining, if interrupted
  8. +
+ + +

See also:

+ + + +
+
+ + strftime (format, tm) +
+
+ Write a time out according to a format. + + +

Parameters:

+
    +
  • format + string + specifier with % place-holders +
  • +
  • tm + PosixTm + broken-down local time +
  • +
+ +

Returns:

+
    + + string + format with place-holders plugged with tm values +
+ + +

See also:

+ + + +
+
+ + strptime (s, format) +
+
+ Parse a date string. + + +

Parameters:

+
    +
  • s + string + + + +
  • +
  • format + string + same as for strftime +
  • +
+ +

Returns:

+
    +
  1. + PosixTm + broken-down local time
  2. +
  3. + int + next index of first character not parsed as part of the date
  4. +
+

Or

+
    + + nil +
+ + +

See also:

+ + +

Usage:

+
    +
    posix.strptime('20','%d').monthday == 20
    +
+ +
+
+ + time () +
+
+ Get current time. + + + +

Returns:

+
    + + time in seconds since epoch +
+ + +

See also:

+ + + +
+
+

Tables

+ +
+
+ + PosixTimespec +
+
+ Timespec record. + + +

Fields:

+
    +
  • tv_sec + int + seconds +
  • +
  • tv_nsec + int + nanoseconds +
  • +
+ + + +

See also:

+ + + +
+
+ + PosixTm +
+
+ Datetime record. + + +

Fields:

+
    +
  • tm_sec + int + second [0,60] +
  • +
  • tm_min + int + minute [0,59] +
  • +
  • tm_hour + int + hour [0,23] +
  • +
  • tm_mday + int + day of month [1, 31] +
  • +
  • tm_mon + int + month of year [0,11] +
  • +
  • tm_year + int + years since 1900 +
  • +
  • tm_wday + int + day of week [0=Sunday,6] +
  • +
  • tm_yday + int + day of year [0,365[ +
  • +
  • tm_isdst + int + 0 if daylight savings time is not in effect +
  • +
+ + + + + +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.unistd.html b/doc/modules/posix.unistd.html new file mode 100644 index 0000000..8c6c2ed --- /dev/null +++ b/doc/modules/posix.unistd.html @@ -0,0 +1,1934 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.unistd

+

Unix Standard APIs.

+

Where the underlying system does not support one of these functions, it + will have a nil value in the module table.

+ + +

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
_exit (status)Terminate the calling process.
access (path[, mode="f"])Check real user's permissions for a file.
chdir (path)Set the working directory.
chown (path, uid, gid)Change ownership of a file.
close (fd)Close an open file descriptor.
crypt (trypass, salt)Encrypt a password.
dup (fd)Duplicate an open file descriptor.
dup2 (fd, newfd)Duplicate one open file descriptor to another.
exec (path, argt)Execute a program without using the shell.
execp (path, argt)Execute a program using the shell.
fdatasync (fd)Synchronize a file's in-core state with storage device without metadata.
fork ()Fork this program.
fsync (fd)Synchronize a file's in-core state with storage device.
getcwd ()Current working directory for this process.
getegid ()Return effective group id of calling process.
geteuid ()Return effective user id of calling process.
getgid ()Return group id of calling process.
getgroups ()Get list of supplementary group ids.
gethostid ()Get host id.
getpgrp ()Return process group id of calling process.
getpid ()Return process id of calling process.
getppid ()Return parent process id of calling process.
getuid ()Return user id of calling process.
isatty (fd)Test whether a file descriptor refers to a terminal.
link (target, link[, soft=false])Create a link.
lseek (fd, offset, whence)reposition read/write file offset
nice (inc)change process priority
pathconf (path, key)Get a value for a configuration option for a filename.
pipe ()Creates a pipe.
read (fd, count)Read bytes from a file.
readlink (path)Read value of a symbolic link.
rmdir (path)Remove a directory.
setpid (what, id[, gid])Set the uid, euid, gid, egid, sid or pid & gid.
sleep (seconds)Sleep for a number of seconds.
sync ()Commit buffer cache to disk.
sysconf (key)Get configuration information at runtime.
ttyname ([fd=0])Name of a terminal device.
unlink (path)Unlink a file.
write (fd, buf)Write bytes to a file.
+

Constants

+ + + + + +
posix.unistdStandard constants.
+ +
+
+ + +

Functions

+ +
+
+ + _exit (status) +
+
+ Terminate the calling process. + + +

Parameters:

+
    +
  • status + int + process exit status +
  • +
+ + + +

See also:

+ + + +
+
+ + access (path[, mode="f"]) +
+
+ Check real user's permissions for a file. + + +

Parameters:

+
    +
  • path + string + file to act on +
  • +
  • mode + string + can contain 'r','w','x' and 'f' + (default "f") +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    status, errstr, errno = P.access("/etc/passwd", "rw")
    +
+ +
+
+ + chdir (path) +
+
+ Set the working directory. + + +

Parameters:

+
    +
  • path + string + file to act on +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    status, errstr, errno = P.chdir("/var/tmp")
    +
+ +
+
+ + chown (path, uid, gid) +
+
+ Change ownership of a file. + + +

Parameters:

+
    +
  • path + string + existing file path +
  • +
  • uid + string or int + new owner user id +
  • +
  • gid + string or int + new owner group id +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error messoge
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    +-- will fail for a normal user, and print an error
    +print(P.chown("/etc/passwd",100,200))
    +
+ +
+
+ + close (fd) +
+
+ Close an open file descriptor. + + +

Parameters:

+
    +
  • fd + int + file descriptor to act on +
  • +
+ +

Returns:

+
    + + int + 0 if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    +local ok, errmsg = P.close (log)
    +if not ok then error (errmsg) end
    +
+ +
+
+ + crypt (trypass, salt) +
+
+ Encrypt a password. +Not recommended for general encryption purposes. + + +

Parameters:

+
    +
  • trypass + string + string to hash +
  • +
  • salt + string + two-character string from [a-zA-Z0-9./] +
  • +
+ +

Returns:

+
    + + encrypted string +
+ + +

See also:

+ + +

Usage:

+
    +
    +local salt, hash = pwent:match ":$6$(.-)$([^:]+)"
    +if P.crypt (trypass, salt) ~= hash then
    +  error "wrong password"
    +end
    +
+ +
+
+ + dup (fd) +
+
+ Duplicate an open file descriptor. + + +

Parameters:

+
    +
  • fd + int + file descriptor to act on +
  • +
+ +

Returns:

+
    + + int + new file descriptor duplicating fd, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    local outfd = P.dup (P.fileno (io.stdout))
    +
+ +
+
+ + dup2 (fd, newfd) +
+
+ Duplicate one open file descriptor to another. +If newfd references an open file already, it is closed before being +reallocated to fd. + + +

Parameters:

+
    +
  • fd + int + an open file descriptor to act on +
  • +
  • newfd + int + new descriptor to duplicate fd +
  • +
+ +

Returns:

+
    + + int + new file descriptor, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + exec (path, argt) +
+
+ Execute a program without using the shell. + + +

Parameters:

+
    +
  • path + string + + + +
  • +
  • argt + table + arguments (table can include index 0) +
  • +
+ +

Returns:

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
+ + +

See also:

+ + +

Usage:

+
    +
    exec ("/bin/bash", {[0] = "-sh", "--norc})
    +
+ +
+
+ + execp (path, argt) +
+
+ Execute a program using the shell. + + +

Parameters:

+
    +
  • path + string + + + +
  • +
  • argt + table + arguments (table can include index 0) +
  • +
+ +

Returns:

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
+ + +

See also:

+ + + +
+
+ + fdatasync (fd) +
+
+ Synchronize a file's in-core state with storage device without metadata. + + +

Parameters:

+
    +
  • fd + int + + + +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + fork () +
+
+ Fork this program. + + + +

Returns:

+
    + + int + 0 in the resulting child process +
+

Or

+
    + + int + process id of child, in the calling process +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + +

Usage:

+
    +
    +local pid, errmsg = P.fork ()
    +if pid == nil then
    +  error (errmsg)
    +elseif pid == 0 then
    +  print ("in child:", P.getpid "pid")
    +else
    +  print (P.wait (pid))
    +end
    +os.exit ()
    +
+ +
+
+ + fsync (fd) +
+
+ Synchronize a file's in-core state with storage device. + + +

Parameters:

+
    +
  • fd + int + + + +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + getcwd () +
+
+ Current working directory for this process. + + + +

Returns:

+
    + + string + path of current working directory, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + getegid () +
+
+ Return effective group id of calling process. + + + +

Returns:

+
    + + int + effective group id of calling process +
+ + +

See also:

+ + + +
+
+ + geteuid () +
+
+ Return effective user id of calling process. + + + +

Returns:

+
    + + int + effective user id of calling process +
+ + +

See also:

+ + + +
+
+ + getgid () +
+
+ Return group id of calling process. + + + +

Returns:

+
    + + int + group id of calling process +
+ + +

See also:

+ + + +
+
+ + getgroups () +
+
+ Get list of supplementary group ids. + + + +

Returns:

+
    + + table + group id +
+ + +

See also:

+ + + +
+
+ + gethostid () +
+
+ Get host id. + + + +

Returns:

+
    + + int + host id +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
+ + +

See also:

+ + + +
+
+ + getpgrp () +
+
+ Return process group id of calling process. + + + +

Returns:

+
    + + int + process group id of calling process +
+ + +

See also:

+ + + +
+
+ + getpid () +
+
+ Return process id of calling process. + + + +

Returns:

+
    + + int + process id of calling process +
+ + + + +
+
+ + getppid () +
+
+ Return parent process id of calling process. + + + +

Returns:

+
    + + int + parent process id of calling process +
+ + +

See also:

+ + + +
+
+ + getuid () +
+
+ Return user id of calling process. + + + +

Returns:

+
    + + int + user id of calling process +
+ + +

See also:

+ + + +
+
+ + isatty (fd) +
+
+ Test whether a file descriptor refers to a terminal. + + +

Parameters:

+
    +
  • fd + int + file descriptor to act on +
  • +
+ +

Returns:

+
    + + int + 1 if fd is open and refers to a terminal, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + link (target, link[, soft=false]) +
+
+ Create a link. + + +

Parameters:

+
    +
  • target + string + name +
  • +
  • link + string + name +
  • +
  • soft + bool + link + (default false) +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + lseek (fd, offset, whence) +
+
+ reposition read/write file offset + + +

Parameters:

+
    +
  • fd + int + open file descriptor to act on +
  • +
  • offset + int + bytes to seek +
  • +
  • whence + int + one of SEEK_SET, SEEK_CUR or SEEK_END +
  • +
+ +

Returns:

+
    + + int + new offset, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + nice (inc) +
+
+ change process priority + + +

Parameters:

+
    +
  • inc + int + adds inc to the nice value for the calling process +
  • +
+ +

Returns:

+
    + + int + new nice value, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + pathconf (path, key) +
+
+ Get a value for a configuration option for a filename. + + +

Parameters:

+
    +
  • path + string + optional +
  • +
  • key + int + one of _PC_LINK_MAX, _PC_MAX_CANON, _PC_NAME_MAX, + _PC_PIPE_BUF, _PC_CHOWN_RESTRICTED, _PC_NO_TRUNC or + _PC_VDISABLE +
  • +
+ +

Returns:

+
    + + int + associated path configuration value +
+ + +

See also:

+ + +

Usage:

+
    +
    for a, b in pairs (P.pathconf "/dev/tty") do print(a, b) end
    +
+ +
+
+ + pipe () +
+
+ Creates a pipe. + + + +

Returns:

+
    +
  1. + int + read end file descriptor
  2. +
  3. + int + write end file descriptor
  4. +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + read (fd, count) +
+
+ Read bytes from a file. + + +

Parameters:

+
    +
  • fd + int + the file descriptor to act on +
  • +
  • count + int + maximum number of bytes to read +
  • +
+ +

Returns:

+
    + + string + string from fd with at most count bytes, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + readlink (path) +
+
+ Read value of a symbolic link. + + +

Parameters:

+
    +
  • path + string + file to act on +
  • +
+ +

Returns:

+
    + + string + link target, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + rmdir (path) +
+
+ Remove a directory. + + +

Parameters:

+
    +
  • path + string + file to act on +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + setpid (what, id[, gid]) +
+
+ Set the uid, euid, gid, egid, sid or pid & gid. + + +

Parameters:

+
    +
  • what + string + one of 'u', 'U', 'g', 'G', 's', 'p' (upper-case means "effective") +
  • +
  • id + int + (uid, gid or pid for every value of what except 's') +
  • +
  • gid + int + (only for what value 'p') + (optional) +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + sleep (seconds) +
+
+ Sleep for a number of seconds. + + +

Parameters:

+
    +
  • seconds + int + minimum numebr of seconds to sleep +
  • +
+ +

Returns:

+
    + + int + 0 if the requested time has elapsed +
+

Or

+
    + + int + unslept seconds remaining, if interrupted +
+ + +

See also:

+ + + +
+
+ + sync () +
+
+ Commit buffer cache to disk. + + + + + +

See also:

+ + + +
+
+ + sysconf (key) +
+
+ Get configuration information at runtime. + + +

Parameters:

+
    +
  • key + int + one of _SC_ARG_MAX, _SC_CHILD_MAX, _SC_CLK_TCK, _SC_JOB_CONTROL, + _SC_OPEN_MAX, _SC_NGROUPS_MAX, _SC_SAVED_IDS, _SC_STREAM_MAX, + _SC_TZNAME_MAX or _SC_VERSION, +
  • +
+ +

Returns:

+
    + + int + associated system configuration value +
+ + +

See also:

+ + + +
+
+ + ttyname ([fd=0]) +
+
+ Name of a terminal device. + + +

Parameters:

+
    +
  • fd + int + file descriptor to process + (default 0) +
  • +
+ +

Returns:

+
    + + string name +
+ + +

See also:

+ + + +
+
+ + unlink (path) +
+
+ Unlink a file. + + +

Parameters:

+ + +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + write (fd, buf) +
+
+ Write bytes to a file. + + +

Parameters:

+
    +
  • fd + int + the file descriptor to act on +
  • +
  • buf + string + containing bytes to write +
  • +
+ +

Returns:

+
    + + int + number of bytes written, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+

Constants

+ + +
+
+ + posix.unistd +
+
+ Standard constants. +Any constants not available in the underlying system will be nil valued. + + +

Fields:

+
    +
  • _PC_CHOWN_RESTRICTED + int + return 1 if chown requires appropriate privileges, 0 otherwise +
  • +
  • _PC_LINK_MAX + int + maximum file link count +
  • +
  • _PC_MAX_CANON + int + maximum bytes in terminal canonical input line +
  • +
  • _PC_MAX_INPUT + int + maximum number of bytes in a terminal input queue +
  • +
  • _PC_NAME_MAX + int + maximum number of bytes in a file name +
  • +
  • _PC_NO_TRUNC + int + return 1 if over-long file names are truncated +
  • +
  • _PC_PATH_MAXmaximum + int + number of bytes in a pathname +
  • +
  • _PC_PIPE_BUF + int + maximum number of bytes in an atomic pipe write +
  • +
  • _PC_VDISABLE + int + terminal character disabling value +
  • +
  • _SC_ARG_MAX + int + maximum bytes of argument to posix.unistd.execp +
  • +
  • _SC_CHILD_MAX + int + maximum number of processes per user +
  • +
  • _SC_CLK_TCK + int + statistics clock frequency +
  • +
  • _SC_JOB_CONTROL + int + return 1 if system has job control, -1 otherwise +
  • +
  • _SC_NGROUPS_MAX + int + maximum number of supplemental groups +
  • +
  • _SC_OPEN_MAX + int + maximum number of open files per user +
  • +
  • _SC_SAVED_IDS + int + return 1 if system supports saved user and group ids, -1 otherwise +
  • +
  • _SC_STREAM_MAX + int + maximum number of streams per process +
  • +
  • _SC_TZNAME_MAX + int + maximum number of timezone types +
  • +
  • _SC_VERSION + int + POSIX.1 compliance version +
  • +
  • SEEK_CUR + int + relative file pointer position +
  • +
  • SEEK_END + int + set file pointer to the end of file +
  • +
  • SEEK_SET + int + absolute file pointer position +
  • +
  • STDERR_FILENO + int + standard error file descriptor +
  • +
  • STDIN_FILENO + int + standard input file descriptor +
  • +
  • STDOUT_FILENO + int + standard output file descriptor +
  • +
+ + + + +

Usage:

+
    +
    +  -- Print unistd constants supported on this host.
    +  for name, value in pairs (require "posix.unistd") do
    +    if type (value) == "number" then
    +      print (name, value)
    +     end
    +  end
    +
+ +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/doc/modules/posix.utime.html b/doc/modules/posix.utime.html new file mode 100644 index 0000000..950a941 --- /dev/null +++ b/doc/modules/posix.utime.html @@ -0,0 +1,187 @@ + + + + + luaposix 33.3.0 Reference + + + + +
+ +
+ +
+
+
+ + +
+ + + + + + +
+ +

Module posix.utime

+

Set File Times.

+

+ +

+ + +

Functions

+ + + + + +
utime (path[, mtime=now[, atime=now]])Change file last access and modification times.
+ +
+
+ + +

Functions

+ +
+
+ + utime (path[, mtime=now[, atime=now]]) +
+
+ Change file last access and modification times. + + +

Parameters:

+
    +
  • path + string + existing file path +
  • +
  • mtime + int + modification time + (default now) +
  • +
  • atime + int + access time + (default now) +
  • +
+ +

Returns:

+
    + + int + 0, if successful +
+

Or

+
    +
  1. + nil
  2. +
  3. + string + error message
  4. +
  5. + int + errnum
  6. +
+ + +

See also:

+ + + +
+
+ + +
+
+
+generated by LDoc 1.4.3 +Last updated 2015-03-01 09:06:02 +
+
+ + diff --git a/examples/dir.lua b/examples/dir.lua new file mode 100644 index 0000000..a0acba8 --- /dev/null +++ b/examples/dir.lua @@ -0,0 +1,10 @@ +local dirent = require "posix.dirent" + +local ok, files = pcall (dirent.dir "/var/log") +if not ok then + print ("/var/log: " .. files) +end + +for _, f in ipairs (files) do + print (f) +end diff --git a/examples/fork.lua b/examples/fork.lua new file mode 100644 index 0000000..0d2bb71 --- /dev/null +++ b/examples/fork.lua @@ -0,0 +1,20 @@ +-- Lua version of example from pipe(2) +local p = require 'posix' +local r,w = p.pipe() +local cpid = p.fork() +if cpid == 0 then -- child reads from pipe + p.close(w) -- close unused write end + local b = p.read(r,1) + while #b == 1 do + io.write(b) + b = p.read(r,1) + end + p.close(r) + p._exit(0) +else -- parent writes to pipe + p.close(r) + p.write(w,"hello dolly\n") + p.close(w) + -- wait for child to finish + p.wait(cpid) +end diff --git a/examples/fork2.lua b/examples/fork2.lua new file mode 100644 index 0000000..34c98ae --- /dev/null +++ b/examples/fork2.lua @@ -0,0 +1,20 @@ +require "posix" + +print ("parent: my pid is: " .. posix.getpid ("pid")) + +local pid = posix.fork () + +if pid == -1 then + print ("parent: The fork failed.") +elseif pid == 0 then + print ("child: Hello World! I am pid: " .. posix.getpid ("pid")) + print ("child: I'll sleep for 1 second ... ") + posix.sleep (1) + print ("child: Good bye"); +else + print ("parent: While the child sleeps, I'm still running.") + print ("parent: waiting for child (pid:" .. pid .. ") to die...") + posix.wait (pid) + print ("parent: child died, but I'm still alive.") + print ("parent: Good bye") +end diff --git a/examples/getopt.lua b/examples/getopt.lua new file mode 100644 index 0000000..bc4fd95 --- /dev/null +++ b/examples/getopt.lua @@ -0,0 +1,26 @@ +local P = require 'posix' + +local short = "ha:s:" + +local long = { + {"help", "none", 'h'}, + {"aleph", "required", 'a'}, + {"start", "required", 's'} +} + +local last_index = 1 +for r, optarg, optind, li in P.getopt (arg, short, long) do + if r == '?' then + return print 'unrecognized option' + end + last_index = optind + if r == 'h' then + print 'help' + elseif r == 'a' or r == 's' then + print ('we were passed', r, optarg) + end +end + +for i = last_index, #arg do + print (i, arg[i]) +end diff --git a/examples/glob.lua b/examples/glob.lua new file mode 100644 index 0000000..bd9b508 --- /dev/null +++ b/examples/glob.lua @@ -0,0 +1,5 @@ +local posix = require "posix" + +for i, j in pairs (posix.glob ("/proc/[0-9]*/exe")) do + print(j) +end diff --git a/examples/limit.lua b/examples/limit.lua new file mode 100644 index 0000000..a47d11f --- /dev/null +++ b/examples/limit.lua @@ -0,0 +1,20 @@ +-- limit.lua +-- Limiting the CPU time used by a child process; +-- it will be killed and we don't get the final message + +local posix = require 'posix' + +posix.setrlimit ('cpu',1,1) + +local t = posix.times 'elapsed' + +local pid = posix.fork () +if pid == 0 then -- child + print 'start' + for i = 1, 1e9 do + end + print 'finish' +else + print (posix.wait (pid)) + print (posix.times 'elapsed' - t) +end diff --git a/examples/lock.lua b/examples/lock.lua new file mode 100644 index 0000000..05685ae --- /dev/null +++ b/examples/lock.lua @@ -0,0 +1,21 @@ +local p = require "posix" +local fd = p.creat("file.txt", "rw-r--r--") + +-- Set lock on file +local lock = { + l_type = p.F_WRLCK; -- Exclusive lock + l_whence = p.SEEK_SET; -- Relative to beginning of file + l_start = 0; -- Start from 1st byte + l_len = 0; -- Lock whole file + } +local result = p.fcntl(fd, p.F_SETLK, lock) +if result == -1 then + error("file locked by another process") +end + +-- Do something with file while it's locked +p.write(fd, "Lorem ipsum\n") + +-- Release the lock +lock.l_type = p.F_UNLCK +p.fcntl(fd, p.F_SETLK, lock) diff --git a/examples/netlink-uevent.lua b/examples/netlink-uevent.lua new file mode 100755 index 0000000..24c9f50 --- /dev/null +++ b/examples/netlink-uevent.lua @@ -0,0 +1,18 @@ +p = require "posix" + +if p.AF_NETLINK ~= nil then + local fd, err = p.socket(p.AF_NETLINK, p.SOCK_DGRAM, p.NETLINK_KOBJECT_UEVENT) + assert(fd, err) + + local ok, err = p.bind(fd, { family = p.AF_NETLINK, pid = p.getpid("pid"), groups = -1 }) + assert(ok, err) + + while true do + local data, err = p.recv(fd, 16384) + assert(data, err) + for k, v in data:gmatch("%z(%u+)=([^%z]+)") do + print(k, v) + end + print("\n") + end +end diff --git a/examples/ping.lua b/examples/ping.lua new file mode 100644 index 0000000..7b88a09 --- /dev/null +++ b/examples/ping.lua @@ -0,0 +1,31 @@ +local p = require "posix" + +if p.SOCK_RAW and p.SO_BINDTODEVICE then + -- Open raw socket + + local fd, err = p.socket(p.AF_INET, p.SOCK_RAW, p.IPPROTO_ICMP) + assert(fd, err) + + -- Optionally, bind to specific device + + local ok, err = p.setsockopt(fd, p.SOL_SOCKET, p.SO_BINDTODEVICE, "wlan0") + assert(ok, err) + + -- Create raw ICMP echo (ping) message + + local data = string.char(0x08, 0x00, 0x89, 0x98, 0x6e, 0x63, 0x00, 0x04, 0x00) + + -- Send message + + local ok, err = p.sendto(fd, data, { family = p.AF_INET, addr = "8.8.8.8", port = 0 }) + assert(ok, err) + + -- Read reply + + local data, sa = p.recvfrom(fd, 1024) + assert(data, sa) + + if data then + print("Received ICMP message from " .. sa.addr) + end +end diff --git a/examples/poll.lua b/examples/poll.lua new file mode 100644 index 0000000..faa88ca --- /dev/null +++ b/examples/poll.lua @@ -0,0 +1,24 @@ +local P = require 'posix' + +local fd1 = P.open(arg[1], P.O_RDONLY) +local fd2 = P.open(arg[2], P.O_RDONLY) + +local fds = { + [fd1] = { events = {IN=true} }, + [fd2] = { events = {IN=true} } +} + +while true do + P.poll(fds,-1) + for fd in pairs(fds) do + if fds[fd].revents.IN then + local res = P.read(fd,1024) + P.write(1,res); + end + if fds[fd].revents.HUP then + P.close(fd) + fds[fd] = nil + if not next(fds) then return end + end + end +end diff --git a/examples/signal.lua b/examples/signal.lua new file mode 100644 index 0000000..b222d88 --- /dev/null +++ b/examples/signal.lua @@ -0,0 +1,62 @@ +local sig = require "posix.signal" +local unistd = require "posix.unistd" +local syswait = require "posix.sys.wait" + +local function go (fn, ...) + local cpid = unistd.fork () + if cpid == 0 then -- run function as child + unistd._exit (fn (...) or 0) + else + return cpid + end +end + +local verbose = #arg > 0 + +local function sleepx (secs) + while true do + secs = unistd.sleep (secs) + if verbose then print ("sleep", secs) end + if secs == 0 then return end + end +end + +local nchild, nsig = 0, 0 + +sig.signal (sig.SIGCHLD, function() + local pid, status, code = syswait.wait (-1, syswait.WNOHANG) + while pid do + if pid ~= 0 then + if verbose then print ("wait", pid, status, code) end + nchild = nchild + 1 + end + pid, status, code = syswait.wait (-1, syswait.WNOHANG) + end +end) + +local function handler (signo) + if verbose then print ("handled", signo) end + nsig = nsig + 1 +end + +sig.signal (sig.SIGUSR1, handler) +sig.signal (sig.SIGUSR2, handler) +sig.signal (60, handler) + +local function killp (nsig) + return sig.kill (unistd.getppid (), nsig) +end + +c1 = go (function() unistd.sleep (1); killp (sig.SIGUSR1); killp (sig.SIGUSR2) end) +c2 = go (function() unistd.sleep (2); killp (sig.SIGUSR2); end) +c3 = go (function() unistd.sleep (2); killp (sig.SIGUSR1) end) + +sleepx(3) + +if verbose then + print ("children", nchild, "signals", nsig) +else + assert (nchild == 3) + assert (nsig == 4) + print '+++ tests OK +++' +end diff --git a/examples/socket.lua b/examples/socket.lua new file mode 100644 index 0000000..6d31f69 --- /dev/null +++ b/examples/socket.lua @@ -0,0 +1,45 @@ +local sig = require "posix.signal" +local sock = require "posix.sys.socket" +local unistd = require "posix.unistd" + +sig.signal (sig.SIGPIPE, function () print "pipe" end) + +-- Get Lua web site title +local r, err = sock.getaddrinfo ("www.lua.org", "http", { family = sock.AF_INET, socktype = sock.SOCK_STREAM }) +if not r then error (err) end + +local fd = sock.socket (sock.AF_INET, sock.SOCK_STREAM, 0) +local ok, err, e = sock.connect (fd, r[1]) +local sa = sock.getsockname(fd) +print("Local socket bound to " .. sa.addr .. ":" .. tostring(sa.port)) +if err then error (err) end + +sock.send (fd, "GET / HTTP/1.0\r\nHost: www.lua.org\r\n\r\n") +local data = {} +while true do + local b = sock.recv (fd, 1024) + if not b or #b == 0 then + break + end + table.insert (data, b) +end +unistd.close (fd) +data = table.concat (data) +print (data:match "(.+)") + +-- Loopback UDP test, IPV4 and IPV6 +local fd = sock.socket (sock.AF_INET6, sock.SOCK_DGRAM, 0) +sock.bind (fd, { family = sock.AF_INET6, addr = "::", port = 9999 }) +sock.sendto (fd, "Test ipv4", { family = sock.AF_INET, addr = "127.0.0.1", port = 9999 }) +sock.sendto (fd, "Test ipv6", { family = sock.AF_INET6, addr = "::", port = 9999 }) +for i = 1, 2 do + local ok, r = sock.recvfrom (fd, 1024) + if ok then + print (ok, r.addr, r.port) + else + print (ok, r) + end +end +unistd.close (fd) + +os.exit (0) diff --git a/examples/termios.lua b/examples/termios.lua new file mode 100644 index 0000000..2f0a6f9 --- /dev/null +++ b/examples/termios.lua @@ -0,0 +1,67 @@ +local p = require "posix" +local dev = arg[1] or "/dev/ttyUSB0" + +-- Open serial port and do settings + +local fds, err = p.open(dev, p.O_RDWR + p.O_NONBLOCK); +if not fds then + print("Could not open serial port " .. dev .. ":", err) + os.exit(1) +end + +p.tcsetattr(fds, 0, { + cflag = p.B115200 + p.CS8 + p.CLOCAL + p.CREAD, + iflag = p.IGNPAR, + oflag = p.OPOST, + cc = { + [p.VTIME] = 0, + [p.VMIN] = 1 + } +}) + +-- Set stdin to non canonical mode. Save current settings + +local save = p.tcgetattr(0) +p.tcsetattr(0, 0, { + cc = { + [p.VTIME] = 0, + [p.VMIN] = 1 + } +}) + +-- Loop, reading and writing between ports. ^C stops + +local set = { + [0] = { events = { IN = true } }, + [fds] = { events = { IN = true } }, +} + +p.write(1, "Starting terminal, hit ^C to exit\r\n") + +local function exit(msg) + p.tcsetattr(0, 0, save) + print("\n") + print(msg) + os.exit(0) +end + +while true do + local r = p.poll(set, -1) + for fd, d in pairs(set) do + if d.revents and d.revents.IN then + if fd == 0 then + local d, err = p.read(0, 1024) + if not d then exit(err) end + if d == string.char(3) then exit("Bye") end + local ok, err = p.write(fds, d) + if not ok then exit(err) end + end + if fd == fds then + local d, err = p.read(fds, 1024) + if not d then exit(err) end + local ok, err = p.write(1, d) + if not ok then exit(err) end + end + end + end +end diff --git a/examples/tree.lua b/examples/tree.lua new file mode 100644 index 0000000..abe4946 --- /dev/null +++ b/examples/tree.lua @@ -0,0 +1,56 @@ +-- tree view of the file system like the "tree" unix utility +-- John Belmonte + +local posix = require 'posix' + +local leaf_indent = '| ' +local tail_leaf_indent = ' ' +local leaf_prefix = '|-- ' +local tail_leaf_prefix = '`-- ' +local link_prefix = ' -> ' + +local function printf(...) + io.write(string.format(...)) +end + +local function do_directory(directory, level, prefix) + local num_dirs = 0 + local num_files = 0 + local files = posix.dir(directory) + local last_file_index = #files + table.sort(files) + for i, name in ipairs(files) do + if name ~= '.' and name ~= '..' then + local full_name = string.format('%s/%s', directory, name) + local info = assert(posix.stat(full_name)) + local is_tail = (i==last_file_index) + local prefix2 = is_tail and tail_leaf_prefix or leaf_prefix + local link = '' + if info.type == 'link' then + linked_name = assert(posix.readlink(full_name)) + link = string.format('%s%s', link_prefix, linked_name) + end + printf('%s%s%s%s\n', prefix, prefix2, name, link) + if info.type == 'directory' then + local indent = is_tail and tail_leaf_indent or leaf_indent + -- TODO: cache string concatination + sub_dirs, sub_files = do_directory(full_name, level+1, + prefix .. indent) + num_dirs = num_dirs + sub_dirs + 1 + num_files = num_files + sub_files + else + num_files = num_files + 1 + end + end + end + return num_dirs, num_files +end + +local function fore(directory) + print(directory) + num_dirs, num_files = do_directory(directory, 0, '') + printf('\n%d directories, %d files\n', num_dirs, num_files) +end + +directory = (arg and #arg > 0) and arg[1] or '.' +fore(directory) diff --git a/ext/include/_helpers.c b/ext/include/_helpers.c new file mode 100644 index 0000000..48a33bc --- /dev/null +++ b/ext/include/_helpers.c @@ -0,0 +1,427 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ + +#ifndef LUAPOSIX__HELPERS_C +#define LUAPOSIX__HELPERS_C 1 + +#include + +#include +#include +#include +#include +#include +#include +#include /* for _POSIX_VERSION */ + +#if HAVE_CURSES +# if HAVE_NCURSESW_CURSES_H +# include +# elif HAVE_NCURSESW_H +# include +# elif HAVE_NCURSES_CURSES_H +# include +# elif HAVE_NCURSES_H +# include +# elif HAVE_CURSES_H +# include +# endif +#include +#endif + +/* Some systems set _POSIX_C_SOURCE over _POSIX_VERSION! */ +#if _POSIX_C_SOURCE >= 200112L || _POSIX_VERSION >= 200112L || _XOPEN_SOURCE >= 600 +# define LPOSIX_2001_COMPLIANT 1 +#endif + +#if _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700 +# define LPOSIX_2008_COMPLIANT 1 +# ifndef LPOSIX_2001_COMPLIANT +# define LPOSIX_2001_COMPLIANT +# endif +#endif + +/* NetBSD's default curses implementation is not quite complete. This + disables those missing functions unless linked to ncurses instead. */ +#if defined NCURSES_VERSION || !defined __NetBSD__ +# define LPOSIX_CURSES_COMPLIANT 1 +#endif + +#include "lua.h" +#include "lualib.h" +#include "lauxlib.h" + +#if LUA_VERSION_NUM < 503 +# define lua_isinteger lua_isnumber +# if LUA_VERSION_NUM == 501 +# include "compat-5.2.c" +# endif +#endif + +#if LUA_VERSION_NUM == 502 || LUA_VERSION_NUM == 503 +# define lua_objlen lua_rawlen +# define lua_strlen lua_rawlen +# define luaL_openlib(L,n,l,nup) luaL_setfuncs((L),(l),(nup)) +# define luaL_register(L,n,l) (luaL_newlib(L,l)) +#endif + +#ifndef STREQ +# define STREQ(a, b) (strcmp (a, b) == 0) +#endif + +/* Mark unused parameters required only to match a function type + specification. */ +#ifdef __GNUC__ +# define LPOSIX_UNUSED(x) UNUSED_ ## x __attribute__((__unused__)) +#else +# define LPOSIX_UNUSED(x) UNUSED_ ## x +#endif + +/* LPOSIX_STMT_BEG/END are used to create macros that expand to a + single compound statement in a portable way. */ +#if defined __GNUC__ && !defined __STRICT_ANSI__ && !defined __cplusplus +# define LPOSIX_STMT_BEG (void)( +# define LPOSIX_STMT_END ) +#else +# if (defined sun || defined __sun__) +# define LPOSIX_STMT_BEG if (1) +# define LPOSIX_STMT_END else (void)0 +# else +# define LPOSIX_STMT_BEG do +# define LPOSIX_STMT_END while (0) +# endif +#endif + + +/* The extra indirection to these macros is required so that if the + arguments are themselves macros, they will get expanded too. */ +#define LPOSIX__SPLICE(_s, _t) _s##_t +#define LPOSIX_SPLICE(_s, _t) LPOSIX__SPLICE(_s, _t) + +#define LPOSIX__STR(_s) #_s +#define LPOSIX_STR(_s) LPOSIX__STR(_s) + +/* The +1 is to step over the leading '_' that is required to prevent + premature expansion of MENTRY arguments if we didn't add it. */ +#define LPOSIX__STR_1(_s) (#_s + 1) +#define LPOSIX_STR_1(_s) LPOSIX__STR_1(_s) + +#define LPOSIX_CONST(_f) LPOSIX_STMT_BEG { \ + lua_pushinteger(L, _f); \ + lua_setfield(L, -2, #_f); \ + } LPOSIX_STMT_END + +#define LPOSIX_FUNC(_s) {LPOSIX_STR_1(_s), (_s)} + +#define pushokresult(b) pushboolresult((int) (b) == OK) + +#ifndef errno +extern int errno; +#endif + + +/* ========================= * + * Bad argument diagnostics. * + * ========================= */ + + +static int +argtypeerror(lua_State *L, int narg, const char *expected) +{ + const char *got = luaL_typename(L, narg); + return luaL_argerror(L, narg, + lua_pushfstring(L, "%s expected, got %s", expected, got)); +} + +static void +checktype(lua_State *L, int narg, int t, const char *expected) +{ + if (lua_type(L, narg) != t) + argtypeerror (L, narg, expected); +} + +static lua_Integer +checkinteger(lua_State *L, int narg, const char *expected) +{ + lua_Integer d = lua_tointeger(L, narg); + if (d == 0 && !lua_isinteger(L, narg)) + argtypeerror(L, narg, expected); + return d; +} + +static int +checkint(lua_State *L, int narg) +{ + return (int)checkinteger(L, narg, "int"); +} + +static long +checklong(lua_State *L, int narg) +{ + return (long)checkinteger(L, narg, "int"); +} + + +#if HAVE_CURSES +static chtype +checkch(lua_State *L, int narg) +{ + if (lua_isnumber(L, narg)) + return (chtype)checkint(L, narg); + if (lua_isstring(L, narg)) + return *lua_tostring(L, narg); + + return argtypeerror(L, narg, "int or char"); +} + + +static chtype +optch(lua_State *L, int narg, chtype def) +{ + if (lua_isnoneornil(L, narg)) + return def; + if (lua_isnumber(L, narg) || lua_isstring(L, narg)) + return checkch(L, narg); + return argtypeerror(L, narg, "int or char or nil"); +} +#endif + + +static int +optboolean(lua_State *L, int narg, int def) +{ + if (lua_isnoneornil(L, narg)) + return def; + checktype (L, narg, LUA_TBOOLEAN, "boolean or nil"); + return (int)lua_toboolean(L, narg); +} + +static int +optint(lua_State *L, int narg, lua_Integer def) +{ + if (lua_isnoneornil(L, narg)) + return (int) def; + return (int)checkinteger(L, narg, "int or nil"); +} + +static const char * +optstring(lua_State *L, int narg, const char *def) +{ + const char *s; + if (lua_isnoneornil(L, narg)) + return def; + s = lua_tolstring(L, narg, NULL); + if (!s) + argtypeerror(L, narg, "string or nil"); + return s; +} + +static void +checknargs(lua_State *L, int maxargs) +{ + int nargs = lua_gettop(L); + lua_pushfstring(L, "no more than %d argument%s expected, got %d", + maxargs, maxargs == 1 ? "" : "s", nargs); + luaL_argcheck(L, nargs <= maxargs, maxargs + 1, lua_tostring (L, -1)); + lua_pop(L, 1); +} + +/* Try a lua_getfield from the table on the given index. On success the field + * is pushed and 0 is returned, on failure nil and an error message is pushed and 2 + * is returned */ +static void +checkfieldtype(lua_State *L, int index, const char *k, int expect_type, const char *expected) +{ + int got_type; + lua_getfield(L, index, k); + got_type = lua_type(L, -1); + + if (expected == NULL) + expected = lua_typename(L, expect_type); + + lua_pushfstring(L, "%s expected for field '%s', got %s", + expected, k, got_type == LUA_TNIL ? "no value" : lua_typename(L, got_type)); + luaL_argcheck(L, got_type == expect_type, index, lua_tostring(L, -1)); + lua_pop(L, 1); +} + +#define NEXT_IKEY -2 +#define NEXT_IVALUE -1 +static void +checkismember(lua_State *L, int index, int n, const char *const S[]) +{ + /* Diagnose non-string type field names. */ + int got_type = lua_type(L, NEXT_IKEY); + luaL_argcheck(L, lua_isstring(L, NEXT_IKEY), index, + lua_pushfstring(L, "invalid %s field name", lua_typename(L, got_type))); + + /* Check field name is listed in S. */ + { + const char *k = lua_tostring(L, NEXT_IKEY); + int i; + for (i = 0; i < n; ++i) + if (STREQ(S[i], k)) return; + } + + + /* Diagnose invalid field name. */ + luaL_argcheck(L, 0, index, + lua_pushfstring(L, "invalid field name '%s'", lua_tostring(L, NEXT_IKEY))); +} +#undef NEXT_IKEY +#undef NEXT_IVALUE + +static void +checkfieldnames(lua_State *L, int index, int n, const char * const S[]) +{ + for (lua_pushnil(L); lua_next(L, index); lua_pop(L, 1)) + checkismember(L, index, n, S); +} +#define checkfieldnames(L,i,S) (checkfieldnames)(L,i,sizeof(S)/sizeof(*S),S) + +static int +checkintfield(lua_State *L, int index, const char *k) +{ + int r; + checkfieldtype(L, index, k, LUA_TNUMBER, "int"); + r = lua_tointeger(L, -1); + lua_pop(L, 1); + return r; +} + +static int +checknumberfield(lua_State *L, int index, const char *k) +{ + int r; + checkfieldtype(L, index, k, LUA_TNUMBER, "number"); + r = lua_tonumber(L, -1); + lua_pop(L, 1); + return r; +} + +static const char * +checkstringfield(lua_State *L, int index, const char *k) +{ + const char *r; + checkfieldtype(L, index, k, LUA_TSTRING, NULL); + r = lua_tostring(L, -1); + lua_pop(L, 1); + return r; +} + +static int +optintfield(lua_State *L, int index, const char *k, int def) +{ + int got_type; + lua_getfield(L, index, k); + got_type = lua_type(L, -1); + lua_pop(L, 1); + if (got_type == LUA_TNONE || got_type == LUA_TNIL) + return def; + return checkintfield(L, index, k); +} + +static const char * +optstringfield(lua_State *L, int index, const char *k, const char *def) +{ + const char *r; + int got_type; + got_type = lua_type(L, -1); + lua_pop(L, 1); + if (got_type == LUA_TNONE || got_type == LUA_TNIL) + return def; + return checkstringfield(L, index, k); +} + +static int +pusherror(lua_State *L, const char *info) +{ + lua_pushnil(L); + if (info==NULL) + lua_pushstring(L, strerror(errno)); + else + lua_pushfstring(L, "%s: %s", info, strerror(errno)); + lua_pushinteger(L, errno); + return 3; +} + +#define pushboolresult(b) (lua_pushboolean(L, (b)), 1) + +#define pushintresult(n) (lua_pushinteger(L, (n)), 1) + +#define pushstringresult(s) (lua_pushstring(L, (s)), 1) + +static int +pushresult(lua_State *L, int i, const char *info) +{ + if (i==-1) + return pusherror(L, info); + return pushintresult(i); +} + +static void +badoption(lua_State *L, int i, const char *what, int option) +{ + luaL_argerror(L, i, + lua_pushfstring(L, "invalid %s option '%c'", what, option)); +} + + + +/* ================== * + * Utility functions. * + * ================== */ + + +static int +binding_notimplemented(lua_State *L, const char *fname, const char *libname) +{ + lua_pushnil(L); + lua_pushfstring(L, "'%s' is not implemented by host %s library", + fname, libname); + return 2; +} + + +#define pushintegerfield(k,v) LPOSIX_STMT_BEG { \ + lua_pushinteger(L, (lua_Integer) v); lua_setfield(L, -2, k); \ +} LPOSIX_STMT_END + +#define pushnumberfield(k,v) LPOSIX_STMT_BEG { \ + lua_pushnumber(L, (lua_Number) v); lua_setfield(L, -2, k); \ +} LPOSIX_STMT_END + +#define pushstringfield(k,v) LPOSIX_STMT_BEG { \ + if (v) { \ + lua_pushstring(L, (const char *) v); \ + lua_setfield(L, -2, k); \ + } \ +} LPOSIX_STMT_END + +#define pushliteralfield(k,v) LPOSIX_STMT_BEG { \ + if (v) { \ + lua_pushliteral(L, v); \ + lua_setfield(L, -2, k); \ + } \ +} LPOSIX_STMT_END + +#define settypemetatable(t) LPOSIX_STMT_BEG { \ + if (luaL_newmetatable(L, t) == 1) \ + pushliteralfield("_type", t); \ + lua_setmetatable(L, -2); \ +} LPOSIX_STMT_END + +#define setintegerfield(_p, _n) pushintegerfield(LPOSIX_STR(_n), _p->_n) +#define setnumberfield(_p, _n) pushnumberfield(LPOSIX_STR(_n), _p->_n) +#define setstringfield(_p, _n) pushstringfield(LPOSIX_STR(_n), _p->_n) + +#endif /*LUAPOSIX__HELPERS_C*/ diff --git a/ext/include/compat-5.2.c b/ext/include/compat-5.2.c new file mode 100644 index 0000000..edd0d99 --- /dev/null +++ b/ext/include/compat-5.2.c @@ -0,0 +1,682 @@ +#include +#include + +#include "lua.h" +#include "lauxlib.h" +#include "compat-5.2.h" + +#if !defined(LUA_VERSION_NUM) || LUA_VERSION_NUM == 501 + +int lua_absindex (lua_State *L, int i) { + if (i < 0 && i > LUA_REGISTRYINDEX) + i += lua_gettop(L) + 1; + return i; +} + + +void lua_copy (lua_State *L, int from, int to) { + int abs_to = lua_absindex(L, to); + luaL_checkstack(L, 1, "not enough stack slots"); + lua_pushvalue(L, from); + lua_replace(L, abs_to); +} + + +void lua_rawgetp (lua_State *L, int i, const void *p) { + int abs_i = lua_absindex(L, i); + lua_pushlightuserdata(L, (void*)p); + lua_rawget(L, abs_i); +} + +void lua_rawsetp (lua_State *L, int i, const void *p) { + int abs_i = lua_absindex(L, i); + luaL_checkstack(L, 1, "not enough stack slots"); + lua_pushlightuserdata(L, (void*)p); + lua_insert(L, -2); + lua_rawset(L, abs_i); +} + + +void *luaL_testudata (lua_State *L, int i, const char *tname) { + void *p = lua_touserdata(L, i); + luaL_checkstack(L, 2, "not enough stack slots"); + if (p == NULL || !lua_getmetatable(L, i)) + return NULL; + else { + int res = 0; + luaL_getmetatable(L, tname); + res = lua_rawequal(L, -1, -2); + lua_pop(L, 2); + if (!res) + p = NULL; + } + return p; +} + + +lua_Number lua_tonumberx (lua_State *L, int i, int *isnum) { + lua_Number n = lua_tonumber(L, i); + if (isnum != NULL) { + *isnum = (n != 0 || lua_isnumber(L, i)); + } + return n; +} + + +#define PACKAGE_KEY "_COMPAT52_PACKAGE" + +static void push_package_table (lua_State *L) { + lua_pushliteral(L, PACKAGE_KEY); + lua_rawget(L, LUA_REGISTRYINDEX); + if (!lua_istable(L, -1)) { + lua_pop(L, 1); + /* try to get package table from globals */ + lua_pushliteral(L, "package"); + lua_rawget(L, LUA_GLOBALSINDEX); + if (lua_istable(L, -1)) { + lua_pushliteral(L, PACKAGE_KEY); + lua_pushvalue(L, -2); + lua_rawset(L, LUA_REGISTRYINDEX); + } + } +} + +void lua_getuservalue (lua_State *L, int i) { + luaL_checktype(L, i, LUA_TUSERDATA); + luaL_checkstack(L, 2, "not enough stack slots"); + lua_getfenv(L, i); + lua_pushvalue(L, LUA_GLOBALSINDEX); + if (lua_rawequal(L, -1, -2)) { + lua_pop(L, 1); + lua_pushnil(L); + lua_replace(L, -2); + } else { + lua_pop(L, 1); + push_package_table(L); + if (lua_rawequal(L, -1, -2)) { + lua_pop(L, 1); + lua_pushnil(L); + lua_replace(L, -2); + } else + lua_pop(L, 1); + } +} + +void lua_setuservalue (lua_State *L, int i) { + luaL_checktype(L, i, LUA_TUSERDATA); + if (lua_isnil(L, -1)) { + luaL_checkstack(L, 1, "not enough stack slots"); + lua_pushvalue(L, LUA_GLOBALSINDEX); + lua_replace(L, -2); + } + lua_setfenv(L, i); +} + + +/* +** Adapted from Lua 5.2.0 +*/ +void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) { + luaL_checkstack(L, nup+1, "too many upvalues"); + for (; l->name != NULL; l++) { /* fill the table with given functions */ + int i; + lua_pushstring(L, l->name); + for (i = 0; i < nup; i++) /* copy upvalues to the top */ + lua_pushvalue(L, -(nup + 1)); + lua_pushcclosure(L, l->func, nup); /* closure with those upvalues */ + lua_settable(L, -(nup + 3)); /* table must be below the upvalues, the name and the closure */ + } + lua_pop(L, nup); /* remove upvalues */ +} + + +void luaL_setmetatable (lua_State *L, const char *tname) { + luaL_checkstack(L, 1, "not enough stack slots"); + luaL_getmetatable(L, tname); + lua_setmetatable(L, -2); +} + + +int luaL_getsubtable (lua_State *L, int i, const char *name) { + int abs_i = lua_absindex(L, i); + luaL_checkstack(L, 3, "not enough stack slots"); + lua_pushstring(L, name); + lua_gettable(L, abs_i); + if (lua_istable(L, -1)) + return 1; + lua_pop(L, 1); + lua_newtable(L); + lua_pushstring(L, name); + lua_pushvalue(L, -2); + lua_settable(L, abs_i); + return 0; +} + + +#if !defined(COMPAT52_IS_LUAJIT) +static int countlevels (lua_State *L) { + lua_Debug ar; + int li = 1, le = 1; + /* find an upper bound */ + while (lua_getstack(L, le, &ar)) { li = le; le *= 2; } + /* do a binary search */ + while (li < le) { + int m = (li + le)/2; + if (lua_getstack(L, m, &ar)) li = m + 1; + else le = m; + } + return le - 1; +} + +static int findfield (lua_State *L, int objidx, int level) { + if (level == 0 || !lua_istable(L, -1)) + return 0; /* not found */ + lua_pushnil(L); /* start 'next' loop */ + while (lua_next(L, -2)) { /* for each pair in table */ + if (lua_type(L, -2) == LUA_TSTRING) { /* ignore non-string keys */ + if (lua_rawequal(L, objidx, -1)) { /* found object? */ + lua_pop(L, 1); /* remove value (but keep name) */ + return 1; + } + else if (findfield(L, objidx, level - 1)) { /* try recursively */ + lua_remove(L, -2); /* remove table (but keep name) */ + lua_pushliteral(L, "."); + lua_insert(L, -2); /* place '.' between the two names */ + lua_concat(L, 3); + return 1; + } + } + lua_pop(L, 1); /* remove value */ + } + return 0; /* not found */ +} + +static int pushglobalfuncname (lua_State *L, lua_Debug *ar) { + int top = lua_gettop(L); + lua_getinfo(L, "f", ar); /* push function */ + lua_pushvalue(L, LUA_GLOBALSINDEX); + if (findfield(L, top + 1, 2)) { + lua_copy(L, -1, top + 1); /* move name to proper place */ + lua_pop(L, 2); /* remove pushed values */ + return 1; + } + else { + lua_settop(L, top); /* remove function and global table */ + return 0; + } +} + +static void pushfuncname (lua_State *L, lua_Debug *ar) { + if (*ar->namewhat != '\0') /* is there a name? */ + lua_pushfstring(L, "function " LUA_QS, ar->name); + else if (*ar->what == 'm') /* main? */ + lua_pushliteral(L, "main chunk"); + else if (*ar->what == 'C') { + if (pushglobalfuncname(L, ar)) { + lua_pushfstring(L, "function " LUA_QS, lua_tostring(L, -1)); + lua_remove(L, -2); /* remove name */ + } + else + lua_pushliteral(L, "?"); + } + else + lua_pushfstring(L, "function <%s:%d>", ar->short_src, ar->linedefined); +} + +#define LEVELS1 12 /* size of the first part of the stack */ +#define LEVELS2 10 /* size of the second part of the stack */ + +void luaL_traceback (lua_State *L, lua_State *L1, + const char *msg, int level) { + lua_Debug ar; + int top = lua_gettop(L); + int numlevels = countlevels(L1); + int mark = (numlevels > LEVELS1 + LEVELS2) ? LEVELS1 : 0; + if (msg) lua_pushfstring(L, "%s\n", msg); + lua_pushliteral(L, "stack traceback:"); + while (lua_getstack(L1, level++, &ar)) { + if (level == mark) { /* too many levels? */ + lua_pushliteral(L, "\n\t..."); /* add a '...' */ + level = numlevels - LEVELS2; /* and skip to last ones */ + } + else { + lua_getinfo(L1, "Slnt", &ar); + lua_pushfstring(L, "\n\t%s:", ar.short_src); + if (ar.currentline > 0) + lua_pushfstring(L, "%d:", ar.currentline); + lua_pushliteral(L, " in "); + pushfuncname(L, &ar); + lua_concat(L, lua_gettop(L) - top); + } + } + lua_concat(L, lua_gettop(L) - top); +} +#endif + + +void luaL_checkversion (lua_State *L) { + (void)L; +} + + +#if !defined(COMPAT52_IS_LUAJIT) +int luaL_fileresult (lua_State *L, int stat, const char *fname) { + int en = errno; /* calls to Lua API may change this value */ + if (stat) { + lua_pushboolean(L, 1); + return 1; + } + else { + lua_pushnil(L); + if (fname) + lua_pushfstring(L, "%s: %s", fname, strerror(en)); + else + lua_pushstring(L, strerror(en)); + lua_pushnumber(L, (lua_Number)en); + return 3; + } +} +#endif + + +#endif /* Lua 5.0 or Lua 5.1 */ + + +#if defined(LUA_VERSION_NUM) && LUA_VERSION_NUM == 501 +#include + +typedef LUAI_INT32 LUA_INT32; + +/********************************************************************/ +/* extract of 5.2's luaconf.h */ +/* detects proper defines for faster unsigned<->number conversion */ +/* see copyright notice at the end of this file */ +/********************************************************************/ + +#if !defined(LUA_ANSI) && defined(_WIN32) && !defined(_WIN32_WCE) +#define LUA_WIN /* enable goodies for regular Windows platforms */ +#endif + + +#if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) /* { */ + +/* Microsoft compiler on a Pentium (32 bit) ? */ +#if defined(LUA_WIN) && defined(_MSC_VER) && defined(_M_IX86) /* { */ + +#define LUA_MSASMTRICK +#define LUA_IEEEENDIAN 0 +#define LUA_NANTRICK + +/* pentium 32 bits? */ +#elif defined(__i386__) || defined(__i386) || defined(__X86__) /* }{ */ + +#define LUA_IEEE754TRICK +#define LUA_IEEELL +#define LUA_IEEEENDIAN 0 +#define LUA_NANTRICK + +/* pentium 64 bits? */ +#elif defined(__x86_64) /* }{ */ + +#define LUA_IEEE754TRICK +#define LUA_IEEEENDIAN 0 + +#elif defined(__POWERPC__) || defined(__ppc__) /* }{ */ + +#define LUA_IEEE754TRICK +#define LUA_IEEEENDIAN 1 + +#else /* }{ */ + +/* assume IEEE754 and a 32-bit integer type */ +#define LUA_IEEE754TRICK + +#endif /* } */ + +#endif /* } */ + + +/********************************************************************/ +/* extract of 5.2's llimits.h */ +/* gives us lua_number2unsigned and lua_unsigned2number */ +/* see copyright notice at the end of this file */ +/********************************************************************/ + +#if defined(MS_ASMTRICK) || defined(LUA_MSASMTRICK) /* { */ +/* trick with Microsoft assembler for X86 */ + +#define lua_number2unsigned(i,n) \ + {__int64 l; __asm {__asm fld n __asm fistp l} i = (unsigned int)l;} + + +#elif defined(LUA_IEEE754TRICK) /* }{ */ +/* the next trick should work on any machine using IEEE754 with + a 32-bit int type */ + +union compat52_luai_Cast { double l_d; LUA_INT32 l_p[2]; }; + +#if !defined(LUA_IEEEENDIAN) /* { */ +#define LUAI_EXTRAIEEE \ + static const union compat52_luai_Cast ieeeendian = {-(33.0 + 6755399441055744.0)}; +#define LUA_IEEEENDIANLOC (ieeeendian.l_p[1] == 33) +#else +#define LUA_IEEEENDIANLOC LUA_IEEEENDIAN +#define LUAI_EXTRAIEEE /* empty */ +#endif /* } */ + +#define lua_number2int32(i,n,t) \ + { LUAI_EXTRAIEEE \ + volatile union compat52_luai_Cast u; u.l_d = (n) + 6755399441055744.0; \ + (i) = (t)u.l_p[LUA_IEEEENDIANLOC]; } + +#define lua_number2unsigned(i,n) lua_number2int32(i, n, lua_Unsigned) + +#endif /* } */ + + +/* the following definitions always work, but may be slow */ + +#if !defined(lua_number2unsigned) /* { */ +/* the following definition assures proper modulo behavior */ +#if defined(LUA_NUMBER_DOUBLE) || defined(LUA_NUMBER_FLOAT) +#include +#define SUPUNSIGNED ((lua_Number)(~(lua_Unsigned)0) + 1) +#define lua_number2unsigned(i,n) \ + ((i)=(lua_Unsigned)((n) - floor((n)/SUPUNSIGNED)*SUPUNSIGNED)) +#else +#define lua_number2unsigned(i,n) ((i)=(lua_Unsigned)(n)) +#endif +#endif /* } */ + + +#if !defined(lua_unsigned2number) +/* on several machines, coercion from unsigned to double is slow, + so it may be worth to avoid */ +#define lua_unsigned2number(u) \ + (((u) <= (lua_Unsigned)INT_MAX) ? (lua_Number)(int)(u) : (lua_Number)(u)) +#endif + +/********************************************************************/ + + +static void compat52_call_lua (lua_State *L, char const code[], size_t len, + int nargs, int nret) { + lua_rawgetp(L, LUA_REGISTRYINDEX, (void*)code); + if (lua_type(L, -1) != LUA_TFUNCTION) { + lua_pop(L, 1); + if (luaL_loadbuffer(L, code, len, "=none")) + lua_error(L); + lua_pushvalue(L, -1); + lua_rawsetp(L, LUA_REGISTRYINDEX, (void*)code); + } + lua_insert(L, -nargs-1); + lua_call(L, nargs, nret); +} + +static const char compat52_arith_code[] = { + 'l', 'o', 'c', 'a', 'l', ' ', 'o', 'p', ',', 'a', ',', 'b', + '=', '.', '.', '.', '\n', + 'i', 'f', ' ', 'o', 'p', '=', '=', '0', ' ', + 't', 'h', 'e', 'n', '\n', + 'r', 'e', 't', 'u', 'r', 'n', ' ', 'a', '+', 'b', '\n', + 'e', 'l', 's', 'e', 'i', 'f', ' ', 'o', 'p', '=', '=', '1', ' ', + 't', 'h', 'e', 'n', '\n', + 'r', 'e', 't', 'u', 'r', 'n', ' ', 'a', '-', 'b', '\n', + 'e', 'l', 's', 'e', 'i', 'f', ' ', 'o', 'p', '=', '=', '2', ' ', + 't', 'h', 'e', 'n', '\n', + 'r', 'e', 't', 'u', 'r', 'n', ' ', 'a', '*', 'b', '\n', + 'e', 'l', 's', 'e', 'i', 'f', ' ', 'o', 'p', '=', '=', '3', ' ', + 't', 'h', 'e', 'n', '\n', + 'r', 'e', 't', 'u', 'r', 'n', ' ', 'a', '/', 'b', '\n', + 'e', 'l', 's', 'e', 'i', 'f', ' ', 'o', 'p', '=', '=', '4', ' ', + 't', 'h', 'e', 'n', '\n', + 'r', 'e', 't', 'u', 'r', 'n', ' ', 'a', '%', 'b', '\n', + 'e', 'l', 's', 'e', 'i', 'f', ' ', 'o', 'p', '=', '=', '5', ' ', + 't', 'h', 'e', 'n', '\n', + 'r', 'e', 't', 'u', 'r', 'n', ' ', 'a', '^', 'b', '\n', + 'e', 'l', 's', 'e', 'i', 'f', ' ', 'o', 'p', '=', '=', '6', ' ', + 't', 'h', 'e', 'n', '\n', + 'r', 'e', 't', 'u', 'r', 'n', ' ', '-', 'a', '\n', + 'e', 'n', 'd', '\n', '\0' +}; + +void lua_arith (lua_State *L, int op) { + if (op < LUA_OPADD && op > LUA_OPUNM) + luaL_error(L, "invalid 'op' argument for lua_arith"); + luaL_checkstack(L, 5, "not enough stack slots"); + if (op == LUA_OPUNM) + lua_pushvalue(L, -1); + lua_pushnumber(L, op); + lua_insert(L, -3); + compat52_call_lua(L, compat52_arith_code, + sizeof(compat52_arith_code)-1, 3, 1); +} + + +static const char compat52_compare_code[] = { + 'l', 'o', 'c', 'a', 'l', ' ', 'a', ',', 'b', '=', '.', '.', '.', '\n', + 'r', 'e', 't', 'u', 'r', 'n', ' ', 'a', '<', '=', 'b', '\n', '\0' +}; + +int lua_compare (lua_State *L, int idx1, int idx2, int op) { + int result = 0; + switch (op) { + case LUA_OPEQ: + return lua_equal(L, idx1, idx2); + case LUA_OPLT: + return lua_lessthan(L, idx1, idx2); + case LUA_OPLE: + luaL_checkstack(L, 5, "not enough stack slots"); + idx1 = lua_absindex(L, idx1); + idx2 = lua_absindex(L, idx2); + lua_pushvalue(L, idx1); + lua_pushvalue(L, idx2); + compat52_call_lua(L, (void*)compat52_compare_code, + sizeof(compat52_compare_code)-1, 2, 1); + result = lua_toboolean(L, -1); + lua_pop(L, 1); + return result; + default: + luaL_error(L, "invalid 'op' argument for lua_compare"); + } + return 0; +} + + +void lua_pushunsigned (lua_State *L, lua_Unsigned n) { + lua_pushnumber(L, lua_unsigned2number(n)); +} + + +lua_Unsigned luaL_checkunsigned (lua_State *L, int i) { + lua_Unsigned result; + lua_Number n = lua_tonumber(L, i); + if (n == 0 && !lua_isnumber(L, i)) + luaL_checktype(L, i, LUA_TNUMBER); + lua_number2unsigned(result, n); + return result; +} + + +lua_Unsigned lua_tounsignedx (lua_State *L, int i, int *isnum) { + lua_Unsigned result; + lua_Number n = lua_tonumberx(L, i, isnum); + lua_number2unsigned(result, n); + return result; +} + + +lua_Unsigned luaL_optunsigned (lua_State *L, int i, lua_Unsigned def) { + return luaL_opt(L, luaL_checkunsigned, i, def); +} + + +lua_Integer lua_tointegerx (lua_State *L, int i, int *isnum) { + lua_Integer n = lua_tointeger(L, i); + if (isnum != NULL) { + *isnum = (n != 0 || lua_isnumber(L, i)); + } + return n; +} + + +void lua_len (lua_State *L, int i) { + switch (lua_type(L, i)) { + case LUA_TSTRING: /* fall through */ + case LUA_TTABLE: + if (!luaL_callmeta(L, i, "__len")) + lua_pushnumber(L, (int)lua_objlen(L, i)); + break; + case LUA_TUSERDATA: + if (luaL_callmeta(L, i, "__len")) + break; + /* maybe fall through */ + default: + luaL_error(L, "attempt to get length of a %s value", + lua_typename(L, lua_type(L, i))); + } +} + + +int luaL_len (lua_State *L, int i) { + int res = 0, isnum = 0; + luaL_checkstack(L, 1, "not enough stack slots"); + lua_len(L, i); + res = (int)lua_tointegerx(L, -1, &isnum); + lua_pop(L, 1); + if (!isnum) + luaL_error(L, "object length is not a number"); + return res; +} + + +const char *luaL_tolstring (lua_State *L, int idx, size_t *len) { + if (!luaL_callmeta(L, idx, "__tostring")) { + int t = lua_type(L, idx); + switch (t) { + case LUA_TNIL: + lua_pushliteral(L, "nil"); + break; + case LUA_TSTRING: + case LUA_TNUMBER: + lua_pushvalue(L, idx); + break; + case LUA_TBOOLEAN: + if (lua_toboolean(L, idx)) + lua_pushliteral(L, "true"); + else + lua_pushliteral(L, "false"); + break; + default: + lua_pushfstring(L, "%s: %p", lua_typename(L, t), + lua_topointer(L, idx)); + break; + } + } + return lua_tolstring(L, -1, len); +} + + +void luaL_requiref (lua_State *L, char const* modname, + lua_CFunction openf, int glb) { + luaL_checkstack(L, 3, "not enough stack slots"); + lua_pushcfunction(L, openf); + lua_pushstring(L, modname); + lua_call(L, 1, 1); + lua_getglobal(L, "package"); + lua_getfield(L, -1, "loaded"); + lua_replace(L, -2); + lua_pushvalue(L, -2); + lua_setfield(L, -2, modname); + lua_pop(L, 1); + if (glb) { + lua_pushvalue(L, -1); + lua_setglobal(L, modname); + } +} + + +void luaL_buffinit (lua_State *L, luaL_Buffer_52 *B) { + /* make it crash if used via pointer to a 5.1-style luaL_Buffer */ + B->b.p = NULL; + B->b.L = NULL; + B->b.lvl = 0; + /* reuse the buffer from the 5.1-style luaL_Buffer though! */ + B->ptr = B->b.buffer; + B->capacity = LUAL_BUFFERSIZE; + B->nelems = 0; + B->L2 = L; +} + + +char *luaL_prepbuffsize (luaL_Buffer_52 *B, size_t s) { + if (B->capacity - B->nelems < s) { /* needs to grow */ + char* newptr = NULL; + size_t newcap = B->capacity * 2; + if (newcap - B->nelems < s) + newcap = B->nelems + s; + if (newcap < B->capacity) /* overflow */ + luaL_error(B->L2, "buffer too large"); + newptr = lua_newuserdata(B->L2, newcap); + memcpy(newptr, B->ptr, B->nelems); + if (B->ptr != B->b.buffer) + lua_replace(B->L2, -2); /* remove old buffer */ + B->ptr = newptr; + B->capacity = newcap; + } + return B->ptr+B->nelems; +} + + +void luaL_addlstring (luaL_Buffer_52 *B, const char *s, size_t l) { + memcpy(luaL_prepbuffsize(B, l), s, l); + luaL_addsize(B, l); +} + + +void luaL_addvalue (luaL_Buffer_52 *B) { + size_t len = 0; + const char *s = lua_tolstring(B->L2, -1, &len); + if (!s) + luaL_error(B->L2, "cannot convert value to string"); + if (B->ptr != B->b.buffer) + lua_insert(B->L2, -2); /* userdata buffer must be at stack top */ + luaL_addlstring(B, s, len); + lua_remove(B->L2, B->ptr != B->b.buffer ? -2 : -1); +} + + +void luaL_pushresult (luaL_Buffer_52 *B) { + lua_pushlstring(B->L2, B->ptr, B->nelems); + if (B->ptr != B->b.buffer) + lua_replace(B->L2, -2); /* remove userdata buffer */ +} + + +#endif /* LUA_VERSION_NUM == 501 */ + + +/********************************************************************* +* This file contains parts of Lua 5.2's source code: +* +* Copyright (C) 1994-2013 Lua.org, PUC-Rio. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be +* included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*********************************************************************/ diff --git a/ext/include/compat-5.2.h b/ext/include/compat-5.2.h new file mode 100644 index 0000000..905489b --- /dev/null +++ b/ext/include/compat-5.2.h @@ -0,0 +1,168 @@ +#include +#include +#include +#include "lua.h" +#include "lauxlib.h" +#include "lualib.h" + +#if !defined(LUA_VERSION_NUM) +/* Lua 5.0 */ + +#define LUA_QL(x) "'" x "'" +#define LUA_QS LUA_QL("%s") + +#define luaL_Reg luaL_reg + +#define luaL_opt(L, f, n, d) \ + (lua_isnoneornil(L, n) ? (d) : f(L, n)) + +#define luaL_addchar(B,c) \ + ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \ + (*(B)->p++ = (char)(c))) + +#endif /* Lua 5.0 */ + + +#if defined(LUA_VERSION_NUM) && LUA_VERSION_NUM == 501 +/* Lua 5.1 */ + +/* PUC-Rio Lua uses lconfig_h as include guard for luaconf.h, + * LuaJIT uses luaconf_h. If you use PUC-Rio's include files + * but LuaJIT's library, you will need to define the macro + * COMPAT52_IS_LUAJIT yourself! */ +#if !defined(COMPAT52_IS_LUAJIT) && defined(luaconf_h) +#define COMPAT52_IS_LUAJIT +#endif + +/* LuaJIT doesn't define these unofficial macros ... */ +#if !defined(LUAI_INT32) +#include +#if INT_MAX-20 < 32760 +#define LUAI_INT32 long +#define LUAI_UINT32 unsigned long +#elif INT_MAX > 2147483640L +#define LUAI_INT32 int +#define LUAI_UINT32 unsigned int +#else +#error "could not detect suitable lua_Unsigned datatype" +#endif +#endif + +#define LUA_OPADD 0 +#define LUA_OPSUB 1 +#define LUA_OPMUL 2 +#define LUA_OPDIV 3 +#define LUA_OPMOD 4 +#define LUA_OPPOW 5 +#define LUA_OPUNM 6 +#define LUA_OPEQ 0 +#define LUA_OPLT 1 +#define LUA_OPLE 2 + +typedef LUAI_UINT32 lua_Unsigned; + +typedef struct luaL_Buffer_52 { + luaL_Buffer b; /* make incorrect code crash! */ + char *ptr; + size_t nelems; + size_t capacity; + lua_State *L2; +} luaL_Buffer_52; +#define luaL_Buffer luaL_Buffer_52 + +typedef struct luaL_Stream { + FILE *f; + /* The following field is for LuaJIT which adds a uint32_t field + * to file handles. */ + lua_Unsigned type; + lua_CFunction closef; +} luaL_Stream; + + +#define lua_tounsigned(L, i) lua_tounsignedx(L, i, NULL) + +#define lua_rawlen(L, i) lua_objlen(L, i) + +void lua_arith (lua_State *L, int op); +int lua_compare (lua_State *L, int idx1, int idx2, int op); +void lua_pushunsigned (lua_State *L, lua_Unsigned n); +lua_Unsigned luaL_checkunsigned (lua_State *L, int i); +lua_Unsigned lua_tounsignedx (lua_State *L, int i, int *isnum); +lua_Unsigned luaL_optunsigned (lua_State *L, int i, lua_Unsigned def); +lua_Integer lua_tointegerx (lua_State *L, int i, int *isnum); +void lua_len (lua_State *L, int i); +int luaL_len (lua_State *L, int i); +const char *luaL_tolstring (lua_State *L, int idx, size_t *len); +void luaL_requiref (lua_State *L, char const* modname, lua_CFunction openf, int glb); + +#define luaL_buffinit luaL_buffinit_52 +void luaL_buffinit (lua_State *L, luaL_Buffer_52 *B); + +#define luaL_prepbuffsize luaL_prepbuffsize_52 +char *luaL_prepbuffsize (luaL_Buffer_52 *B, size_t s); + +#define luaL_addlstring luaL_addlstring_52 +void luaL_addlstring (luaL_Buffer_52 *B, const char *s, size_t l); + +#define luaL_addvalue luaL_addvalue_52 +void luaL_addvalue (luaL_Buffer_52 *B); + +#define luaL_pushresult luaL_pushresult_52 +void luaL_pushresult (luaL_Buffer_52 *B); + +#undef luaL_buffinitsize +#define luaL_buffinitsize(L, B, s) \ + (luaL_buffinit(L, B), luaL_prepbuffsize(B, s)) + +#undef luaL_prepbuffer +#define luaL_prepbuffer(B) \ + luaL_prepbuffsize(B, LUAL_BUFFERSIZE) + +#undef luaL_addchar +#define luaL_addchar(B, c) \ + ((void)((B)->nelems < (B)->capacity || luaL_prepbuffsize(B, 1)), \ + ((B)->ptr[(B)->nelems++] = (c))) + +#undef luaL_addsize +#define luaL_addsize(B, s) \ + ((B)->nelems += (s)) + +#undef luaL_addstring +#define luaL_addstring(B, s) \ + luaL_addlstring(B, s, strlen(s)) + +#undef luaL_pushresultsize +#define luaL_pushresultsize(B, s) \ + (luaL_addsize(B, s), luaL_pushresult(B)) + +#endif /* Lua 5.1 */ + + +#if !defined(LUA_VERSION_NUM) || LUA_VERSION_NUM == 501 +/* Lua 5.0 *or* 5.1 */ + +#define LUA_OK 0 + +#define lua_pushglobaltable(L) \ + lua_pushvalue(L, LUA_GLOBALSINDEX) + +#define luaL_newlib(L, l) \ + (lua_newtable((L)),luaL_setfuncs((L), (l), 0)) + +void luaL_checkversion (lua_State *L); + +#endif /* Lua 5.0 *or* 5.1 */ + +int lua_absindex (lua_State *L, int i); +void lua_copy (lua_State *L, int from, int to); +void lua_rawgetp (lua_State *L, int i, const void *p); +void lua_rawsetp (lua_State *L, int i, const void *p); +void *luaL_testudata (lua_State *L, int i, const char *tname); +lua_Number lua_tonumberx (lua_State *L, int i, int *isnum); +void lua_getuservalue (lua_State *L, int i); +void lua_setuservalue (lua_State *L, int i); +void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup); +void luaL_setmetatable (lua_State *L, const char *tname); +int luaL_getsubtable (lua_State *L, int i, const char *name); +void luaL_traceback (lua_State *L, lua_State *L1, const char *msg, int level); +int luaL_fileresult (lua_State *L, int stat, const char *fname); diff --git a/ext/include/strlcpy.c b/ext/include/strlcpy.c new file mode 100644 index 0000000..361eefd --- /dev/null +++ b/ext/include/strlcpy.c @@ -0,0 +1,78 @@ +/* $OpenBSD: strlcpy.c,v 1.4 1999/05/01 18:56:41 millert Exp $ */ + +/* + * Copyright (c) 1998 Todd C. Miller + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef LUAPOSIX_STRLCPY_C +#define LUAPOSIX_STRLCPY_C 1 + +#include + +#ifndef HAVE_STRLCPY + +#if defined LIBC_SCCS && ! defined lint +static char *rcsid = "$OpenBSD: strlcpy.c,v 1.4 1999/05/01 18:56:41 millert Exp $"; +#endif /* LIBC_SCCS and not lint */ + +#include +#include + +static size_t strlcpy(char *dst, const char *src, size_t siz); + +/* + * Copy src to string dst of size siz. At most siz-1 characters + * will be copied. Always NUL terminates (unless siz == 0). + * Returns strlen(src); if retval >= siz, truncation occurred. + */ +static size_t strlcpy(char *dst, const char *src, size_t siz) +{ + register char *d = dst; + register const char *s = src; + register size_t n = siz; + + /* Copy as many bytes as will fit */ + if (n != 0 && --n != 0) { + do { + if ((*d++ = *s++) == 0) + break; + } while (--n != 0); + } + + /* Not enough room in dst, add NUL and traverse rest of src */ + if (n == 0) { + if (siz != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } + + return(s - src - 1); /* count does not include NUL */ +} + +#endif /* !HAVE_STRLCPY */ + +#endif /* !LUAPOSIX_STRLCPY_C */ diff --git a/ext/posix/ctype.c b/ext/posix/ctype.c new file mode 100644 index 0000000..429f898 --- /dev/null +++ b/ext/posix/ctype.c @@ -0,0 +1,80 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Character tests. + +@module posix.ctype +*/ + +#include + +#include + +#include "_helpers.c" + + +static int +bind_ctype(lua_State *L, int (*cb)(int)) +{ + const char *s = luaL_checkstring(L, 1); + char c = *s; + checknargs(L, 1); + lua_pop(L, 1); + return pushintresult(cb((int)c)); +} + + +/*** +Check for any printable character except space. +@function isgraph +@see isgraph(3) +@string character to act on +@treturn int non-zero if character is not in the class +*/ +static int +Pisgraph(lua_State *L) +{ + return bind_ctype(L, &isgraph); +} + + +/*** +Check for any printable character including space. +@function isprint +@string character to act on +@treturn int non-zero if character is not in the class +@see isprint(3) +*/ +static int +Pisprint(lua_State *L) +{ + return bind_ctype(L, &isprint); +} + + +static const luaL_Reg posix_ctype_fns[] = +{ + LPOSIX_FUNC( Pisgraph ), + LPOSIX_FUNC( Pisprint ), + {NULL, NULL} +}; + + +LUALIB_API int +luaopen_posix_ctype(lua_State *L) +{ + luaL_register(L, "posix.ctype", posix_ctype_fns); + lua_pushliteral(L, "posix.ctype for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + return 1; +} diff --git a/ext/posix/curses.c b/ext/posix/curses.c new file mode 100644 index 0000000..be1e549 --- /dev/null +++ b/ext/posix/curses.c @@ -0,0 +1,1564 @@ +/* + * Curses binding for Lua 5.1, 5.2 & 5.3. + * + * (c) Gary V. Vaughan 2013-2015 + * (c) Reuben Thomas 2009-2012 + * (c) Tiago Dionizio 2004-2007 + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +/*** + Full-screen Text Terminal Manipulation. + + In the underlying curses C library, the following functions: + + getstr() (and wgetstr(), mvgetstr(), and mvwgetstr()) + inchstr() (and winchstr(), mvinchstr(), and mvwinchstr()) + instr() (and winstr(), mvinstr(), and mvwinstr()) + + are subject to buffer overflow attack. This is because you pass in the + buffer to be filled in, which has to be of finite length. But in this + Lua module, a buffer is assigned automatically and the function returns + the string, so there is no security issue. You may still use the alternate + functions: + + s = stdscr:getnstr() + s = stdscr:inchnstr() + s = stdscr:innstr() + + which take an extra "size of buffer" argument, in order to impose a maximum + length on the string the user may type in. + + Some of the C functions beginning with "no" do not exist in Lua. You should + use `curses.nl(false)` and `curses.nl(true)` instead of `nonl()` and `nl()`, + and likewise `curses.echo(false)` and `curses.echo(true)` instead of + `noecho()` and `echo()` . + + In this Lua module the `stdscr:getch()` function always returns an integer. + In C, a single character is an integer, but in Lua (and Perl) a single + character is a short string. The Perl Curses function `getch()` returns a + char if it was a char, and a number if it was a constant; to get this + behaviour in Lua you have to convert explicitly, e.g.: + + if c < 256 then c = string.char(c) end + + Some Lua functions take a different set of parameters than their C + counterparts; for example, you should use `str = stdscr.getstr()` and + `y, x = stdscr.getyx()` instead of `getstr(str)` and `getyx(y, x)`, and + likewise for `getbegyx` and `getmaxyx` and `getparyx` and `pair_content`. + The Perl Curses module now uses the C-compatible parameters, so be aware of + this difference when translating code from Perl into Lua, as well as from C + into Lua. + + Many curses functions have variants starting with the prefixes `w-`, `mv-`, + and/or `wmv-`. These variants differ only in the explicit addition of a + window, or by the addition of two coordinates that are used to move the + cursor first. For example, in C `addch()` has three other variants: + `waddch()`, `mvaddch()` and `mvwaddch()`. The Lua equivalents, + respectively being `stdscr:addch()`, `somewindow:addch()`, + `stdscr:mvaddch()` and `somewindow:mvaddch()`, with the window argument + passed implicitly with Lua's `:` syntax sugar. + +@module posix.curses +*/ + + +#include + +#include "curses/chstr.c" +#include "curses/window.c" + + +#if HAVE_CURSES + +#include "_helpers.c" +#include "strlcpy.c" + + +static const char *STDSCR_REGISTRY = "curses:stdscr"; +static const char *RIPOFF_TABLE = "curses:ripoffline"; + + +/*** +Create a new line drawing buffer instance. +@function new_chstr +@int len number of element to allocate +@treturn chstr a new char buffer object +@see posix.curses.chstr +*/ +static int +Pnew_chstr(lua_State *L) +{ + int len = checkint(L, 1); + chstr* ncs = chstr_new(L, len); /* defined in curses/chstr.c */ + memset(ncs->str, ' ', len*sizeof(chtype)); + return 1; +} + + + +#define CCR(n, v) \ + lua_pushstring(L, n); \ + lua_pushinteger(L, v); \ + lua_settable(L, lua_upvalueindex(1)) + +#define CC(s) CCR(#s, s) +#define CF(i) CCR(LPOSIX_STR(LPOSIX_SPLICE(KEY_F, i)), KEY_F(i)) + +/* +** these values may be fixed only after initialization, so this is +** called from Pinitscr, after the curses driver is initialized +** +** curses table is kept at upvalue position 1, in case the global +** name is changed by the user or even in the registration phase by +** the developer +** +** some of these values are not constant so need to register +** them directly instead of using a table +*/ + +static void +register_curses_constants(lua_State *L) +{ + /* colors */ + CC(COLOR_BLACK); CC(COLOR_RED); CC(COLOR_GREEN); + CC(COLOR_YELLOW); CC(COLOR_BLUE); CC(COLOR_MAGENTA); + CC(COLOR_CYAN); CC(COLOR_WHITE); + + /* alternate character set */ + CC(ACS_BLOCK); CC(ACS_BOARD); + + CC(ACS_BTEE); CC(ACS_TTEE); + CC(ACS_LTEE); CC(ACS_RTEE); + CC(ACS_LLCORNER); CC(ACS_LRCORNER); + CC(ACS_URCORNER); CC(ACS_ULCORNER); + + CC(ACS_LARROW); CC(ACS_RARROW); + CC(ACS_UARROW); CC(ACS_DARROW); + + CC(ACS_HLINE); CC(ACS_VLINE); + + CC(ACS_BULLET); CC(ACS_CKBOARD); CC(ACS_LANTERN); + CC(ACS_DEGREE); CC(ACS_DIAMOND); + + CC(ACS_PLMINUS); CC(ACS_PLUS); + CC(ACS_S1); CC(ACS_S9); + + /* attributes */ + CC(A_NORMAL); CC(A_STANDOUT); CC(A_UNDERLINE); + CC(A_REVERSE); CC(A_BLINK); CC(A_DIM); + CC(A_BOLD); CC(A_PROTECT); CC(A_INVIS); + CC(A_ALTCHARSET); CC(A_CHARTEXT); + CC(A_ATTRIBUTES); +#ifdef A_COLOR + CC(A_COLOR); +#endif + + /* key functions */ + CC(KEY_BREAK); CC(KEY_DOWN); CC(KEY_UP); + CC(KEY_LEFT); CC(KEY_RIGHT); CC(KEY_HOME); + CC(KEY_BACKSPACE); + + CC(KEY_DL); CC(KEY_IL); CC(KEY_DC); + CC(KEY_IC); CC(KEY_EIC); CC(KEY_CLEAR); + CC(KEY_EOS); CC(KEY_EOL); CC(KEY_SF); + CC(KEY_SR); CC(KEY_NPAGE); CC(KEY_PPAGE); + CC(KEY_STAB); CC(KEY_CTAB); CC(KEY_CATAB); + CC(KEY_ENTER); CC(KEY_SRESET); CC(KEY_RESET); + CC(KEY_PRINT); CC(KEY_LL); CC(KEY_A1); + CC(KEY_A3); CC(KEY_B2); CC(KEY_C1); + CC(KEY_C3); CC(KEY_BTAB); CC(KEY_BEG); + CC(KEY_CANCEL); CC(KEY_CLOSE); CC(KEY_COMMAND); + CC(KEY_COPY); CC(KEY_CREATE); CC(KEY_END); + CC(KEY_EXIT); CC(KEY_FIND); CC(KEY_HELP); + CC(KEY_MARK); CC(KEY_MESSAGE); /* ncurses extension: CC(KEY_MOUSE); */ + CC(KEY_MOVE); CC(KEY_NEXT); CC(KEY_OPEN); + CC(KEY_OPTIONS); CC(KEY_PREVIOUS); CC(KEY_REDO); + CC(KEY_REFERENCE); CC(KEY_REFRESH); CC(KEY_REPLACE); + CC(KEY_RESIZE); CC(KEY_RESTART); CC(KEY_RESUME); + CC(KEY_SAVE); CC(KEY_SBEG); CC(KEY_SCANCEL); + CC(KEY_SCOMMAND); CC(KEY_SCOPY); CC(KEY_SCREATE); + CC(KEY_SDC); CC(KEY_SDL); CC(KEY_SELECT); + CC(KEY_SEND); CC(KEY_SEOL); CC(KEY_SEXIT); + CC(KEY_SFIND); CC(KEY_SHELP); CC(KEY_SHOME); + CC(KEY_SIC); CC(KEY_SLEFT); CC(KEY_SMESSAGE); + CC(KEY_SMOVE); CC(KEY_SNEXT); CC(KEY_SOPTIONS); + CC(KEY_SPREVIOUS); CC(KEY_SPRINT); CC(KEY_SREDO); + CC(KEY_SREPLACE); CC(KEY_SRIGHT); CC(KEY_SRSUME); + CC(KEY_SSAVE); CC(KEY_SSUSPEND); CC(KEY_SUNDO); + CC(KEY_SUSPEND); CC(KEY_UNDO); + + /* KEY_Fx 0 <= x <= 63 */ + CC(KEY_F0); + CF(1); CF(2); CF(3); CF(4); CF(5); CF(6); CF(7); CF(8); + CF(9); CF(10); CF(11); CF(12); CF(13); CF(14); CF(15); CF(16); + CF(17); CF(18); CF(19); CF(20); CF(21); CF(22); CF(23); CF(24); + CF(25); CF(26); CF(27); CF(28); CF(29); CF(30); CF(31); CF(32); + CF(33); CF(34); CF(35); CF(36); CF(37); CF(38); CF(39); CF(40); + CF(41); CF(42); CF(43); CF(44); CF(45); CF(46); CF(47); CF(48); + CF(49); CF(50); CF(51); CF(52); CF(53); CF(54); CF(55); CF(56); + CF(57); CF(58); CF(59); CF(60); CF(61); CF(62); CF(63); +} + +/* +** make sure screen is restored (and cleared) at exit +** (for the situations where program is aborted without a +** proper cleanup) +*/ + +static void +cleanup(void) +{ + if (!isendwin()) + { + wclear(stdscr); + wrefresh(stdscr); + endwin(); + } +} + + +/*** +Initialise screen. +@function initscr +@treturn window main screen +@see curs_initscr(3x) +*/ +static int +Pinitscr(lua_State *L) +{ + WINDOW *w; + + /* initialize curses */ + w = initscr(); + + /* no longer used, so clean it up */ + lua_pushstring(L, RIPOFF_TABLE); + lua_pushnil(L); + lua_settable(L, LUA_REGISTRYINDEX); + + /* failed to initialize */ + if (w == NULL) + return 0; + + /* return stdscr - main window */ + lc_newwin(L, w); + + /* save main window on registry */ + lua_pushstring(L, STDSCR_REGISTRY); + lua_pushvalue(L, -2); + lua_rawset(L, LUA_REGISTRYINDEX); + + /* setup curses constants - curses.xxx numbers */ + register_curses_constants(L); + + /* install cleanup handler to help in debugging and screen trashing */ + atexit(cleanup); + + return 1; +} + + +/*** +Clean up terminal prior to exiting or escaping curses. +@function endwin +@treturn bool `true`, if successful +@see curs_initscr(3x) +*/ +static int +Pendwin(lua_State *L) +{ + return pushokresult(endwin()); +} + + +/*** +Has @{endwin} been called more recently than @{posix.curses.window:refresh}? +@function isendwin +@treturn bool whether @{endwin} has been called +@see curs_initscr(3x) +*/ +static int +Pisendwin(lua_State *L) +{ + return pushboolresult(isendwin()); +} + + +/*** +Retern the main screen window. +@function stdscr +@treturn window main screen +@see initscr +*/ +static int +Pstdscr(lua_State *L) +{ + lua_pushstring(L, STDSCR_REGISTRY); + lua_rawget(L, LUA_REGISTRYINDEX); + return 1; +} + + +/*** +Number of columns in the main screen window. +@function cols +@treturn int number of columns in the main screen +@see lines +@see stdscr +*/ +static int +Pcols(lua_State *L) +{ + return pushintresult(COLS); +} + + +/*** +Number of lines in the main screen window. +@function lines +@treturn int number of lines in the main screen +@see cols +@see stdscr +*/ +static int +Plines(lua_State *L) +{ + return pushintresult(LINES); +} + + +/*** +Initialise color output facility. +@function start_color +@treturn bool `true`, if successful +@see curs_color(3x) +@see has_colors +*/ +static int +Pstart_color(lua_State *L) +{ + return pushokresult(start_color()); +} + + +/*** +Does the terminal have color capability? +@function has_colors +@treturn bool `true`, if the terminal supports colors +@see curs_color(3x) +@see start_color +@usage +if curses.has_colors () then + curses.start_color () +end +*/ +static int +Phas_colors(lua_State *L) +{ + return pushboolresult(has_colors()); +} + + +/*** +Reserve `-1` to represent terminal default colors. +@function use_default_colors +@treturn bool `true`, if successful +@see default_colors(3x) +*/ +static int +Puse_default_colors(lua_State *L) +{ + return pushokresult(use_default_colors()); +} + + +/*** +Associate a color pair id with a specific foreground and background color. +@function init_pair +@int pair color pair id to act on +@int f foreground color to assign +@int b background color to assign +@treturn bool `true`, if successful +@see curs_color(3x) +@see pair_content +*/ +static int +Pinit_pair(lua_State *L) +{ + short pair = checkint(L, 1); + short f = checkint(L, 2); + short b = checkint(L, 3); + return pushokresult(init_pair(pair, f, b)); +} + + +/*** +Return the foreground and background colors associated with a color pair id. +@function pair_content +@int pair color pair id to act on +@treturn int foreground color of *pair* +@treturn int background color of *pair* +@see curs_color(3x) +@see init_pair +*/ +static int +Ppair_content(lua_State *L) +{ + short pair = checkint(L, 1); + short f; + short b; + int ret = pair_content(pair, &f, &b); + + if (ret == ERR) + return 0; + + lua_pushinteger(L, f); + lua_pushinteger(L, b); + return 2; +} + + +/*** +How many colors are available for this terminal? +@function colors +@treturn int total number of available colors +@see curs_color(3x) +@see color_pairs +*/ +static int +Pcolors(lua_State *L) +{ + return pushintresult(COLORS); +} + + +/*** +How may distinct color pairs are supported by this terminal? +@function color_pairs +@treturn int total number of available color pairs +@see curs_color(3x) +@see colors +*/ +static int +Pcolor_pairs(lua_State *L) +{ + return pushintresult(COLOR_PAIRS); +} + + +/*** +Return the attributes for the given color pair id. +@function color_pair +@int pair color pair id to act on +@treturn int attributes for color pair *pair* +@see curs_color(3x) +*/ +static int +Pcolor_pair(lua_State *L) +{ + int n = checkint(L, 1); + return pushintresult(COLOR_PAIR(n)); +} + + +/*** +Fetch the output speed of the terminal. +@function baudrate +@treturn int output speed of the terminal in bits-per-second +@see curs_termattrs(3x) +*/ +static int +Pbaudrate(lua_State *L) +{ + return pushintresult(baudrate()); +} + + +/*** +Fetch the terminal's current erase character. +@function erasechar +@treturn int current erase character +@see curs_termattrs(3x) +*/ +static int +Perasechar(lua_State *L) +{ + return pushintresult(erasechar()); +} + + +/*** +Fetch the character insert and delete capability of the terminal. +@function has_ic +@treturn bool `true`, if the terminal has insert and delete character + operations +@see curs_termattrs(3x) +*/ +static int +Phas_ic(lua_State *L) +{ + return pushboolresult(has_ic()); +} + + +/*** +Fetch the line insert and delete capability of the terminal. +@function has_il +@treturn bool `true`, if the terminal has insert and delete line operations +@see curs_termattrs(3x) +*/ +static int +Phas_il(lua_State *L) +{ + return pushboolresult(has_il()); +} + + +/*** +Fetch the terminal's current kill character. +@function killchar +@treturn int current line kill character +@see curs_termattrs(3x) +*/ +static int +Pkillchar(lua_State *L) +{ + return pushintresult(killchar()); +} + + +/*** +Bitwise OR of all (or selected) video attributes supported by the terminal. +@function termattrs +@int[opt] a terminal attribute bits +@treturn[1] bool `true`, if the terminal supports attribute *a* +@treturn[2] int bitarray of supported terminal attributes +@see curs_termattrs(3x) +*/ +static int +Ptermattrs(lua_State *L) +{ + if (lua_gettop(L) > 0) + { + int a = checkint(L, 1); + return pushboolresult(termattrs() & a); + } + return pushintresult(termattrs()); +} + + +/*** +Fetch the name of the terminal. +@function termname +@treturn string terminal name +@see curs_termattrs(3x) +*/ +static int +Ptermname(lua_State *L) +{ + return pushstringresult(termname()); +} + + +/*** +Fetch the verbose name of the terminal. +@function longname +@treturn string verbose description of the current terminal +@see curs_termattrs(3x) +*/ +static int +Plongname(lua_State *L) +{ + return pushstringresult(longname()); +} + + +/* there is no easy way to implement this... */ + +static lua_State *rip_L = NULL; + +static int +ripoffline_cb(WINDOW* w, int cols) +{ + static int line = 0; + int top = lua_gettop(rip_L); + + /* better be safe */ + if (!lua_checkstack(rip_L, 5)) + return 0; + + /* get the table from the registry */ + lua_pushstring(rip_L, RIPOFF_TABLE); + lua_gettable(rip_L, LUA_REGISTRYINDEX); + + /* get user callback function */ + if (lua_isnil(rip_L, -1)) { + lua_pop(rip_L, 1); + return 0; + } + + lua_rawgeti(rip_L, -1, ++line); /* function to be called */ + lc_newwin(rip_L, w); /* create window object */ + lua_pushinteger(rip_L, cols); /* push number of columns */ + + lua_pcall(rip_L, 2, 0, 0); /* call the lua function */ + + lua_settop(rip_L, top); + return 1; +} + + +/*** +Reduce the available size of the main screen. +@function ripoffline +@bool top_line +@func callback +@treturn bool `true`, if successful +@see curs_kernel(3x) +*/ +static int +Pripoffline(lua_State *L) +{ + static int rip = 0; + int top_line = lua_toboolean(L, 1); + +#if LPOSIX_CURSES_COMPLIANT + if (!lua_isfunction(L, 2)) + { + lua_pushliteral(L, "invalid callback passed as second parameter"); + lua_error(L); + } + + /* need to save the lua state somewhere... */ + rip_L = L; + + /* get the table where we are going to save the callbacks */ + lua_pushstring(L, RIPOFF_TABLE); + lua_gettable(L, LUA_REGISTRYINDEX); + + if (lua_isnil(L, -1)) + { + lua_pop(L, 1); + lua_newtable(L); + + lua_pushstring(L, RIPOFF_TABLE); + lua_pushvalue(L, -2); + lua_settable(L, LUA_REGISTRYINDEX); + } + + /* save function callback in registry table */ + lua_pushvalue(L, 2); + lua_rawseti(L, -2, ++rip); + + /* and tell curses we are going to take the line */ + return pushokresult(ripoffline(top_line ? 1 : -1, ripoffline_cb)); +#else + return binding_notimplemented(L, "ripoffline", "curses"); +#endif +} + + +/*** +Change the visibility of the cursor. +@function curs_set +@int vis one of `0` (invisible), `1` (visible) or `2` (very visible) +@treturn[1] int previous cursor state +@return[2] nil if *vis* is not supported +@see curs_kernel(3x) +*/ +static int +Pcurs_set(lua_State *L) +{ + int vis = checkint(L, 1); + int state = curs_set(vis); + if (state == ERR) + return 0; + + return pushintresult(state); +} + + +/*** +Sleep for a few milliseconds. +@function napms +@int ms time to wait in milliseconds +@treturn bool `true`, if successful +@see curs_kernel(3x) +@see delay_output +*/ +static int +Pnapms(lua_State *L) +{ + int ms = checkint(L, 1); + return pushokresult(napms(ms)); +} + + +/*** +Change the terminal size. +@function resizeterm +@int nlines number of lines +@int ncols number of columns +@treturn bool `true`, if successful +@raise unimplemented +*/ +static int +Presizeterm(lua_State *L) +{ + int nlines = checkint(L, 1); + int ncols = checkint(L, 2); +#if HAVE_RESIZETERM + return pushokresult(resizeterm (nlines, ncols)); +#else + return binding_notimplemented(L, "resizeterm", "curses"); +#endif +} + + +/*** +Send the terminal audible bell. +@function beep +@treturn bool `true`, if successful +@see curs_beep(3x) +@see flash +*/ +static int +Pbeep(lua_State *L) +{ + return pushokresult(beep()); +} + + +/*** +Send the terminal visible bell. +@function flash +@treturn bool `true`, if successful +@see curs_beep(3x) +@see beep +*/ +static int +Pflash(lua_State *L) +{ + return pushokresult(flash()); +} + + +/*** +Create a new window. +@function newwin +@int nlines number of window lines +@int ncols number of window columns +@int begin_y top line of window +@int begin_x leftmost column of window +@treturn window a new window object +@see curs_window(3x) +@see posix.curses.window +*/ +static int +Pnewwin(lua_State *L) +{ + int nlines = checkint(L, 1); + int ncols = checkint(L, 2); + int begin_y = checkint(L, 3); + int begin_x = checkint(L, 4); + + lc_newwin(L, newwin(nlines, ncols, begin_y, begin_x)); + return 1; +} + + +/*** +Refresh the visible terminal screen. +@function doupdate +@treturn bool `true`, if successful +@see curs_refresh(3x) +@see posix.curses.window:refresh +*/ +static int +Pdoupdate(lua_State *L) +{ + return pushokresult(doupdate()); +} + + +/*** +Initialise the soft label keys area. +This must be called before @{initscr}. +@function slk_init +@int fmt +@treturn bool `true`, if successful +@see curs_slk(3x) +*/ +static int +Pslk_init(lua_State *L) +{ + int fmt = checkint(L, 1); +#if LPOSIX_CURSES_COMPLIANT + return pushokresult(slk_init(fmt)); +#else + return binding_notimplemented(L, "slk_init", "curses"); +#endif +} + + +/*** +Set the label for a soft label key. +@function slk_set +@int labnum +@string label +@int fmt +@treturn bool `true`, if successful +@see curs_slk(3x) +*/ +static int +Pslk_set(lua_State *L) +{ + int labnum = checkint(L, 1); + const char* label = luaL_checkstring(L, 2); + int fmt = checkint(L, 3); +#if LPOSIX_CURSES_COMPLIANT + return pushokresult(slk_set(labnum, label, fmt)); +#else + return binding_notimplemented(L, "slk_set", "curses"); +#endif +} + + +/*** +Refresh the soft label key area. +@function slk_refresh +@treturn bool `true`, if successful +@see curs_slk(3x) +@see posix.curses.window:refresh +*/ +static int +Pslk_refresh(lua_State *L) +{ +#if LPOSIX_CURSES_COMPLIANT + return pushokresult(slk_refresh()); +#else + return binding_notimplemented(L, "slk_refresh", "curses"); +#endif +} + + +/*** +Copy the soft label key area backing screen to the virtual screen. +@function slk_noutrefresh +@treturn bool `true`, if successful +@see curs_slk(3x) +@see posix.curses.window:refresh +*/ +static int +Pslk_noutrefresh(lua_State *L) +{ +#if LPOSIX_CURSES_COMPLIANT + return pushokresult(slk_noutrefresh()); +#else + return binding_notimplemented(L, "slk_noutrefresh", "curses"); +#endif +} + + +/*** +Fetch the label for a soft label key. +@function slk_label +@int labnum +@treturn string current label for *labnum* +@see curs_slk(3x) +*/ +static int +Pslk_label(lua_State *L) +{ + int labnum = checkint(L, 1); +#if LPOSIX_CURSES_COMPLIANT + return pushstringresult(slk_label(labnum)); +#else + return binding_notimplemented(L, "slk_label", "curses"); +#endif +} + + +/*** +Clears the soft labels from the screen. +@function slk_clear +@treturn bool `true`, if successful +@see curs_slk(3x) +@see slk_restore +*/ +static int +Pslk_clear(lua_State *L) +{ +#if LPOSIX_CURSES_COMPLIANT + return pushokresult(slk_clear()); +#else + return binding_notimplemented(L, "slk_clear", "curses"); +#endif +} + + +/*** +Restores the soft labels to the screen. +@function slk_restore +@treturn bool `true`, if successful +@see curs_slk(3x) +@see slk_clear +*/ +static int +Pslk_restore(lua_State *L) +{ +#if LPOSIX_CURSES_COMPLIANT + return pushokresult(slk_restore()); +#else + return binding_notimplemented(L, "slk_restore", "curses"); +#endif +} + + +/*** +Mark the soft label key area for refresh. +@function slk_touch +@treturn bool `true`, if successful +@see curs_slk(3x) +*/ +static int +Pslk_touch(lua_State *L) +{ +#if LPOSIX_CURSES_COMPLIANT + return pushokresult(slk_touch()); +#else + return binding_notimplemented(L, "slk_touch", "curses"); +#endif +} + + +/*** +Enable an attribute for soft labels. +@function slk_attron +@int attrs +@treturn bool `true`, if successful +@see curs_slk(3x) +*/ +static int +Pslk_attron(lua_State *L) +{ + chtype attrs = checkch(L, 1); +#if LPOSIX_CURSES_COMPLIANT + return pushokresult(slk_attron(attrs)); +#else + return binding_notimplemented(L, "slk_attron", "curses"); +#endif +} + + +/*** +Disable an attribute for soft labels. +@function slk_attroff +@int attrs +@treturn bool `true`, if successful +@see curs_slk(3x) +*/ +static int +Pslk_attroff(lua_State *L) +{ + chtype attrs = checkch(L, 1); +#if LPOSIX_CURSES_COMPLIANT + return pushokresult(slk_attroff(attrs)); +#else + return binding_notimplemented(L, "slk_attroff", "curses"); +#endif +} + + +/*** +Set the attributes for soft labels. +@function slk_attrset +@int attrs +@treturn bool `true`, if successful +@see curs_slk(3x) +*/ +static int +Pslk_attrset(lua_State *L) +{ + chtype attrs = checkch(L, 1); +#if LPOSIX_CURSES_COMPLIANT + return pushokresult(slk_attrset(attrs)); +#else + return binding_notimplemented(L, "slk_attrset", "curses"); +#endif +} + + +/*** +Put the terminal into cbreak mode. +@function cbreak +@bool[opt] on +@treturn bool `true`, if successful +@see curs_inopts(3x) +*/ +static int +Pcbreak(lua_State *L) +{ + if (lua_isnoneornil(L, 1) || lua_toboolean(L, 1)) + return pushokresult(cbreak()); + return pushokresult(nocbreak()); +} + + +/*** +Whether characters are echoed to the terminal as they are typed. +@function echo +@bool[opt] on +@treturn bool `true`, if successful +@see curs_inopts(3x) +*/ +static int +Pecho(lua_State *L) +{ + if (lua_isnoneornil(L, 1) || lua_toboolean(L, 1)) + return pushokresult(echo()); + return pushokresult(noecho()); +} + + +/*** +Put the terminal into raw mode. +@function raw +@bool[opt] on +@treturn bool `true`, if successful +@see curs_inopts(3x) +*/ +static int +Praw(lua_State *L) +{ + if (lua_isnoneornil(L, 1) || lua_toboolean(L, 1)) + return pushokresult(raw()); + return pushokresult(noraw()); +} + + +/*** +Put the terminal into halfdelay mode. +@function halfdelay +@int tenths delay in tenths of a second +@treturn bool `true`, if successful +@see curs_inopts(3x) +*/ +static int +Phalfdelay(lua_State *L) +{ + int tenths = checkint(L, 1); + return pushokresult(halfdelay(tenths)); +} + + +/*** +Whether to translate a return key to newline on input. +@function nl +@bool[opt] on +@treturn bool `true`, if successful +@see curs_outopts(3x) +*/ +static int +Pnl(lua_State *L) +{ + if (lua_isnoneornil(L, 1) || lua_toboolean(L, 1)) + return pushokresult(nl()); + return pushokresult(nonl()); +} + + +/*** +Return a printable representation of a character, ignoring attributes. +@function unctrl +@int c character to act on +@treturn string printable representation of *c* +@see curs_util(3x) +@see keyname +*/ +static int +Punctrl(lua_State *L) +{ + chtype c = checkch(L, 1); + return pushstringresult(unctrl(c)); +} + + +/*** +Return a printable representation of a key. +@function keyname +@int c a key +@treturn string key name of *c* +@see curs_util(3x) +@see unctrl +*/ +static int +Pkeyname(lua_State *L) +{ + int c = checkint(L, 1); + return pushstringresult(keyname(c)); +} + + +/*** +Insert padding characters to force a short delay. +@function delay_output +@int ms delay time in milliseconds +@treturn bool `true`, if successful +@see curs_util(3x) +@see napms +*/ +static int +Pdelay_output(lua_State *L) +{ + int ms = checkint(L, 1); + return pushokresult(delay_output(ms)); +} + + +/*** +Throw away any typeahead in the keyboard input buffer. +@function flushinp +@treturn bool `true`, if successful +@see curs_util(3x) +@see ungetch +*/ +static int +Pflushinp(lua_State *L) +{ + return pushboolresult(flushinp()); +} + + +/*** +Return a character to the keyboard input buffer. +@function ungetch +@int c +@treturn bool `true`, if successful +@see curs_getch(3x) +@see flushinp +*/ +static int +Pungetch(lua_State *L) +{ + int c = checkint(L, 1); + return pushokresult(ungetch(c)); +} + + +/*** +Create a new pad. +@function newpad +@int nlines +@int ncols +@treturn bool `true`, if successful +@see cur_pad(3x) +*/ +static int +Pnewpad(lua_State *L) +{ + int nlines = checkint(L, 1); + int ncols = checkint(L, 2); + lc_newwin(L, newpad(nlines, ncols)); + return 1; +} + + +static char ti_capname[32]; + +/*** +Fetch terminfo boolean capability. +@function tigetflag +@string capname +@treturn bool content of terminal boolean capability +@see curs_terminfo(3x) +@see terminfo(5) +*/ +static int +Ptigetflag (lua_State *L) +{ + int r; + + strlcpy (ti_capname, luaL_checkstring (L, 1), sizeof (ti_capname)); + r = tigetflag (ti_capname); + if (-1 == r) + return luaL_error (L, "`%s' is not a boolean capability", ti_capname); + return pushboolresult (r); +} + + +/*** +Fetch terminfo numeric capability. +@function tigetnum +@string capname +@treturn int content of terminal numeric capability +@see curs_terminfo(3x) +@see terminfo(5) +*/ +static int +Ptigetnum (lua_State *L) +{ + int res; + + strlcpy (ti_capname, luaL_checkstring (L, 1), sizeof (ti_capname)); + res = tigetnum (ti_capname); + if (-2 == res) + return luaL_error (L, "`%s' is not a numeric capability", ti_capname); + else if (-1 == res) + lua_pushnil (L); + else + lua_pushinteger(L, res); + return 1; +} + + +/*** +Fetch terminfo string capability. +@function tigetstr +@string capname +@treturn string content of terminal string capability +@see curs_terminfo(3x) +@see terminfo(5) +*/ +static int +Ptigetstr (lua_State *L) +{ + const char *res; + + strlcpy (ti_capname, luaL_checkstring (L, 1), sizeof (ti_capname)); + res = tigetstr (ti_capname); + if ((char *) -1 == res) + return luaL_error (L, "`%s' is not a string capability", ti_capname); + else if (NULL == res) + lua_pushnil (L); + else + lua_pushstring(L, res); + return 1; +} +#endif + + +static const luaL_Reg curseslib[] = +{ +#if HAVE_CURSES + LPOSIX_FUNC( Pbaudrate ), + LPOSIX_FUNC( Pbeep ), + LPOSIX_FUNC( Pcbreak ), + LPOSIX_FUNC( Pcolor_pair ), + LPOSIX_FUNC( Pcolor_pairs ), + LPOSIX_FUNC( Pcolors ), + LPOSIX_FUNC( Pcols ), + LPOSIX_FUNC( Pcurs_set ), + LPOSIX_FUNC( Pdelay_output ), + LPOSIX_FUNC( Pdoupdate ), + LPOSIX_FUNC( Pecho ), + LPOSIX_FUNC( Pendwin ), + LPOSIX_FUNC( Perasechar ), + LPOSIX_FUNC( Pflash ), + LPOSIX_FUNC( Pflushinp ), + LPOSIX_FUNC( Phalfdelay ), + LPOSIX_FUNC( Phas_colors ), + LPOSIX_FUNC( Phas_ic ), + LPOSIX_FUNC( Phas_il ), + LPOSIX_FUNC( Pinit_pair ), + LPOSIX_FUNC( Pisendwin ), + LPOSIX_FUNC( Pkeyname ), + LPOSIX_FUNC( Pkillchar ), + LPOSIX_FUNC( Plines ), + LPOSIX_FUNC( Plongname ), + LPOSIX_FUNC( Pnapms ), + LPOSIX_FUNC( Pnew_chstr ), + LPOSIX_FUNC( Pnewpad ), + LPOSIX_FUNC( Pnewwin ), + LPOSIX_FUNC( Pnl ), + LPOSIX_FUNC( Ppair_content ), + LPOSIX_FUNC( Praw ), + LPOSIX_FUNC( Presizeterm ), + LPOSIX_FUNC( Pripoffline ), + LPOSIX_FUNC( Pslk_attroff ), + LPOSIX_FUNC( Pslk_attron ), + LPOSIX_FUNC( Pslk_attrset ), + LPOSIX_FUNC( Pslk_clear ), + LPOSIX_FUNC( Pslk_init ), + LPOSIX_FUNC( Pslk_label ), + LPOSIX_FUNC( Pslk_noutrefresh ), + LPOSIX_FUNC( Pslk_refresh ), + LPOSIX_FUNC( Pslk_restore ), + LPOSIX_FUNC( Pslk_set ), + LPOSIX_FUNC( Pslk_touch ), + LPOSIX_FUNC( Pstart_color ), + LPOSIX_FUNC( Pstdscr ), + LPOSIX_FUNC( Ptermattrs ), + LPOSIX_FUNC( Ptermname ), + LPOSIX_FUNC( Ptigetflag ), + LPOSIX_FUNC( Ptigetnum ), + LPOSIX_FUNC( Ptigetstr ), + LPOSIX_FUNC( Punctrl ), + LPOSIX_FUNC( Pungetch ), + LPOSIX_FUNC( Puse_default_colors), +#endif + {NULL, NULL} +}; + +/*** +Constants. +@section constants +*/ + +/*** +Curses constants. +Any constants not available in the underlying system will be `nil` valued, +see @{curses.lua}. Many of the `KEY_` constants cannot be generated by +modern keyboards and are mostly for historical compatibility with ancient +terminal hardware keyboards. + +Note that, unlike the other posix submodules, almost all of these constants +remain undefined (`nil`) until after @{posix.curses.initscr} has returned +successfully. +@table posix.curses +@int ACS_BLOCK alternate character set solid block +@int ACS_BOARD alternate character set board of squares +@int ACS_BTEE alternate character set bottom-tee +@int ACS_BULLET alternate character set bullet +@int ACS_CKBOARD alternate character set stipple +@int ACS_DARROW alternate character set down arrow +@int ACS_DEGREE alternate character set degrees mark +@int ACS_DIAMOND alternate character set diamond +@int ACS_HLINE alternate character set horizontal line +@int ACS_LANTERN alternate character set lantern +@int ACS_LARROW alternate character set left arrow +@int ACS_LLCORNER alternate character set lower left corner +@int ACS_LRCORNER alternate character set lower right corner +@int ACS_LTEE alternate character set left tee +@int ACS_PLMINUS alternate character set plus/minus +@int ACS_PLUS alternate character set plus +@int ACS_RARROW alternate character set right arrow +@int ACS_RTEE alternate character set right tee +@int ACS_S1 alternate character set scan-line 1 +@int ACS_S9 alternate character set scan-line 9 +@int ACS_TTEE alternate character set top tee +@int ACS_UARROW alternate character set up arrow +@int ACS_ULCORNER alternate character set upper left corner +@int ACS_URCORNER alternate character set upper right corner +@int ACS_VLINE alternate character set vertical line +@int A_ALTCHARSET alternatate character set attribute +@int A_ATTRIBUTES attributed character attributes bitmask +@int A_BLINK blinking attribute +@int A_BOLD bold attribute +@int A_CHARTEXT attributed character text bitmask +@int A_COLOR attributed character color-pair bitmask +@int A_DIM half-bright attribute +@int A_INVIS invisible attribute +@int A_NORMAL normal attribute (all attributes off) +@int A_PROTECT protected attribute +@int A_REVERSE reverse video attribute +@int A_STANDOUT standout attribute +@int A_UNDERLINE underline attribute +@int COLOR_BLACK black color attribute +@int COLOR_BLUE blue color attribute +@int COLOR_CYAN cyan color attribute +@int COLOR_GREEN green color attribute +@int COLOR_MAGENTA magenta color attribute +@int COLOR_RED red color attribute +@int COLOR_WHITE white color attribute +@int COLOR_YELLOW yellow color attribute +@int KEY_A1 upper-left of keypad key +@int KEY_A3 upper-right of keypad key +@int KEY_B2 center of keypad key +@int KEY_BACKSPACE backspace key +@int KEY_BEG beginning key +@int KEY_BREAK break key +@int KEY_BTAB backtab key +@int KEY_C1 bottom-left of keypad key +@int KEY_C3 bottom-right of keypad key +@int KEY_CANCEL cancel key +@int KEY_CATAB clear all tabs key +@int KEY_CLEAR clear screen key +@int KEY_CLOSE close key +@int KEY_COMMAND command key +@int KEY_COPY copy key +@int KEY_CREATE create key +@int KEY_CTAB clear tab key +@int KEY_DC delete character key +@int KEY_DL delete line key +@int KEY_DOWN down arrow key +@int KEY_EIC exit insert char mode key +@int KEY_END end key +@int KEY_ENTER enter key +@int KEY_EOL clear to end of line key +@int KEY_EOS clear to end of screen key +@int KEY_EXIT exit key +@int KEY_F0 f0 key +@int KEY_F1 f1 key +@int KEY_F2 f2 key +@int KEY_F3 f3 key +@int KEY_F4 f4 key +@int KEY_F5 f5 key +@int KEY_F6 f6 key +@int KEY_F7 f7 key +@int KEY_F8 f8 key +@int KEY_F9 f9 key +@int KEY_F10 f10 key +@int KEY_F11 f11 key +@int KEY_F12 f12 key +@int KEY_F13 f13 key +@int KEY_F14 f14 key +@int KEY_F15 f15 key +@int KEY_F16 f16 key +@int KEY_F17 f17 key +@int KEY_F18 f18 key +@int KEY_F19 f19 key +@int KEY_F20 f20 key +@int KEY_F21 f21 key +@int KEY_F22 f22 key +@int KEY_F23 f23 key +@int KEY_F24 f24 key +@int KEY_F25 f25 key +@int KEY_F26 f26 key +@int KEY_F27 f27 key +@int KEY_F28 f28 key +@int KEY_F29 f29 key +@int KEY_F30 f30 key +@int KEY_F31 f31 key +@int KEY_F32 f32 key +@int KEY_F33 f33 key +@int KEY_F34 f34 key +@int KEY_F35 f35 key +@int KEY_F36 f36 key +@int KEY_F37 f37 key +@int KEY_F38 f38 key +@int KEY_F39 f39 key +@int KEY_F40 f40 key +@int KEY_F41 f41 key +@int KEY_F42 f42 key +@int KEY_F43 f43 key +@int KEY_F44 f44 key +@int KEY_F45 f45 key +@int KEY_F46 f46 key +@int KEY_F47 f47 key +@int KEY_F48 f48 key +@int KEY_F49 f49 key +@int KEY_F50 f50 key +@int KEY_F51 f51 key +@int KEY_F52 f52 key +@int KEY_F53 f53 key +@int KEY_F54 f54 key +@int KEY_F55 f55 key +@int KEY_F56 f56 key +@int KEY_F57 f57 key +@int KEY_F58 f58 key +@int KEY_F59 f59 key +@int KEY_F60 f60 key +@int KEY_F61 f61 key +@int KEY_F62 f62 key +@int KEY_F63 f63 key +@int KEY_FIND find key +@int KEY_HELP help key +@int KEY_HOME home key +@int KEY_IC enter insert char mode key +@int KEY_IL insert line key +@int KEY_LEFT cursor left key +@int KEY_LL home down or bottom key +@int KEY_MARK mark key +@int KEY_MESSAGE message key +@int KEY_MOUSE mouse event available virtual key +@int KEY_MOVE move key +@int KEY_NEXT next object key +@int KEY_NPAGE next page key +@int KEY_OPEN open key +@int KEY_OPTIONS options key +@int KEY_PPAGE previous page key +@int KEY_PREVIOUS prewious object key +@int KEY_PRINT print key +@int KEY_REDO redo key +@int KEY_REFERENCE reference key +@int KEY_REFRESH refresh key +@int KEY_REPLACE replace key +@int KEY_RESET hard reset key +@int KEY_RESIZE resize event virtual key +@int KEY_RESTART restart key +@int KEY_RESUME resume key +@int KEY_RIGHT cursor right key +@int KEY_SAVE save key +@int KEY_SBEG shift beginning key +@int KEY_SCANCEL shift cancel key +@int KEY_SCOMMAND shift command key +@int KEY_SCOPY shift copy key +@int KEY_SCREATE shift create key +@int KEY_SDC shift delete character key +@int KEY_SDL shift delete line key +@int KEY_SELECT select key +@int KEY_SEND send key +@int KEY_SEOL shift clear to end of line key +@int KEY_SEXIT shift exit key +@int KEY_SF scroll one line forward key +@int KEY_SFIND shift find key +@int KEY_SHELP shift help key +@int KEY_SHOME shift home key +@int KEY_SIC shift enter insert mode key +@int KEY_SLEFT shift cursor left key +@int KEY_SMESSAGE shift message key +@int KEY_SMOVE shift move key +@int KEY_SNEXT shift next object key +@int KEY_SOPTIONS shift options key +@int KEY_SPREVIOUS shift previous object key +@int KEY_SPRINT shift print key +@int KEY_SR scroll one line backward key +@int KEY_SREDO shift redo key +@int KEY_SREPLACE shift replace key +@int KEY_SRESET soft reset key +@int KEY_SRIGHT shift cursor right key +@int KEY_SRSUME shift resume key +@int KEY_SSAVE shift save key +@int KEY_SSUSPEND shift suspend key +@int KEY_STAB shift tab key +@int KEY_SUNDO shift undo key +@int KEY_SUSPEND suspend key +@int KEY_UNDO undo key +@int KEY_UP cursor up key +@usage + -- Print curses constants supported on this host. + for name, value in pairs (require "posix.curses") do + if type (value) == "number" then + print (name, value) + end + end +*/ + +LUALIB_API int +luaopen_posix_curses(lua_State *L) +{ + luaopen_posix_curses_window(L); + luaopen_posix_curses_chstr(L); + + luaL_register(L, "curses", curseslib); + lua_pushliteral(L, "posix curses for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + +#if HAVE_CURSES + lua_pushstring(L, "initscr"); + lua_pushvalue(L, -2); + lua_pushcclosure(L, Pinitscr, 1); + lua_settable(L, -3); +#endif + + return 1; +} diff --git a/ext/posix/curses/chstr.c b/ext/posix/curses/chstr.c new file mode 100644 index 0000000..79ac1f7 --- /dev/null +++ b/ext/posix/curses/chstr.c @@ -0,0 +1,306 @@ +/* + * Curses binding for Lua 5.1, 5.2 & 5.3. + * + * (c) Gary V. Vaughan 2013-2015 + * (c) Reuben Thomas 2009-2012 + * (c) Tiago Dionizio 2004-2007 + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +/*** +Curses attributed string buffers. + +An array of characters, plus associated curses attributes and +colors at each position. + +Although marginally useful alone, the constants used to set colors +and attributes in `chstr` buffers are not defined until **after** +`curses.initscr ()` has been called. + +@classmod posix.curses.chstr +*/ + +#ifndef LUAPOSIX_CURSES_CHSTR_C +#define LUAPOSIX_CURSES_CHSTR_C 1 + +#include + +#if HAVE_CURSES + +#include "_helpers.c" + + +static const char *CHSTRMETA = "posix.curses:chstr"; + + +typedef struct +{ + unsigned int len; + chtype str[1]; +} chstr; +#define CHSTR_SIZE(len) (sizeof(chstr) + len * sizeof(chtype)) + + +/* create new chstr object and leave it in the lua stack */ +static chstr * +chstr_new(lua_State *L, int len) +{ + chstr *cs; + + if (len < 1) + return luaL_error(L, "invalid chstr length"), NULL; + + cs = lua_newuserdata(L, CHSTR_SIZE(len)); + luaL_getmetatable(L, CHSTRMETA); + lua_setmetatable(L, -2); + cs->len = len; + return cs; +} + + +/* get chstr from lua (convert if needed) */ +static chstr * +checkchstr(lua_State *L, int narg) +{ + chstr *cs = (chstr*)luaL_checkudata(L, narg, CHSTRMETA); + if (cs) + return cs; + + luaL_argerror(L, narg, "bad curses chstr"); + + /*NOTREACHED*/ + return NULL; +} + + +/*** +Change the contents of the chstr. +@function set_str +@int o offset to start of change +@string s characters to insert into *cs* at *o* +@int[opt=A_NORMAL] attr attributes for changed elements +@int[opt=1] rep repeat count +@usage + cs = curses.chstr (10) + cs:set_str(0, "0123456789", curses.A_BOLD) +*/ +static int +Cset_str(lua_State *L) +{ + chstr *cs = checkchstr(L, 1); + int offset = checkint(L, 2); + const char *str = luaL_checkstring(L, 3); + int len = lua_strlen(L, 3); + int attr = optint(L, 4, A_NORMAL); + int rep = optint(L, 5, 1); + int i; + + if (offset < 0) + return 0; + + while (rep-- > 0 && offset <= (int)cs->len) + { + if (offset + len - 1 > (int)cs->len) + len = cs->len - offset + 1; + + for (i = 0; i < len; ++i) + cs->str[offset + i] = str[i] | attr; + offset += len; + } + + return 0; +} + + +/*** +Set a character in the buffer. +*ch* can be a one-character string, or an integer from `string.byte` +@function set_ch +@int o offset to start of change +@param int|string ch character to insert +@int[opt=A_NORMAL] attr attributes for changed elements +@int[opt=1] rep repeat count +@usage + -- Write a bold 'A' followed by normal 'a' chars to a new buffer + size = 10 + cs = curses.chstr (size) + cs:set_ch(0, 'A', curses.A_BOLD) + cs:set_ch(1, 'a', curses.A_NORMAL, size - 1) +*/ +static int +Cset_ch(lua_State *L) +{ + chstr* cs = checkchstr(L, 1); + int offset = checkint(L, 2); + chtype ch = checkch(L, 3); + int attr = optint(L, 4, A_NORMAL); + int rep = optint(L, 5, 1); + + while (rep-- > 0) + { + if (offset < 0 || offset >= (int) cs->len) + return 0; + + cs->str[offset] = ch | attr; + + ++offset; + } + return 0; +} + + +/*** +Get information from the chstr. +@function get +@int o offset from start of *cs* +@treturn int character at offset *o* in *cs* +@treturn int bitwise-OR of attributes at offset *o* in *cs* +@treturn int colorpair at offset *o* in *cs* +@usage + cs = curses.chstr (10) + cs:set_ch(0, 'A', curses.A_BOLD, 10) + --> 65 2097152 0 + print (cs:get (9)) +*/ +static int +Cget(lua_State *L) +{ + chstr* cs = checkchstr(L, 1); + int offset = checkint(L, 2); + chtype ch; + + if (offset < 0 || offset >= (int) cs->len) + return 0; + + ch = cs->str[offset]; + + lua_pushinteger(L, ch & A_CHARTEXT); + lua_pushinteger(L, ch & A_ATTRIBUTES); + lua_pushinteger(L, ch & A_COLOR); + return 3; +} + + +/*** +Retrieve chstr length. +@function len +@tparam chstr cs buffer to act on +@treturn int length of *cs* +@usage + cs = curses.chstr (123) + --> 123 + print (cs:len ()) +*/ +static int +Clen(lua_State *L) +{ + chstr *cs = checkchstr(L, 1); + return pushintresult(cs->len); +} + + +/*** +Duplicate chstr. +@function dup +@treturn chstr duplicate of *cs* +@usage + dup = cs:dup () +*/ +static int +Cdup(lua_State *L) +{ + chstr *cs = checkchstr(L, 1); + chstr *ncs = chstr_new(L, cs->len); + + memcpy(ncs->str, cs->str, CHSTR_SIZE(cs->len)); + return 1; +} + + +/*** +Initialise a new chstr. +@function __call +@int len buffer length +@treturn chstr a new chstr filled with spaces +@usage + cs = curses.chstr (10) +*/ +static int +C__call(lua_State *L) +{ + int len = checkint(L, 2); + chstr* ncs = chstr_new(L, len); + memset(ncs->str, ' ', len * sizeof(chtype)); + return 1; +} +#endif /*!HAVE_CURSES*/ + + +static const luaL_Reg posix_curses_chstr_fns[] = +{ +#if HAVE_CURSES + LPOSIX_FUNC( Clen ), + LPOSIX_FUNC( Cset_ch ), + LPOSIX_FUNC( Cset_str ), + LPOSIX_FUNC( Cget ), + LPOSIX_FUNC( Cdup ), +#endif + { NULL, NULL } +}; + + + +LUALIB_API int +luaopen_posix_curses_chstr(lua_State *L) +{ + int t, mt; + + luaL_register(L, "posix.curses.chstr", posix_curses_chstr_fns); + t = lua_gettop(L); + +#if HAVE_CURSES + lua_createtable(L, 0, 1); /* u = {} */ + lua_pushcfunction(L, C__call); + lua_setfield(L, -2, "__call"); /* u.__call = C__call */ + lua_setmetatable(L, -2); /* setmetatable (t, u) */ + + luaL_newmetatable(L, CHSTRMETA); + mt = lua_gettop(L); + + lua_pushvalue(L, mt); + lua_setfield(L, -2, "__index"); /* mt.__index = mt */ + lua_pushliteral(L, "PosixChstr"); + lua_setfield(L, -2, "_type"); /* mt._type = "PosixChstr" */ + + /* for k,v in pairs(t) do mt[k]=v end */ + for (lua_pushnil(L); lua_next(L, t) != 0;) + lua_setfield(L, mt, lua_tostring(L, -2)); + + lua_pop(L, 1); /* pop mt */ +#endif + + /* t.version = "posix.curses.chstr..." */ + lua_pushliteral(L, "posix.curses.chstr for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, t, "version"); + + return 1; +} + +#endif /*!LUAPOSIX_CURSES_CHSTR_C*/ diff --git a/ext/posix/curses/window.c b/ext/posix/curses/window.c new file mode 100644 index 0000000..cfa5a89 --- /dev/null +++ b/ext/posix/curses/window.c @@ -0,0 +1,1942 @@ +/* + * Curses binding for Lua 5.1, 5.2 & 5.3. + * + * (c) Gary V. Vaughan 2013-2015 + * (c) Reuben Thomas 2009-2012 + * (c) Tiago Dionizio 2004-2007 + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +/*** + Curses Window objects. + + The methods documented on this page are available on any Curses Window + object, such as created by: + + stdscr = curses.initscr () + window = curses.newwin (25, 80, 0, 0) + +@classmod posix.curses.window +*/ + +#include + +#if HAVE_CURSES + +#include "_helpers.c" + +#include "curses/chstr.c" + + +static const char *WINDOWMETA = "posix.curses:window"; + +static void +lc_newwin(lua_State *L, WINDOW *nw) +{ + if (nw) + { + WINDOW **w = lua_newuserdata(L, sizeof(WINDOW*)); + luaL_getmetatable(L, WINDOWMETA); + lua_setmetatable(L, -2); + *w = nw; + } + else + { + lua_pushliteral(L, "failed to create window"); + lua_error(L); + } +} + + +static WINDOW ** +lc_getwin(lua_State *L, int offset) +{ + WINDOW **w = (WINDOW**)luaL_checkudata(L, offset, WINDOWMETA); + if (w == NULL) + luaL_argerror(L, offset, "bad curses window"); + return w; +} + + +static WINDOW * +checkwin(lua_State *L, int offset) +{ + WINDOW **w = lc_getwin(L, offset); + if (*w == NULL) + luaL_argerror(L, offset, "attempt to use closed curses window"); + return *w; +} + + +/*** +Unique string representation of a @{posix.curses.window}. +@function __tostring +@treturn string unique string representation of the window object. +*/ +static int +W__tostring(lua_State *L) +{ + WINDOW **w = lc_getwin(L, 1); + char buff[34]; + if (*w == NULL) + strcpy(buff, "closed"); + else + sprintf(buff, "%p", lua_touserdata(L, 1)); + lua_pushfstring(L, "curses window (%s)", buff); + return 1; +} + + +/*** +Free all the resources associated with a window. +@function close +@see curs_window(3x) +*/ +static int +Wclose(lua_State *L) +{ + WINDOW **w = lc_getwin(L, 1); + if (*w != NULL && *w != stdscr) + { + delwin(*w); + *w = NULL; + } + return 0; +} + + +/*** +Move the position of a window. +@function move_window +@int y offset frow top of screen +@int x offset from left of screen +@treturn bool `true`, if successful +@see curs_window(3x) +*/ +static int +Wmove_window(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y = checkint(L, 2); + int x = checkint(L, 3); + return pushokresult(mvwin(w, y, x)); +} + + +/*** +Create a new subwindow. +@function sub +@treturn window a new absolutely positioned subwindow +@int nlines number of window lines +@int ncols number of window columns +@int begin_y top line of window +@int begin_x leftmost column of window +@see curs_window(3x) +@see derive +*/ +static int +Wsub(lua_State *L) +{ + WINDOW *orig = checkwin(L, 1); + int nlines = checkint(L, 2); + int ncols = checkint(L, 3); + int begin_y = checkint(L, 4); + int begin_x = checkint(L, 5); + + lc_newwin(L, subwin(orig, nlines, ncols, begin_y, begin_x)); + return 1; +} + + +/*** +Create a new derived window. +@function derive +@int nlines number of window lines +@int ncols number of window columns +@int begin_y top line of window +@int begin_x leftmost column of window +@treturn window a new relatively positioned subwindow +@see curs_window(3x) +@see sub +*/ +static int +Wderive(lua_State *L) +{ + WINDOW *orig = checkwin(L, 1); + int nlines = checkint(L, 2); + int ncols = checkint(L, 3); + int begin_y = checkint(L, 4); + int begin_x = checkint(L, 5); + + lc_newwin(L, derwin(orig, nlines, ncols, begin_y, begin_x)); + return 1; +} + + +/*** +Move the position of a derived window. +@function move_derived +@int par_y lines from top of parent window +@int par_x columns from left of parent window +@treturn bool `true`, if successful +@see curs_window(3x) +*/ +static int +Wmove_derived(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int par_y = checkint(L, 2); + int par_x = checkint(L, 3); + return pushokresult(mvderwin(w, par_y, par_x)); +} + + +/*** +Change the size of a window. +@function resize +@int height new number of lines +@int width new number of columns +@treturn bool `true`, if successful +@see curs_wresize(3x) +*/ +static int +Wresize(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int height = checkint(L, 2); + int width = checkint(L, 3); + + int c = wresize(w, height, width); + if (c == ERR) return 0; + + return pushokresult(true); +} + + +/*** +Make a duplicate of a window. +@function clone +@treturn window a new duplicate of this window +@see curs_window(3x) +*/ +static int +Wclone(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + lc_newwin(L, dupwin(w)); + return 1; +} + + +/*** +Mark ancestors of a window for refresh. +@function syncup +@see curs_window(3x) +*/ +static int +Wsyncup(lua_State *L) +{ + wsyncup(checkwin(L, 1)); + return 0; +} + + +/*** +Automatically mark ancestors of a changed window for refresh. +@function syncok +@bool bf +@treturn bool `true`, if successful +@see curs_window(3x) +*/ +static int +Wsyncok(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); +#if LPOSIX_CURSES_COMPLIANT + int bf = lua_toboolean(L, 2); + return pushokresult(syncok(w, bf)); +#else + return binding_notimplemented(L, "syncok", "curses"); +#endif +} + + +/*** +Mark cursor position of ancestors of a window for refresh. +@function cursyncup +@see curs_window(3x) +*/ +static int +Wcursyncup(lua_State *L) +{ + wcursyncup(checkwin(L, 1)); + return 0; +} + + +/*** +Mark child windows for refresh. +@function syncdown +@see curs_window(3x) +@see refresh +*/ +static int +Wsyncdown(lua_State *L) +{ + wsyncdown(checkwin(L, 1)); + return 0; +} + + +/*** +Refresh the window terminal display from the virtual screen. +@function refresh +@treturn bool `true`, if successful +@see curs_refresh(3x) +@see posix.curses.doupdate +@see noutrefresh +*/ +static int +Wrefresh(lua_State *L) +{ + return pushokresult(wrefresh(checkwin(L, 1))); +} + + +/*** +Copy the window backing screen to the virtual screen. +@function noutrefresh +@treturn bool `true`, if successful +@see curs_refresh(3x) +@see posix.curses.doupdate +@see refresh +*/ +static int +Wnoutrefresh(lua_State *L) +{ + return pushokresult(wnoutrefresh(checkwin(L, 1))); +} + + +/*** +Mark a window as having corrupted display that needs fully redrawing. +@function redrawwin +@treturn bool `true`, if successful +@see curs_refresh(3x) +@see redrawln +*/ +static int +Wredrawwin(lua_State *L) +{ + return pushokresult(redrawwin(checkwin(L, 1))); +} + + +/*** +Mark a range of lines in a window as corrupted and in need of redrawing. +@function redrawln +@int beg_line +@int num_lines +@treturn bool `true`, if successful +@see curs_refresh(3x) +*/ +static int +Wredrawln(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int beg_line = checkint(L, 2); + int num_lines = checkint(L, 3); + return pushokresult(wredrawln(w, beg_line, num_lines)); +} + + +/*** +Change the cursor position. +@function move +@int y +@int x +@treturn bool `true`, if successful +@see curs_move(3x) +*/ +static int +Wmove(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y = checkint(L, 2); + int x = checkint(L, 3); + return pushokresult(wmove(w, y, x)); +} + + +/*** +Scroll the window up *n* lines. +@function scrl +@int n +@treturn bool `true`, if successful +@see curs_scroll(3x) +*/ +static int +Wscrl(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int n = checkint(L, 2); + return pushokresult(wscrl(w, n)); +} + + +/*** +Set the changed state of a window since the last refresh. +@function touch +@param[opt] changed +@treturn bool `true`, if successful +@see curs_touch(3x) +*/ +static int +Wtouch(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int changed; + if (lua_isnoneornil(L, 2)) + changed = TRUE; + else + changed = lua_toboolean(L, 2); + + if (changed) + return pushokresult(touchwin(w)); + return pushokresult(untouchwin(w)); +} + + +/*** +Mark a range of lines as changed since the last refresh. +@function touchline +@int y +@int n +@param[opt] changed +@treturn bool `true`, if successful +@see curs_refresh(3x) +*/ +static int +Wtouchline(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y = checkint(L, 2); + int n = checkint(L, 3); + int changed; + if (lua_isnoneornil(L, 4)) + changed = TRUE; + else + changed = lua_toboolean(L, 4); + return pushokresult(wtouchln(w, y, n, changed)); +} + + +/*** +Has a particular window line changed since the last refresh? +@function is_linetouched +@int line +@treturn bool `true`, if successful +@see curs_refresh(3x) +*/ +static int +Wis_linetouched(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int line = checkint(L, 2); + return pushboolresult(is_linetouched(w, line)); +} + + +/*** +Has a window changed since the last refresh? +@function is_wintouched +@treturn bool `true`, if successful +@see curs_refresh(3x) +*/ +static int +Wis_wintouched(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + return pushboolresult(is_wintouched(w)); +} + + +/*** +Fetch the cursor position. +@function getyx +@treturn int y coordinate of top line +@treturn int x coordinate of left column +@see curs_getyx(3x) +*/ +static int +Wgetyx(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y, x; + getyx(w, y, x); + lua_pushinteger(L, y); + lua_pushinteger(L, x); + return 2; +} + + +/*** +Fetch the parent-relative coordinates of a subwindow. +@function getparyx +@treturn int y coordinate of top line relative to parent window +@treturn int x coordinate of left column relative to parent window +@see curs_getyx(3x) +*/ +static int +Wgetparyx(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y, x; + getparyx(w, y, x); + lua_pushinteger(L, y); + lua_pushinteger(L, x); + return 2; +} + + +/*** +Fetch the absolute top-left coordinates of a window. +@function getbegyx +@treturn int y coordinate of top line +@treturn int x coordinate of left column +@treturn bool `true`, if successful +@see curs_getyx(3x) +*/ +static int +Wgetbegyx(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y, x; + getbegyx(w, y, x); + lua_pushinteger(L, y); + lua_pushinteger(L, x); + return 2; +} + + +/*** +Fetch the absolute bottom-right coordinates of a window. +@function getmaxyx +@treturn int y coordinate of bottom line +@treturn int x coordinate of right column +@treturn bool `true`, if successful +@see curs_getyx(3x) +*/ +static int +Wgetmaxyx(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y, x; + getmaxyx(w, y, x); + lua_pushinteger(L, y); + lua_pushinteger(L, x); + return 2; +} + + +/*** +Draw a border around a window. +@function border +@int[opt] ls +@int[opt] rs +@int[opt] ts +@int[opt] bs +@int[opt] tl +@int[opt] tr +@int[opt] bl +@int[opt] br +@treturn bool `true`, if successful +@see curs_border(3x) +@usage + win:border (curses.ACS_VLINE, curses.ACS_VLINE, + curses.ACS_HLINE, curses.ACS_HLINE, + curses.ACS_ULCORNER, curses.ACS_URCORNER, + curses.ACS_LLCORNER, curses.ACS_LRCORNER) +*/ +static int +Wborder(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + chtype ls = optch(L, 2, 0); + chtype rs = optch(L, 3, 0); + chtype ts = optch(L, 4, 0); + chtype bs = optch(L, 5, 0); + chtype tl = optch(L, 6, 0); + chtype tr = optch(L, 7, 0); + chtype bl = optch(L, 8, 0); + chtype br = optch(L, 9, 0); + + return pushokresult(wborder(w, ls, rs, ts, bs, tl, tr, bl, br)); +} + + +/*** +Draw a box around a window. +@function box +@int verch +@int horch +@treturn bool `true`, if successful +@see curs_border(3x) +@see border +@usage + win:box (curses.ACS_VLINE, curses.ACS_HLINE) +*/ +static int +Wbox(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + chtype verch = checkch(L, 2); + chtype horch = checkch(L, 3); + + return pushokresult(box(w, verch, horch)); +} + + +/*** +Draw a row of characters from the current cursor position. +@function hline +@int ch +@int n +@treturn bool `true`, if successful +@see curs_border(3x) +@see mvhline +@see vline +@usage + _, width = win:getmaxyx () + win:hline (curses.ACS_HLINE, width - curs_x) +*/ +static int +Whline(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + chtype ch = checkch(L, 2); + int n = checkint(L, 3); + + return pushokresult(whline(w, ch, n)); +} + + +/*** +Draw a column of characters from the current cursor position. +@function vline +@int ch +@int n +@treturn bool `true`, if successful +@see curs_border(3x) +@see hline +@see mvvline +*/ +static int +Wvline(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + chtype ch = checkch(L, 2); + int n = checkint(L, 3); + + return pushokresult(wvline(w, ch, n)); +} + + +/*** +Move the cursor, then draw a row of characters from the new cursor position. +@function mvhline +@int y +@int x +@int ch +@int n +@treturn bool `true`, if successful +@see curs_border(3x) +*/ +static int +Wmvhline(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y = checkint(L, 2); + int x = checkint(L, 3); + chtype ch = checkch(L, 4); + int n = checkint(L, 5); + + return pushokresult(mvwhline(w, y, x, ch, n)); +} + + +/*** +Move the cursor, then draw a column of characters from the new cursor position. +@function mvvline +@int y +@int x +@int ch +@int n +@treturn bool `true`, if successful +@see curs_border(3x) +*/ +static int +Wmvvline(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y = checkint(L, 2); + int x = checkint(L, 3); + chtype ch = checkch(L, 4); + int n = checkint(L, 5); + + return pushokresult(mvwvline(w, y, x, ch, n)); +} + + +/*** +Write blanks to every character position in the window. +@function erase +@treturn bool `true`, if successful +@see curs_clear(3x) +*/ +static int +Werase(lua_State *L) +{ + return pushokresult(werase(checkwin(L, 1))); +} + + +/*** +Call @{erase} and then @{clearok}. +@function clear +@treturn bool `true`, if successful +@see curs_border(3x) +*/ +static int +Wclear(lua_State *L) +{ + return pushokresult(wclear(checkwin(L, 1))); +} + + +/*** +Write blanks to every character position after the cursor. +@function clrtobot +@treturn bool `true`, if successful +@see curs_border(3x) +*/ +static int +Wclrtobot(lua_State *L) +{ + return pushokresult(wclrtobot(checkwin(L, 1))); +} + + +/*** +Write blanks from the cursor to the end of the current line. +@function clrtoeol +@treturn bool `true`, if successful +@see curs_border(3x) +*/ +static int +Wclrtoeol(lua_State *L) +{ + return pushokresult(wclrtoeol(checkwin(L, 1))); +} + + +/*** +Advance the cursor after writing a character at the old position. +@function addch +@int ch +@treturn bool `true`, if successful +@see curs_addch(3x) +*/ +static int +Waddch(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + chtype ch = checkch(L, 2); + return pushokresult(waddch(w, ch)); +} + + +/*** +Call @{move}, then @{addch}. +@function mvaddch +@int ch +@treturn bool `true`, if successful +@see curs_addch(3x) +*/ +static int +Wmvaddch(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y = checkint(L, 2); + int x = checkint(L, 3); + chtype ch = checkch(L, 4); + return pushokresult(mvwaddch(w, y, x, ch)); +} + + +/*** +Call @{addch} then @{refresh}. +@function echoch +@int ch +@treturn bool `true`, if successful +@see curs_addch(3x) +*/ +static int +Wechoch(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + chtype ch = checkch(L, 2); + return pushokresult(wechochar(w, ch)); +} + + +/*** +Copy a @{posix.curses.chstr} starting at the current cursor position. +@function addchstr +@int chstr cs +@int[opt] n +@treturn bool `true`, if successful +@see curs_addchstr(3x) +*/ +static int +Waddchstr(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int n = optint(L, 3, -1); + chstr *cs = checkchstr(L, 2); + + if (n < 0 || n > (int) cs->len) + n = cs->len; + + return pushokresult(waddchnstr(w, cs->str, n)); +} + + +/*** +Call @{move} then @{addchstr}. +@function mvaddchstr +@int y +@int x +@int[opt] n +@treturn bool `true`, if successful +@see curs_addchstr(3x) +*/ +static int +Wmvaddchstr(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y = checkint(L, 2); + int x = checkint(L, 3); + int n = optint(L, 5, -1); + chstr *cs = checkchstr(L, 4); + + if (n < 0 || n > (int) cs->len) + n = cs->len; + + return pushokresult(mvwaddchnstr(w, y, x, cs->str, n)); +} + + +/*** +Copy a Lua string starting at the current cursor position. +@function addstr +@string str +@int[opt] n +@treturn bool `true`, if successful +@see curs_addstr(3x) +*/ +static int +Waddstr(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + const char *str = luaL_checkstring(L, 2); + int n = optint(L, 3, -1); + return pushokresult(waddnstr(w, str, n)); +} + + +/*** +Call @{move} then @{addstr}. +@function mvaddstr +@int y +@int x +@string str +@int[opt] n +@treturn bool `true`, if successful +@see curs_addstr(3x) +*/ +static int +Wmvaddstr(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y = checkint(L, 2); + int x = checkint(L, 3); + const char *str = luaL_checkstring(L, 4); + int n = optint(L, 5, -1); + return pushokresult(mvwaddnstr(w, y, x, str, n)); +} + + +/*** +Set the background attributes for subsequently written characters. +@function wbkgdset +@int ch +@see curs_bkgd(3x) +*/ +static int +Wwbkgdset(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + chtype ch = checkch(L, 2); + wbkgdset(w, ch); + return 0; +} + + +/*** +Call @{wbkgdset} and then set the background of every position accordingly. +@function wbkgd +@int ch +@treturn bool `true`, if successful +@see curs_bkgd(3x) +*/ +static int +Wwbkgd(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + chtype ch = checkch(L, 2); + return pushokresult(wbkgd(w, ch)); +} + + +/*** +Fetch the current background attribute for the window. +@function getbkgd +@treturn int current window background attribute +@see curs_bkgd(3x) +@see wbkgd +*/ +static int +Wgetbkgd(lua_State *L) +{ + return pushintresult(getbkgd(checkwin(L, 1))); +} + + +/*** +Set the flush on interrupt behaviour for the window. +@function intrflush +@bool bf +@treturn bool `true`, if successful +@see curs_inopts(3x) +*/ +static int +Wintrflush(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int bf = lua_toboolean(L, 2); + return pushokresult(intrflush(w, bf)); +} + + +/*** +Set the single value keypad keys behaviour for the window. +@function keypad +@bool[opt] on +@treturn bool `true`, if successful +@see curs_inopts(3x) +*/ +static int +Wkeypad(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int bf = lua_isnoneornil(L, 2) ? 1 : lua_toboolean(L, 2); + return pushokresult(keypad(w, bf)); +} + + +/*** +Force 8-bit (or 7-bit) input characters for the window. +@function meta +@bool on `true` to force 8-bit input characters +@treturn bool `true`, if successful +@see curs_inopts(3x) +*/ +static int +Wmeta(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int bf = lua_toboolean(L, 2); + return pushokresult(meta(w, bf)); +} + + +/*** +Force @{getch} to be non-blocking. +@function nodelay +@bool on +@treturn bool `true`, if successful +@see curs_inopts(3x) +*/ +static int +Wnodelay(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int bf = lua_toboolean(L, 2); + return pushokresult(nodelay(w, bf)); +} + + +/*** +For differentiating user input from terminal control sequences. +@function timeout +@int delay milliseconds, `0` for blocking, `-1` for non-blocking +@see curs_inopts(3x) +*/ +static int +Wtimeout(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int delay = checkint(L, 2); + wtimeout(w, delay); + return 0; +} + + +/*** +Return input immediately from this window. +@function notimeout +@bool bf +@treturn bool `true`, if successful +@see curs_inopts(3x) +*/ +static int +Wnotimeout(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int bf = lua_toboolean(L, 2); + return pushokresult(notimeout(w, bf)); +} + + +/*** +The next call to @{refresh} will clear and completely redraw the window. +@function clearok +@bool bf +@treturn bool `true`, if successful +@see curs_outopts(3x) +*/ +static int +Wclearok(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int bf = lua_toboolean(L, 2); + return pushokresult(clearok(w, bf)); +} + + +/*** +Use hardware character insert and delete on supporting terminals. +@function idcok +@bool bf +@treturn bool `true`, if successful +@see curs_outopts(3x) +*/ +static int +Widcok(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int bf = lua_toboolean(L, 2); + idcok(w, bf); + return 0; +} + + +/*** +Use hardware line insert and delete on supporting terminals. +@function idlok +@bool bf +@treturn bool `true`, if successful +@see curs_outopts(3x) +*/ +static int +Widlok(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int bf = lua_toboolean(L, 2); + return pushokresult(idlok(w, bf)); +} + + +/*** +No need to force synchronisation of hardware cursor. +@function leaveok +@bool bf +@treturn bool `true`, if successful +@see curs_outopts(3x) +*/ +static int +Wleaveok(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int bf = lua_toboolean(L, 2); + return pushokresult(leaveok(w, bf)); +} + + +/*** +Scroll up one line when the cursor writes to the last screen position. +@function scrollok +@bool bf +@treturn bool `true`, if successful +@see curs_outopts(3x) +*/ +static int +Wscrollok(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int bf = lua_toboolean(L, 2); + return pushokresult(scrollok(w, bf)); +} + + +/*** +Automatically call @{refresh} whenever the window content is changed. +@function immedok +@bool bf +@treturn bool `true`, if successful +@see curs_outopts(3x) +*/ +static int +Wimmedok(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); +#if LPOSIX_CURSES_COMPLIANT + int bf = lua_toboolean(L, 2); + immedok(w, bf); + return 0; +#else + return binding_notimplemented(L, "immedok", "curses"); +#endif +} + + +/*** +Set a software scrolling region for the window. +@function wsetscrreg +@int top top line of the scrolling region (line 0 is the first line) +@int bot bottom line of the scrolling region +@treturn bool `true`, if successful +@see curs_outopts(3x) +*/ +static int +Wwsetscrreg(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int top = checkint(L, 2); + int bot = checkint(L, 3); + return pushokresult(wsetscrreg(w, top, bot)); +} + + +/*** +Overlay this window on top of another non-destructively. +@function overlay +@tparam window dst destination window +@treturn bool `true`, if successful +@see curs_overlay(3x) +@see overwrite +*/ +static int +Woverlay(lua_State *L) +{ + WINDOW *srcwin = checkwin(L, 1); + WINDOW *dstwin = checkwin(L, 2); + return pushokresult(overlay(srcwin, dstwin)); +} + + +/*** +Destructively overwrite another window with this one. +@function overwrite +@tparam window dst destination window +@treturn bool `true`, if successful +@see curs_inopts(3x) +*/ +static int +Woverwrite(lua_State *L) +{ + WINDOW *srcwin = checkwin(L, 1); + WINDOW *dstwin = checkwin(L, 2); + return pushokresult(overwrite(srcwin, dstwin)); +} + + +/*** +Overlay a rectangle of this window over another. +@function copywin +@tparam window dst destination window +@int st top row from this window +@int sl left column from this window +@int dt top row of rectangle +@int dl left column of rectangle +@int db bottom row of rectangle +@int dr right column of rectangle +@bool overlay if `true`, copy destructively like @{overlay} +@treturn bool `true`, if successful +@see curs_inopts(3x) +*/ +static int +Wcopywin(lua_State *L) +{ + WINDOW *srcwin = checkwin(L, 1); + WINDOW *dstwin = checkwin(L, 2); + int sminrow = checkint(L, 3); + int smincol = checkint(L, 4); + int dminrow = checkint(L, 5); + int dmincol = checkint(L, 6); + int dmaxrow = checkint(L, 7); + int dmaxcol = checkint(L, 8); + int woverlay = lua_toboolean(L, 9); + return pushokresult(copywin(srcwin, dstwin, sminrow, + smincol, dminrow, dmincol, dmaxrow, dmaxcol, woverlay)); +} + + +/*** +Delete the character under the cursor. +@function delch +@treturn bool `true`, if successful +@see curs_delch(3x) +*/ +static int +Wdelch(lua_State *L) +{ + return pushokresult(wdelch(checkwin(L, 1))); +} + + +/*** +Call @{move} then @{delch}. +@function mvdelch +@int y +@int x +@treturn bool `true`, if successful +@see curs_util(3x) +*/ +static int +Wmvdelch(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y = checkint(L, 2); + int x = checkint(L, 3); + return pushokresult(mvwdelch(w, y, x)); +} + + +/*** +Move the lines below the cursor up, to delete the current line. +@function deleteln +@treturn bool `true`, if successful +@see curs_deleteln(3x) +*/ +static int +Wdeleteln(lua_State *L) +{ + return pushokresult(wdeleteln(checkwin(L, 1))); +} + + +/*** +Move the current line and those below down one line, leaving a new blank line. +@function insertln +@treturn bool `true`, if successful +@see curs_deleteln(3x) +*/ +static int +Winsertln(lua_State *L) +{ + return pushokresult(winsertln(checkwin(L, 1))); +} + + +/*** +Call @{deleteln} *n* times. +@function winsdelln +@int n +@treturn bool `true`, if successful +@see curs_deleteln(3x) +*/ +static int +Wwinsdelln(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int n = checkint(L, 2); + return pushokresult(winsdelln(w, n)); +} + + +/*** +Read a character from the window input. +@function getch +@treturn bool `true`, if successful +@see curs_getch(3x) +@see posix.curses.cbreak +@see posix.curses.echo +@see keypad +*/ +static int +Wgetch(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int c = wgetch(w); + + if (c == ERR) + return 0; + + return pushintresult(c); +} + + +/*** +Call @{move} then @{getch} +@function mvgetch +@int y +@int x +@treturn bool `true`, if successful +@see curs_deleteln(3x) +*/ +static int +Wmvgetch(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y = checkint(L, 2); + int x = checkint(L, 3); + int c; + + if (wmove(w, y, x) == ERR) + return 0; + + c = wgetch(w); + + if (c == ERR) + return 0; + + return pushintresult(c); +} + + +/*** +Read characters up to the next newline from the window input. +@function getstr +@int[opt] n +@treturn bool `true`, if successful +@see curs_getstr(3x) +*/ +static int +Wgetstr(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int n = optint(L, 2, 0); + char buf[LUAL_BUFFERSIZE]; + + if (n == 0 || n >= LUAL_BUFFERSIZE) + n = LUAL_BUFFERSIZE - 1; + if (wgetnstr(w, buf, n) == ERR) + return 0; + + return pushstringresult(buf); +} + + +/*** +Call @{move} then @{getstr}. +@function mvgetstr +@int y +@int x +@int[opt=-1] n +@treturn bool `true`, if successful +@see curs_getstr(3x) +*/ +static int +Wmvgetstr(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y = checkint(L, 2); + int x = checkint(L, 3); + int n = optint(L, 4, -1); + char buf[LUAL_BUFFERSIZE]; + + if (n == 0 || n >= LUAL_BUFFERSIZE) + n = LUAL_BUFFERSIZE - 1; + if (mvwgetnstr(w, y, x, buf, n) == ERR) + return 0; + + return pushstringresult(buf); +} + + +/*** +Fetch the attributed character at the current cursor position. +@function winch +@treturn bool `true`, if successful +@see curs_inch(3x) +*/ +static int +Wwinch(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + return pushintresult(winch(w)); +} + + +/*** +Call @{move} then @{winch} +@function mvwinch +@int y +@int x +@treturn bool `true`, if successful +@see curs_getstr(3x) +*/ +static int +Wmvwinch(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y = checkint(L, 2); + int x = checkint(L, 3); + return pushintresult(mvwinch(w, y, x)); +} + + +/*** +Fetch attributed characters from cursor position up to rightmost window position. +@function winchnstr +@int n +@treturn posix.curses.chstr characters from cursor to end of line +@see curs_inchstr(3x) +@see winnstr +*/ +static int +Wwinchnstr(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int n = checkint(L, 2); + chstr *cs = chstr_new(L, n); + + if (winchnstr(w, cs->str, n) == ERR) + return 0; + + return 1; +} + + +/*** +Call @{move} then @{winchnstr}. +@function mvwinchnstr +@int y +@int x +@int n +@treturn bool `true`, if successful +@see curs_getstr(3x) +*/ +static int +Wmvwinchnstr(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y = checkint(L, 2); + int x = checkint(L, 3); + int n = checkint(L, 4); + chstr *cs = chstr_new(L, n); + + if (mvwinchnstr(w, y, x, cs->str, n) == ERR) + return 0; + + return 1; +} + + +/*** +Fetch a string from cursor position up to rightmost window position. +@function winnstr +@int n +@treturn bool `true`, if successful +@see curs_instr(3x) +@see winchnstr +*/ +static int +Wwinnstr(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int n = checkint(L, 2); + char buf[LUAL_BUFFERSIZE]; + + if (n >= LUAL_BUFFERSIZE) + n = LUAL_BUFFERSIZE - 1; + if (winnstr(w, buf, n) == ERR) + return 0; + + lua_pushlstring(L, buf, n); + return 1; +} + + +/*** +Call @{move} then @{winnstr}. +@function mvwinnstr +@int y +@int x +@int n +@treturn bool `true`, if successful +@see curs_instr(3x) +*/ +static int +Wmvwinnstr(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y = checkint(L, 2); + int x = checkint(L, 3); + int n = checkint(L, 4); + char buf[LUAL_BUFFERSIZE]; + + if (n >= LUAL_BUFFERSIZE) + n = LUAL_BUFFERSIZE - 1; + if (mvwinnstr(w, y, x, buf, n) == ERR) + return 0; + + lua_pushlstring(L, buf, n); + return 1; +} + + +/*** +Insert a character before the current cursor position. +@function winsch +@int ch +@treturn bool `true`, if successful +@see curs_insch(3x) +*/ +static int +Wwinsch(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + chtype ch = checkch(L, 2); + return pushokresult(winsch(w, ch)); +} + + +/*** +Call @{move} then @{winsch}. +@function mvwinsch +@int y +@int x +@int ch +@treturn bool `true`, if successful +@see curs_insch(3x) +*/ +static int +Wmvwinsch(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y = checkint(L, 2); + int x = checkint(L, 3); + chtype ch = checkch(L, 4); + return pushokresult(mvwinsch(w, y, x, ch)); +} + + +/*** +Insert a string of characters before the current cursor position. +@function winsstr +@string str +@treturn bool `true`, if successful +@see curs_insstr(3x) +*/ +static int +Wwinsstr(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + const char *str = luaL_checkstring(L, 2); + return pushokresult(winsnstr(w, str, lua_strlen(L, 2))); +} + + +/*** +Call @{move} then @{winsstr}. +@function mvwinsstr +@int y +@int x +@string str +@treturn bool `true`, if successful +@see curs_getstr(3x) +*/ +static int +Wmvwinsstr(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y = checkint(L, 2); + int x = checkint(L, 3); + const char *str = luaL_checkstring(L, 4); + return pushokresult(mvwinsnstr(w, y, x, str, lua_strlen(L, 2))); +} + + +/*** +Like @{winsstr}, but no more than *n* characters. +@function winsnstr +@string str +@int n +@treturn bool `true`, if successful +@see curs_getstr(3x) +*/ +static int +Wwinsnstr(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + const char *str = luaL_checkstring(L, 2); + int n = checkint(L, 3); + return pushokresult(winsnstr(w, str, n)); +} + + +/*** +Call @{move} then @{winsnstr}. +@function mvwinsnstr +@int y +@int x +@string str +@int n +@treturn bool `true`, if successful +@see curs_getstr(3x) +*/ +static int +Wmvwinsnstr(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int y = checkint(L, 2); + int x = checkint(L, 3); + const char *str = luaL_checkstring(L, 4); + int n = checkint(L, 5); + return pushokresult(mvwinsnstr(w, y, x, str, n)); +} + + +/*** +Return a new subpad window object. +@function subpad +@int nlines +@int ncols +@int begin_y +@int begin_x +@treturn window a new subpad window object +@see cur_pad(3x) +*/ +static int +Wsubpad(lua_State *L) +{ + WINDOW *orig = checkwin(L, 1); + int nlines = checkint(L, 2); + int ncols = checkint(L, 3); + int begin_y = checkint(L, 4); + int begin_x = checkint(L, 5); + + lc_newwin(L, subpad(orig, nlines, ncols, begin_y, begin_x)); + return 1; +} + + +/*** +Equivalent to @{refresh} for use with pad windows. +@function prefresh +@int st top row from this pad window +@int sl left column from this pad window +@int dt top row of rectangle +@int dl left column of rectangle +@int db bottom row of rectangle +@int dr right column of rectangle +@treturn bool `true`, if successful +@see cur_pad(3x) +*/ +static int +Wprefresh(lua_State *L) +{ + WINDOW *p = checkwin(L, 1); + int pminrow = checkint(L, 2); + int pmincol = checkint(L, 3); + int sminrow = checkint(L, 4); + int smincol = checkint(L, 5); + int smaxrow = checkint(L, 6); + int smaxcol = checkint(L, 7); + + return pushokresult(prefresh(p, pminrow, pmincol, + sminrow, smincol, smaxrow, smaxcol)); +} + + +/*** +Equivalent to @{noutrefresh} for use with pad windows. +@function pnoutrefresh +@int st top row from this pad window +@int sl left column from this pad window +@int dt top row of rectangle +@int dl left column of rectangle +@int db bottom row of rectangle +@int dr right column of rectangle +@treturn bool `true`, if successful +@see cur_pad(3x) +*/ +static int +Wpnoutrefresh(lua_State *L) +{ + WINDOW *p = checkwin(L, 1); + int pminrow = checkint(L, 2); + int pmincol = checkint(L, 3); + int sminrow = checkint(L, 4); + int smincol = checkint(L, 5); + int smaxrow = checkint(L, 6); + int smaxcol = checkint(L, 7); + + return pushokresult(pnoutrefresh(p, pminrow, pmincol, + sminrow, smincol, smaxrow, smaxcol)); +} + + +/*** +An efficient equivalent to @{addch} followed by @{refresh}. +@function pechochar +@int ch +@treturn bool `true`, if successful +@see cur_pad(3x) +*/ +static int +Wpechochar(lua_State *L) +{ + WINDOW *p = checkwin(L, 1); + chtype ch = checkch(L, 2); + return pushokresult(pechochar(p, ch)); +} + + +/*** +Turn off the given attributes for subsequent writes to the window. +@function attroff +@int attrs +@treturn bool `true`, if successful +@see curs_attr(3x) +@see standend +*/ +static int +Wattroff(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int attrs = checkint(L, 2); + return pushokresult(wattroff(w, attrs)); +} + + +/*** +Turn on the given attributes for subsequent writes to the window. +@function attron +@int attrs +@treturn bool `true`, if successful +@see curs_attr(3x) +*/ +static int +Wattron(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int attrs = checkint(L, 2); + return pushokresult(wattron(w, attrs)); +} + + +/*** +Set the given attributes for subsequent writes to the window. +@function attrset +@int attrs +@treturn bool `true`, if successful +@see curs_attr(3x) +*/ +static int +Wattrset(lua_State *L) +{ + WINDOW *w = checkwin(L, 1); + int attrs = checkint(L, 2); + return pushokresult(wattrset(w, attrs)); +} + + +/*** +Turn off all attributes for subsequent writes to the window. +@function standend +@treturn bool `true`, if successful +@see curs_attr(3x) +*/ +static int +Wstandend(lua_State *L) +{ + return pushokresult(wstandend(checkwin(L, 1))); +} + + +/*** +Set `A_STANDOUT` for subsequent writes to the window. +@function standout +@treturn bool `true`, if successful +@see curs_attr(3x) +*/ +static int +Wstandout(lua_State *L) +{ + return pushokresult(wstandout(checkwin(L, 1))); +} +#endif /*!HAVE_CURSES*/ + + +static const luaL_Reg posix_curses_window_fns[] = +{ +#if HAVE_CURSES + LPOSIX_FUNC( W__tostring ), + LPOSIX_FUNC( Waddch ), + LPOSIX_FUNC( Waddchstr ), + LPOSIX_FUNC( Waddstr ), + LPOSIX_FUNC( Wattroff ), + LPOSIX_FUNC( Wattron ), + LPOSIX_FUNC( Wattrset ), + LPOSIX_FUNC( Wborder ), + LPOSIX_FUNC( Wbox ), + LPOSIX_FUNC( Wclear ), + LPOSIX_FUNC( Wclearok ), + LPOSIX_FUNC( Wclone ), + LPOSIX_FUNC( Wclose ), + LPOSIX_FUNC( Wclrtobot ), + LPOSIX_FUNC( Wclrtoeol ), + LPOSIX_FUNC( Wcopywin ), + LPOSIX_FUNC( Wcursyncup ), + LPOSIX_FUNC( Wdelch ), + LPOSIX_FUNC( Wdeleteln ), + LPOSIX_FUNC( Wderive ), + LPOSIX_FUNC( Wechoch ), + LPOSIX_FUNC( Werase ), + LPOSIX_FUNC( Wgetbegyx ), + LPOSIX_FUNC( Wgetbkgd ), + LPOSIX_FUNC( Wgetch ), + LPOSIX_FUNC( Wgetmaxyx ), + LPOSIX_FUNC( Wgetparyx ), + LPOSIX_FUNC( Wgetstr ), + LPOSIX_FUNC( Wgetyx ), + LPOSIX_FUNC( Whline ), + LPOSIX_FUNC( Widcok ), + LPOSIX_FUNC( Widlok ), + LPOSIX_FUNC( Wimmedok ), + LPOSIX_FUNC( Winsertln ), + LPOSIX_FUNC( Wintrflush ), + LPOSIX_FUNC( Wis_linetouched ), + LPOSIX_FUNC( Wis_wintouched ), + LPOSIX_FUNC( Wkeypad ), + LPOSIX_FUNC( Wleaveok ), + LPOSIX_FUNC( Wmeta ), + LPOSIX_FUNC( Wmove ), + LPOSIX_FUNC( Wmove_derived ), + LPOSIX_FUNC( Wmove_window ), + LPOSIX_FUNC( Wmvaddch ), + LPOSIX_FUNC( Wmvaddchstr ), + LPOSIX_FUNC( Wmvaddstr ), + LPOSIX_FUNC( Wmvdelch ), + LPOSIX_FUNC( Wmvgetch ), + LPOSIX_FUNC( Wmvgetstr ), + LPOSIX_FUNC( Wmvhline ), + LPOSIX_FUNC( Wmvvline ), + LPOSIX_FUNC( Wmvwinch ), + LPOSIX_FUNC( Wmvwinchnstr ), + LPOSIX_FUNC( Wmvwinnstr ), + LPOSIX_FUNC( Wmvwinsch ), + LPOSIX_FUNC( Wmvwinsnstr ), + LPOSIX_FUNC( Wmvwinsstr ), + LPOSIX_FUNC( Wnodelay ), + LPOSIX_FUNC( Wnotimeout ), + LPOSIX_FUNC( Wnoutrefresh ), + LPOSIX_FUNC( Woverlay ), + LPOSIX_FUNC( Woverwrite ), + LPOSIX_FUNC( Wpechochar ), + LPOSIX_FUNC( Wpnoutrefresh ), + LPOSIX_FUNC( Wprefresh ), + LPOSIX_FUNC( Wredrawln ), + LPOSIX_FUNC( Wredrawwin ), + LPOSIX_FUNC( Wrefresh ), + LPOSIX_FUNC( Wresize ), + LPOSIX_FUNC( Wscrl ), + LPOSIX_FUNC( Wscrollok ), + LPOSIX_FUNC( Wstandend ), + LPOSIX_FUNC( Wstandout ), + LPOSIX_FUNC( Wsub ), + LPOSIX_FUNC( Wsubpad ), + LPOSIX_FUNC( Wsyncdown ), + LPOSIX_FUNC( Wsyncok ), + LPOSIX_FUNC( Wsyncup ), + LPOSIX_FUNC( Wtimeout ), + LPOSIX_FUNC( Wtouch ), + LPOSIX_FUNC( Wtouchline ), + LPOSIX_FUNC( Wvline ), + LPOSIX_FUNC( Wwbkgd ), + LPOSIX_FUNC( Wwbkgdset ), + LPOSIX_FUNC( Wwinch ), + LPOSIX_FUNC( Wwinchnstr ), + LPOSIX_FUNC( Wwinnstr ), + LPOSIX_FUNC( Wwinsch ), + LPOSIX_FUNC( Wwinsdelln ), + LPOSIX_FUNC( Wwinsnstr ), + LPOSIX_FUNC( Wwinsstr ), + LPOSIX_FUNC( Wwsetscrreg ), + {"__gc", Wclose }, /* rough safety net */ +#endif + {NULL, NULL} +}; + + +LUALIB_API int +luaopen_posix_curses_window(lua_State *L) +{ + int t, mt; + + luaL_register(L, "posix.curses.window", posix_curses_window_fns); + t = lua_gettop(L); + +#if HAVE_CURSES + luaL_newmetatable(L, WINDOWMETA); + mt = lua_gettop(L); + + lua_pushvalue(L, mt); + lua_setfield(L, mt, "__index"); /* mt.__index = mt */ + lua_pushliteral(L, "PosixWindow"); + lua_setfield(L, mt, "_type"); /* mt._type = "Curses Window" */ + + /* for k,v in pairs(t) do mt[k]=v end */ + for (lua_pushnil(L); lua_next(L, t) != 0;) + lua_setfield(L, mt, lua_tostring(L, -2)); + + lua_pop(L, 1); /* pop mt */ +#endif + + /* t.version = "posix.curses.window..." */ + lua_pushliteral(L, "posix.curses.window for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, t, "version"); + + return 1; +} diff --git a/ext/posix/dirent.c b/ext/posix/dirent.c new file mode 100644 index 0000000..67a4e21 --- /dev/null +++ b/ext/posix/dirent.c @@ -0,0 +1,140 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Directory Iterators. + +@module posix.dirent +*/ + +#include + +#include + +#include "_helpers.c" + + +/*** +Contents of directory. +@function dir +@string[opt="."] path directory to act on +@treturn table contents of *path* +@see dir.lua +*/ +static int +Pdir(lua_State *L) +{ + const char *path = optstring(L, 1, "."); + DIR *d; + checknargs(L, 1); + d = opendir(path); + /* Throw an argument error for consistency with eg. io.lines */ + if (d == NULL) + { + const char *msg = strerror (errno); + msg = lua_pushfstring(L, "%s: %s", path, msg); + return luaL_argerror(L, 1, msg); + } + else + { + int i; + struct dirent *entry; + lua_newtable(L); + for (i=1; (entry = readdir(d)) != NULL; i++) + { + lua_pushstring(L, entry->d_name); + lua_rawseti(L, -2, i); + } + closedir(d); + lua_pushinteger(L, i-1); + return 2; + } +} + + +static int +aux_files(lua_State *L) +{ + DIR **p = (DIR **)lua_touserdata(L, lua_upvalueindex(1)); + DIR *d = *p; + struct dirent *entry; + if (d == NULL) + return 0; + entry = readdir(d); + if (entry == NULL) + { + closedir(d); + *p=NULL; + return 0; + } + return pushstringresult(entry->d_name); +} + + +static int +dir_gc (lua_State *L) +{ + DIR *d = *(DIR **)lua_touserdata(L, 1); + if (d!=NULL) + closedir(d); + return 0; +} + + +/*** +Iterator over all files in named directory. +@function files +@string[opt="."] path directory to act on +@return an iterator +*/ +static int +Pfiles(lua_State *L) +{ + const char *path = optstring(L, 1, "."); + DIR **d; + checknargs(L, 1); + d = (DIR **)lua_newuserdata(L, sizeof(DIR *)); + *d = opendir(path); + /* Throw an argument error for consistency with eg. io.lines */ + if (*d == NULL) + { + const char *msg = strerror (errno); + msg = lua_pushfstring(L, "%s: %s", path, msg); + return luaL_argerror(L, 1, msg); + } + if (luaL_newmetatable(L, PACKAGE_NAME " dir handle")) + { + lua_pushcfunction(L, dir_gc); + lua_setfield(L, -2, "__gc"); + } + lua_setmetatable(L, -2); + lua_pushcclosure(L, aux_files, 1); + return 1; +} + + +static const luaL_Reg posix_dirent_fns[] = +{ + LPOSIX_FUNC( Pdir ), + LPOSIX_FUNC( Pfiles ), + {NULL, NULL} +}; + + +LUALIB_API int +luaopen_posix_dirent(lua_State *L) +{ + luaL_register(L, "posix.dirent", posix_dirent_fns); + lua_pushliteral(L, "posix.dirent for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + return 1; +} diff --git a/ext/posix/errno.c b/ext/posix/errno.c new file mode 100644 index 0000000..e9f7326 --- /dev/null +++ b/ext/posix/errno.c @@ -0,0 +1,397 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + System error codes and messages. + + Usually, you'll be able to work with the error messages returned as the + second value from failed calls directly, without having to manually save + and stringify the system messages as you would in C. For completeness, + the functions are still available here. + +@module posix.errno +*/ + +#include + +#include +#include +#include + +#include "_helpers.c" + +#ifndef errno +extern int errno; +#endif + + +/*** +Describe an error code/and or read `errno` +@function errno +@int[opt=current errno] n optional error code +@return description +@return error code +@see strerror(3) +@see errno +@usage +local strerr, nerr = P.errno () +*/ +static int +Perrno(lua_State *L) +{ + int n = optint(L, 1, errno); + checknargs(L, 1); + lua_pushstring(L, strerror(n)); + lua_pushinteger(L, n); + return 2; +} + + +/*** +Set errno. +@function set_errno +@int n error code +@see errno(3) +@usage +P.errno (P.EBADF) +*/ +static int +Pset_errno(lua_State *L) +{ + errno = checkint(L, 1); + checknargs(L, 1); + return 0; +} + + +static const luaL_Reg posix_errno_fns[] = +{ + LPOSIX_FUNC( Perrno ), + LPOSIX_FUNC( Pset_errno ), + {NULL, NULL} +}; + + +/*** +Constants. +@section constants +*/ + +/*** +Error constants. +Any constants not available in the underlying system will be `nil` valued. + +If you find one of the luaposix APIs returns an error code not listed here, +please raise an issue [here](http://github.com/luaposix/luaposixissues), stating +the symbolic name of the constant (from `/usr/include/errno.h` or equivalent). +@table posix.errno +@int E2BIG argument list too long +@int EACCES permission denied +@int EADDRINUSE address already in use +@int EADDRNOTAVAIL can't assign requested address +@int EAFNOSUPPORT address family not supported by protocol family +@int EAGAIN resource temporarily unavailable +@int EALREADY operation already in progress +@int EBADF bad file descriptor +@int EBADMSG bad message +@int EBUSY resource busy +@int ECANCELED operation canceled +@int ECHILD no child processes +@int ECONNABORTED software caused connection abort +@int ECONNREFUSED connection refused +@int ECONNRESET connection reset by peer +@int EDEADLK resource deadlock avoided +@int EDESTADDRREQ destination address required +@int EDOM numerical argument out of domain +@int EEXIST file exists +@int EFAULT bad address +@int EFBIG file too large +@int EHOSTUNREACH no route to host +@int EIDRM identifier removed +@int EILSEQ illegal byte sequence +@int EINPROGRESS operation now in progress +@int EINTR interrupted system call +@int EINVAL invalid argument +@int EIO input/output error +@int EISCONN socket is already connected +@int EISDIR is a directory +@int ELOOP too many levels of symbolic links +@int EMFILE too many open files +@int EMLINK too many links +@int EMSGSIZE message too long +@int ENAMETOOLONG file name too long +@int ENETDOWN network is down +@int ENETRESET network dropped connection on reset +@int ENETUNREACH network is unreachable +@int ENFILE too many open files in system +@int ENOBUFS no buffer space available +@int ENODEV operation not supported by device +@int ENOENT no such file or directory +@int ENOEXEC exec format error +@int ENOLCK no locks available +@int ENOMEM cannot allocate memory +@int ENOMSG no message of desired type +@int ENOPROTOOPT protocol not available +@int ENOSPC no space left on device +@int ENOSYS function not implemented +@int ENOTCONN socket is not connected +@int ENOTDIR not a directory +@int ENOTEMPTY directory not empty +@int ENOTSOCK socket operation on non-socket +@int ENOTSUP operation not supported +@int ENOTTY inappropriate ioctl for device +@int ENXIO device not configured +@int EOPNOTSUPP operation not supported on socket +@int EOVERFLOW value too large to be stored in data type +@int EPERM operation not permitted +@int EPIPE broken pipe +@int EPROTO protocol error +@int EPROTONOSUPPORT protocol not supported +@int EPROTOTYPE protocol wrong type for socket +@int ERANGE result too large +@int EROFS read-only file system +@int ESPIPE illegal seek +@int ESRCH no such process +@int ETIMEDOUT operation timed out +@int ETXTBSY text file busy +@int EWOULDBLOCK operation would block +@int EXDEV cross-device link +@usage + -- Print errno constants supported on this host. + for name, value in pairs (require "posix.errno") do + if type (value) == "number" then + print (name, value) + end + end +*/ +LUALIB_API int +luaopen_posix_errno(lua_State *L) +{ + luaL_register(L, "posix.errno", posix_errno_fns); + lua_pushliteral(L, "posix.errno for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + +#ifdef E2BIG + LPOSIX_CONST( E2BIG ); +#endif +#ifdef EACCES + LPOSIX_CONST( EACCES ); +#endif +#ifdef EADDRINUSE + LPOSIX_CONST( EADDRINUSE ); +#endif +#ifdef EADDRNOTAVAIL + LPOSIX_CONST( EADDRNOTAVAIL ); +#endif +#ifdef EAFNOSUPPORT + LPOSIX_CONST( EAFNOSUPPORT ); +#endif +#ifdef EAGAIN + LPOSIX_CONST( EAGAIN ); +#endif +#ifdef EALREADY + LPOSIX_CONST( EALREADY ); +#endif +#ifdef EBADF + LPOSIX_CONST( EBADF ); +#endif +#ifdef EBADMSG + LPOSIX_CONST( EBADMSG ); +#endif +#ifdef EBUSY + LPOSIX_CONST( EBUSY ); +#endif +#ifdef ECANCELED + LPOSIX_CONST( ECANCELED ); +#endif +#ifdef ECHILD + LPOSIX_CONST( ECHILD ); +#endif +#ifdef ECONNABORTED + LPOSIX_CONST( ECONNABORTED ); +#endif +#ifdef ECONNREFUSED + LPOSIX_CONST( ECONNREFUSED ); +#endif +#ifdef ECONNRESET + LPOSIX_CONST( ECONNRESET ); +#endif +#ifdef EDEADLK + LPOSIX_CONST( EDEADLK ); +#endif +#ifdef EDESTADDRREQ + LPOSIX_CONST( EDESTADDRREQ ); +#endif +#ifdef EDOM + LPOSIX_CONST( EDOM ); +#endif +#ifdef EEXIST + LPOSIX_CONST( EEXIST ); +#endif +#ifdef EFAULT + LPOSIX_CONST( EFAULT ); +#endif +#ifdef EFBIG + LPOSIX_CONST( EFBIG ); +#endif +#ifdef EHOSTUNREACH + LPOSIX_CONST( EHOSTUNREACH ); +#endif +#ifdef EIDRM + LPOSIX_CONST( EIDRM ); +#endif +#ifdef EILSEQ + LPOSIX_CONST( EILSEQ ); +#endif +#ifdef EINPROGRESS + LPOSIX_CONST( EINPROGRESS ); +#endif +#ifdef EINTR + LPOSIX_CONST( EINTR ); +#endif +#ifdef EINVAL + LPOSIX_CONST( EINVAL ); +#endif +#ifdef EIO + LPOSIX_CONST( EIO ); +#endif +#ifdef EISCONN + LPOSIX_CONST( EISCONN ); +#endif +#ifdef EISDIR + LPOSIX_CONST( EISDIR ); +#endif +#ifdef ELOOP + LPOSIX_CONST( ELOOP ); +#endif +#ifdef EMFILE + LPOSIX_CONST( EMFILE ); +#endif +#ifdef EMLINK + LPOSIX_CONST( EMLINK ); +#endif +#ifdef EMSGSIZE + LPOSIX_CONST( EMSGSIZE ); +#endif +#ifdef ENAMETOOLONG + LPOSIX_CONST( ENAMETOOLONG ); +#endif +#ifdef ENETDOWN + LPOSIX_CONST( ENETDOWN ); +#endif +#ifdef ENETRESET + LPOSIX_CONST( ENETRESET ); +#endif +#ifdef ENETUNREACH + LPOSIX_CONST( ENETUNREACH ); +#endif +#ifdef ENFILE + LPOSIX_CONST( ENFILE ); +#endif +#ifdef ENOBUFS + LPOSIX_CONST( ENOBUFS ); +#endif +#ifdef ENODEV + LPOSIX_CONST( ENODEV ); +#endif +#ifdef ENOENT + LPOSIX_CONST( ENOENT ); +#endif +#ifdef ENOEXEC + LPOSIX_CONST( ENOEXEC ); +#endif +#ifdef ENOLCK + LPOSIX_CONST( ENOLCK ); +#endif +#ifdef ENOMEM + LPOSIX_CONST( ENOMEM ); +#endif +#ifdef ENOMSG + LPOSIX_CONST( ENOMSG ); +#endif +#ifdef ENOPROTOOPT + LPOSIX_CONST( ENOPROTOOPT ); +#endif +#ifdef ENOSPC + LPOSIX_CONST( ENOSPC ); +#endif +#ifdef ENOSYS + LPOSIX_CONST( ENOSYS ); +#endif +#ifdef ENOTCONN + LPOSIX_CONST( ENOTCONN ); +#endif +#ifdef ENOTDIR + LPOSIX_CONST( ENOTDIR ); +#endif +#ifdef ENOTEMPTY + LPOSIX_CONST( ENOTEMPTY ); +#endif +#ifdef ENOTSOCK + LPOSIX_CONST( ENOTSOCK ); +#endif +#ifdef ENOTSUP + LPOSIX_CONST( ENOTSUP ); +#endif +#ifdef ENOTTY + LPOSIX_CONST( ENOTTY ); +#endif +#ifdef ENXIO + LPOSIX_CONST( ENXIO ); +#endif +#ifdef EOPNOTSUPP + LPOSIX_CONST( EOPNOTSUPP ); +#endif +#ifdef EOVERFLOW + LPOSIX_CONST( EOVERFLOW ); +#endif +#ifdef EPERM + LPOSIX_CONST( EPERM ); +#endif +#ifdef EPIPE + LPOSIX_CONST( EPIPE ); +#endif +#ifdef EPROTO + LPOSIX_CONST( EPROTO ); +#endif +#ifdef EPROTONOSUPPORT + LPOSIX_CONST( EPROTONOSUPPORT ); +#endif +#ifdef EPROTOTYPE + LPOSIX_CONST( EPROTOTYPE ); +#endif +#ifdef ERANGE + LPOSIX_CONST( ERANGE ); +#endif +#ifdef EROFS + LPOSIX_CONST( EROFS ); +#endif +#ifdef ESPIPE + LPOSIX_CONST( ESPIPE ); +#endif +#ifdef ESRCH + LPOSIX_CONST( ESRCH ); +#endif +#ifdef ETIMEDOUT + LPOSIX_CONST( ETIMEDOUT ); +#endif +#ifdef ETXTBSY + LPOSIX_CONST( ETXTBSY ); +#endif +#ifdef EWOULDBLOCK + LPOSIX_CONST( EWOULDBLOCK ); +#endif +#ifdef EXDEV + LPOSIX_CONST( EXDEV ); +#endif + + return 1; +} diff --git a/ext/posix/fcntl.c b/ext/posix/fcntl.c new file mode 100644 index 0000000..e702241 --- /dev/null +++ b/ext/posix/fcntl.c @@ -0,0 +1,298 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + File Control. + + Low-level control over file descriptors, including creating new file + descriptors with `open`. + +@module posix.fcntl +*/ + +#include + +#include + +#include "_helpers.c" + + +/* Darwin fails to define O_RSYNC. */ +#ifndef O_RSYNC +#define O_RSYNC 0 +#endif +/* FreeBSD 10 fails to define O_DSYNC. */ +#ifndef O_DSYNC +#define O_DSYNC 0 +#endif + + + +/*** +Manipulate file descriptor. +@function fcntl +@int fd file descriptor to act on +@int cmd operation to perform +@tparam[opt=0] int|flock arg when *cmd* is `F_GETLK`, `F_SETLK` or `F_SETLKW`, + then *arg* is a @{flock} table, otherwise an integer with meaning dependent + upon the value of *cmd*. +@return[1] integer return value depending on *cmd*, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see fcntl(2) +@see lock.lua +@usage +local flag = P.fcntl (fd, P.F_GETFL) +*/ +static int +Pfcntl(lua_State *L) +{ + int fd = checkint(L, 1); + int cmd = checkint(L, 2); + int arg; + struct flock lockinfo; + int r; + checknargs(L, 3); + switch (cmd) + { + case F_SETLK: + case F_SETLKW: + case F_GETLK: + luaL_checktype(L, 3, LUA_TTABLE); + + /* Copy fields to flock struct */ + lua_getfield(L, 3, "l_type"); + lockinfo.l_type = (short)lua_tointeger(L, -1); + lua_getfield(L, 3, "l_whence"); + lockinfo.l_whence = (short)lua_tointeger(L, -1); + lua_getfield(L, 3, "l_start"); + lockinfo.l_start = (off_t)lua_tointeger(L, -1); + lua_getfield(L, 3, "l_len"); + lockinfo.l_len = (off_t)lua_tointeger(L, -1); + + /* Lock */ + r = fcntl(fd, cmd, &lockinfo); + + /* Copy fields from flock struct */ + lua_pushinteger(L, lockinfo.l_type); + lua_setfield(L, 3, "l_type"); + lua_pushinteger(L, lockinfo.l_whence); + lua_setfield(L, 3, "l_whence"); + lua_pushinteger(L, lockinfo.l_start); + lua_setfield(L, 3, "l_start"); + lua_pushinteger(L, lockinfo.l_len); + lua_setfield(L, 3, "l_len"); + lua_pushinteger(L, lockinfo.l_pid); + lua_setfield(L, 3, "l_pid"); + + break; + default: + arg = optint(L, 3, 0); + r = fcntl(fd, cmd, arg); + break; + } + return pushresult(L, r, "fcntl"); +} + + +/*** +Open a file. +@function open +@string path +@int oflags bitwise OR of zero or more of `O_RDONLY`, `O_WRONLY`, `O_RDWR`, + `O_APPEND`, `O_CREAT`, `O_DSYNC`, `O_EXCL`, `O_NOCTTY`, `O_NONBLOCK`, + `O_RSYNC`, `O_SYNC`, `O_TRUNC` +@int[opt=511] mode access modes used by `O_CREAT` +@treturn[1] int file descriptor for *path*, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see open(2) +@usage +fd = P.open ("data", bit.bor (P.O_CREAT, P.O_RDWR), bit.bor (P.S_IRWXU, P.S_IRGRP)) +*/ +static int +Popen(lua_State *L) +{ + const char *path = luaL_checkstring(L, 1); + int oflags = checkint(L, 2); + checknargs(L, 3); + return pushresult(L, open(path, oflags, (mode_t) optint(L, 3, 511)), path); +} + + +#if HAVE_POSIX_FADVISE +/*** +Instruct kernel on appropriate cache behaviour for a file or file segment. +@function posix_fadvise +@int fd open file descriptor +@int offset start of region +@int len number of bytes in region +@int advice one of `POSIX_FADV_NORMAL`, `POSIX_FADV_SEQUENTIAL`, + `POSIX_FADV_RANDOM`, `POSIX_FADV_NOREUSE`, `POSIX_FADV_WILLNEED` or + `POSIX_FADV_DONTNEED` +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see posix_fadvise(2) +*/ +static int +Pposix_fadvise(lua_State *L) +{ + int fd = checkint(L, 1); + int offset = checkint(L, 2); + int len = checkint(L, 3); + int advice = checkint(L, 4); + int r; + checknargs(L, 4); + r = posix_fadvise(fd, offset, len, advice); + return pushresult(L, r == 0 ? 0 : -1, "posix_fadvise"); +} +#endif + + +static const luaL_Reg posix_fcntl_fns[] = +{ + LPOSIX_FUNC( Pfcntl ), + LPOSIX_FUNC( Popen ), +#if HAVE_POSIX_FADVISE + LPOSIX_FUNC( Pposix_fadvise ), +#endif + {NULL, NULL} +}; + + +/*** +Constants. +@section constants +*/ + +/*** +Fcntl constants. +Any constants not available in the underlying system will be `nil` valued. +@table posix.fcntl +@int F_DUPFD duplicate file descriptor +@int F_GETFD get file descriptor flags +@int F_SETFD set file descriptor flags +@int F_GETFL get file status flags +@int F_SETFL set file status flags +@int F_GETLK get record locking information +@int F_SETLK set record locking information +@int F_SETLKW set lock, and wait if blocked +@int F_GETOWN get SIGIO/SIGURG process owner +@int F_SETOWN set SIGIO/SIGURG process owner +@int F_RDLCK shared or read lock +@int F_WRLCK exclusive or write lock +@int F_UNLCK unlock +@int O_RDONLY open for reading only +@int O_WRONLY open for writing only +@int O_RDWR open for reading and writing +@int O_APPEND set append mode +@int O_CREAT create if nonexistent +@int O_DSYNC synchronise io data integrity +@int O_EXCL error if file already exists +@int O_NOCTTY don't assign controlling terminal +@int O_NONBLOCK no delay +@int O_RSYNC synchronise file read integrity +@int O_SYNC synchronise file write integrity +@int O_TRUNC truncate to zero length +@int POSIX_FADV_NORMAL no advice +@int POSIX_FADV_SEQUENTIAL expecting to access data sequentially +@int POSIX_FADV_RANDOM expecting to access data randomly +@int POSIX_FADV_NOREUSE expecting to access data once only +@int POSIX_FADV_WILLNEED expecting to access data in the near future +@int POSIX_FADV_DONTNEED not expecting to access the data in the near future +@usage + -- Print fcntl constants supported on this host. + for name, value in pairs (require "posix.fcntl") do + if type (value) == "number" then + print (name, value) + end + end +*/ + +LUALIB_API int +luaopen_posix_fcntl(lua_State *L) +{ + luaL_register(L, "posix.fcntl", posix_fcntl_fns); + lua_pushliteral(L, "posix.fcntl for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + /* fcntl flags */ + LPOSIX_CONST( F_DUPFD ); + LPOSIX_CONST( F_GETFD ); + LPOSIX_CONST( F_SETFD ); + LPOSIX_CONST( F_GETFL ); + LPOSIX_CONST( F_SETFL ); + LPOSIX_CONST( F_GETLK ); + LPOSIX_CONST( F_SETLK ); + LPOSIX_CONST( F_SETLKW ); + LPOSIX_CONST( F_GETOWN ); + LPOSIX_CONST( F_SETOWN ); + LPOSIX_CONST( F_RDLCK ); + LPOSIX_CONST( F_WRLCK ); + LPOSIX_CONST( F_UNLCK ); + + /* file creation & status flags */ + LPOSIX_CONST( O_RDONLY ); + LPOSIX_CONST( O_WRONLY ); + LPOSIX_CONST( O_RDWR ); + LPOSIX_CONST( O_APPEND ); + LPOSIX_CONST( O_CREAT ); + LPOSIX_CONST( O_DSYNC ); + LPOSIX_CONST( O_EXCL ); + LPOSIX_CONST( O_NOCTTY ); + LPOSIX_CONST( O_NONBLOCK ); + LPOSIX_CONST( O_RSYNC ); + LPOSIX_CONST( O_SYNC ); + LPOSIX_CONST( O_TRUNC ); + + /* posix_fadvise flags */ +#ifdef POSIX_FADV_NORMAL + LPOSIX_CONST( POSIX_FADV_NORMAL ); +#endif +#ifdef POSIX_FADV_SEQUENTIAL + LPOSIX_CONST( POSIX_FADV_SEQUENTIAL ); +#endif +#ifdef POSIX_FADV_RANDOM + LPOSIX_CONST( POSIX_FADV_RANDOM ); +#endif +#ifdef POSIX_FADV_NOREUSE + LPOSIX_CONST( POSIX_FADV_NOREUSE ); +#endif +#ifdef POSIX_FADV_WILLNEED + LPOSIX_CONST( POSIX_FADV_WILLNEED ); +#endif +#ifdef POSIX_FADV_DONTNEED + LPOSIX_CONST( POSIX_FADV_DONTNEED ); +#endif + + return 1; +} + + +/*** +Tables. +@section tables +*/ + +/*** +Advisory file locks. +Passed as *arg* to @{fcntl} when *cmd* is `F_GETLK`, `F_SETLK` or `F_SETLKW`. +@table flock +@int l_start starting offset +@int l_len len = 0 means until end of file +@int l_pid lock owner +@int l_type lock type +@int l_whence one of `SEEK_SET`, `SEEK_CUR` or `SEEK_END` +*/ diff --git a/ext/posix/fnmatch.c b/ext/posix/fnmatch.c new file mode 100644 index 0000000..a674020 --- /dev/null +++ b/ext/posix/fnmatch.c @@ -0,0 +1,95 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Filename matching. + + Functions and constants for matching known filenames against shell-style + pattern strings. + +@see posix.glob +@module posix.fnmatch +*/ + +#include + +#include + +#include "_helpers.c" + + +/*** +Match a filename against a shell pattern. +@function fnmatch +@string pat shell pattern +@string name filename +@int[opt=0] flags optional +@treturn[1] int `0`, if successful +@treturn[2] int `FNM_NOMATCH` +@treturn[3] int some other non-zero integer if fnmatch itself failed +@see fnmatch(3) +*/ +static int +Pfnmatch(lua_State *L) +{ + const char *pattern = luaL_checkstring(L, 1); + const char *string = luaL_checkstring(L, 2); + int flags = optint(L, 3, 0); + int res; + checknargs(L, 3); + return pushintresult(fnmatch(pattern, string, flags)); +} + + +static const luaL_Reg posix_fnmatch_fns[] = +{ + LPOSIX_FUNC( Pfnmatch ), + {NULL, NULL} +}; + + +/*** +Constants. +@section constants +*/ + +/*** +Fnmatch constants. +Any constants not available in the underlying system will be `nil` valued. +@table posix.fnmatch +@int FNM_PATHNAME slashes in pathname must be matched by slash in pattern +@int FNM_NOESCAPE disable backslash escaping +@int FNM_NOMATCH match failed +@int FNM_PERIOD periods in pathname must be matched by period in pattern +@usage + -- Print fnmatch constants supported on this host. + for name, value in pairs (require "posix.fnmatch") do + if type (value) == "number" then + print (name, value) + end + end +*/ + +LUALIB_API int +luaopen_posix_fnmatch(lua_State *L) +{ + luaL_register(L, "posix.fnmatch", posix_fnmatch_fns); + lua_pushliteral(L, "posix.fnmatch for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + /* from fnmatch.h */ + LPOSIX_CONST( FNM_PATHNAME ); + LPOSIX_CONST( FNM_NOESCAPE ); + LPOSIX_CONST( FNM_NOMATCH ); + LPOSIX_CONST( FNM_PERIOD ); + + return 1; +} diff --git a/ext/posix/getopt.c b/ext/posix/getopt.c new file mode 100644 index 0000000..5018917 --- /dev/null +++ b/ext/posix/getopt.c @@ -0,0 +1,177 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Command Line Argument Processing. + +@module posix.getopt +*/ + +#include + +#include + +#include "_helpers.c" + + +/* getopt_long */ + +/* N.B. We don't need the symbolic constants no_argument, + required_argument and optional_argument, since their values are + defined as 0, 1 and 2 respectively. */ +static const char *const arg_types[] = +{ + "none", "required", "optional", NULL +}; + + +static int +iter_getopt_long(lua_State *L) +{ + int longindex = 0, ret, argc = lua_tointeger(L, lua_upvalueindex(1)); + char **argv = (char **)lua_touserdata(L, lua_upvalueindex(3)); + struct option *longopts = (struct option *)lua_touserdata(L, lua_upvalueindex(3 + argc + 1)); + + if (argv == NULL) /* If we have already completed, return now. */ + return 0; + + /* Fetch upvalues to pass to getopt_long. */ + ret = getopt_long(argc, argv, + lua_tostring(L, lua_upvalueindex(2)), + longopts, + &longindex); + if (ret == -1) + return 0; + else + { + char c = ret; + lua_pushlstring(L, &c, 1); + lua_pushstring(L, optarg); + lua_pushinteger(L, optind); + lua_pushinteger(L, longindex); + return 4; + } +} + + +/*** +Parse command-line options. +@function getopt +@param arg command line arguments +@string shortopts short option specifier +@tparam[opt] table longopts long options table +@int[opt=0] opterr index of the option with an error +@int[opt=1] optind index of the next unprocessed option +@return option iterator, returning 4 values +@see getopt(3) +@see getopt_long(3) +@usage +local longopts = { + {"help", "none", 1}, + {"version", "none", 3}, +} +for r, longindex, err, i in P.getopt (arg, "ho:v", longopts, err, i) do + process (arg, err, i) +end +@see getopt.lua +*/ +static int +Pgetopt(lua_State *L) +{ + int argc, i, n = 0; + const char *shortopts; + char **argv; + struct option *longopts; + + checknargs(L, 5); + checktype(L, 1, LUA_TTABLE, "list"); + shortopts = luaL_checkstring(L, 2); + if (!lua_isnoneornil(L, 3)) + checktype(L, 3, LUA_TTABLE, "table or nil"); + opterr = optint(L, 4, 0); + optind = optint(L, 5, 1); + + argc = (int)lua_objlen(L, 1) + 1; + + lua_pushinteger(L, argc); + + lua_pushstring(L, shortopts); + + argv = lua_newuserdata(L, (argc + 1) * sizeof(char *)); + argv[argc] = NULL; + for (i = 0; i < argc; i++) + { + lua_pushinteger(L, i); + lua_gettable(L, 1); + argv[i] = (char *)luaL_checkstring(L, -1); + } + + if (lua_type(L, 3) == LUA_TTABLE) + { + n = (int)lua_objlen(L, 3); + } + longopts = lua_newuserdata(L, (n + 1) * sizeof(struct option)); + longopts[n].name = NULL; + longopts[n].has_arg = 0; + longopts[n].flag = NULL; + longopts[n].val = 0; + for (i = 1; i <= n; i++) + { + const char *name, *val; + int has_arg; + + lua_pushinteger(L, i); + lua_gettable(L, 3); + luaL_checktype(L, -1, LUA_TTABLE); + + lua_pushinteger(L, 1); + lua_gettable(L, -2); + name = luaL_checkstring(L, -1); + + lua_pushinteger(L, 2); + lua_gettable(L, -3); + has_arg = luaL_checkoption(L, -1, NULL, arg_types); + lua_pop(L, 1); + + lua_pushinteger(L, 3); + lua_gettable(L, -3); + val = luaL_checkstring(L, -1); + lua_pop(L, 1); + + longopts[i - 1].name = name; + longopts[i - 1].has_arg = has_arg; + longopts[i - 1].flag = NULL; + longopts[i - 1].val = val[0]; + lua_pop(L, 1); + } + + /* Push remaining upvalues, and make and push closure. */ + lua_pushcclosure(L, iter_getopt_long, 4 + argc + n); + + return 1; +} + +static const luaL_Reg posix_getopt_fns[] = +{ + LPOSIX_FUNC( Pgetopt ), + {NULL, NULL} +}; + + +LUALIB_API int +luaopen_posix_getopt(lua_State *L) +{ + luaL_register(L, "posix.getopt", posix_getopt_fns); + lua_pushliteral(L, "posix.getopt for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + return 1; +} diff --git a/ext/posix/glob.c b/ext/posix/glob.c new file mode 100644 index 0000000..fdf2dfc --- /dev/null +++ b/ext/posix/glob.c @@ -0,0 +1,75 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Generate pathnames matching a shell-style pattern. + + Functions generating a table of filenames that match a shell-style + pattern string. + +@module posix.glob +*/ + +#include + +#include + +#include "_helpers.c" + + +/*** +Find all files in this directory matching a shell pattern. +@function glob +@string[opt="*"] pat shell glob pattern +@treturn table matching filenames +@see glob(3) +@see glob.lua +*/ +static int +Pglob(lua_State *L) +{ + const char *pattern = optstring(L, 1, "*"); + glob_t globres; + + checknargs(L, 1); + if (glob(pattern, 0, NULL, &globres)) + return pusherror(L, pattern); + else + { + unsigned int i; + lua_newtable(L); + for (i=1; i<=globres.gl_pathc; i++) + { + lua_pushstring(L, globres.gl_pathv[i-1]); + lua_rawseti(L, -2, i); + } + globfree(&globres); + return 1; + } +} + + +static const luaL_Reg posix_glob_fns[] = +{ + LPOSIX_FUNC( Pglob ), + {NULL, NULL} +}; + + +LUALIB_API int +luaopen_posix_glob(lua_State *L) +{ + luaL_register(L, "posix.glob", posix_glob_fns); + lua_pushliteral(L, "posix.glob for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + return 1; +} diff --git a/ext/posix/grp.c b/ext/posix/grp.c new file mode 100644 index 0000000..73b6ec4 --- /dev/null +++ b/ext/posix/grp.c @@ -0,0 +1,180 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Group Database Operations. + + Query the system group database. + +@see posix.pwd +@module posix.grp +*/ + +#include + +#include + +#include "_helpers.c" + + +/*** +Group record. +@table PosixGroup +@string gr_name name of group +@int gr_gid unique group id +@tfield list gr_mem a list of group members +*/ + +static int +pushgroup(lua_State *L, struct group *g) +{ + if (!g) + return lua_pushnil(L), 1; + + lua_createtable(L, 0, 3); + setintegerfield(g, gr_gid); + setstringfield(g, gr_name); + if (g->gr_mem) + { + int i; + lua_newtable(L); + for (i = 0; g->gr_mem[i] != NULL; i++) + { + lua_pushstring(L, g->gr_mem[i]); + lua_rawseti(L, -2, i + 1); + } + lua_setfield(L, -2, "gr_mem"); + } + + settypemetatable("PosixGroup"); + return 1; +} + + +/*** +Release group database resources. +@function endgrent +@see getgrent +*/ +static int +Pendgrent(lua_State *L) +{ + checknargs(L, 0); + endgrent(); + return 0; +} + + +/*** +Fetch next group. +@function getgrent +@treturn PosixGroup next group record +@see endgrent +@usage + t = P.getgrent () + while t ~= nil do + process (t) + t = P.getgrent () + end + P.endgrent () +*/ +static int +Pgetgrent(lua_State *L) +{ + struct group *g; + checknargs(L, 0); + g = getgrent(); + if (!g && errno == 0) + endgrent(); + return pushgroup(L, g); +} + + +/*** +Fetch group with given group id. +@function getgrgid +@int gid group id +@treturn PosixGroup group record for *gid* +@usage + t = P.getgrgid (0) +*/ +static int +Pgetgrgid(lua_State *L) +{ + gid_t gid = (gid_t) checkint(L, 1); + struct group *g; + checknargs(L, 1); + + errno = 0; /* so we can recognise a successful empty result */ + g = getgrgid(gid); + if (!g && errno != 0) + return pusherror(L, "getgrgid"); + return pushgroup(L, g); +} + + +/*** +Fetch named group. +@function getgrnam +@string name group name +@treturn PosixGroup group record for *name* +@usage + t = P.getgrnam "wheel" +*/ +static int +Pgetgrnam(lua_State *L) +{ + const char *name = luaL_checkstring(L, 1); + struct group *g; + checknargs(L, 1); + + errno = 0; /* so we can recognise a successful empty result */ + g = getgrnam (name); + if (!g && errno != 0) + return pusherror(L, "getgrnam"); + return pushgroup(L, g); +} + + +/*** +Rewind next @{getgrent} back to start of database. +@function setgrent +@see getgrent +*/ +static int +Psetgrent(lua_State *L) +{ + checknargs(L, 0); + setgrent(); + return 0; +} + + +static const luaL_Reg posix_grp_fns[] = +{ + LPOSIX_FUNC( Pendgrent ), + LPOSIX_FUNC( Pgetgrent ), + LPOSIX_FUNC( Pgetgrgid ), + LPOSIX_FUNC( Pgetgrnam ), + LPOSIX_FUNC( Psetgrent ), + {NULL, NULL} +}; + + +LUALIB_API int +luaopen_posix_grp(lua_State *L) +{ + luaL_register(L, "posix.grp", posix_grp_fns); + lua_pushliteral(L, "posix.grp for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + return 1; +} diff --git a/ext/posix/libgen.c b/ext/posix/libgen.c new file mode 100644 index 0000000..daff5c4 --- /dev/null +++ b/ext/posix/libgen.c @@ -0,0 +1,97 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + General Library. + + Functions for separating a pathname into file and directory components. + +@module posix.libgen +*/ + +#include + +#include + +#include "_helpers.c" + + +/*** +File part of path. +@function basename +@string path file to act on +@treturn string filename part of *path* +@see basename(3) +*/ +static int +Pbasename(lua_State *L) +{ + char *b; + size_t len; + void *ud; + lua_Alloc lalloc; + const char *path = luaL_checklstring(L, 1, &len); + size_t path_len; + checknargs(L, 1); + path_len = strlen(path) + 1; + lalloc = lua_getallocf(L, &ud); + if ((b = lalloc(ud, NULL, 0, path_len)) == NULL) + return pusherror(L, "lalloc"); + lua_pushstring(L, basename(strcpy(b,path))); + lalloc(ud, b, path_len, 0); + return 1; +} + + +/*** +Directory name of path. +@function dirname +@string path file to act on +@treturn string directory part of *path* +@see dirname(3) +*/ +static int +Pdirname(lua_State *L) +{ + char *b; + size_t len; + void *ud; + lua_Alloc lalloc; + const char *path = luaL_checklstring(L, 1, &len); + size_t path_len; + checknargs(L, 1); + path_len = strlen(path) + 1; + lalloc = lua_getallocf(L, &ud); + if ((b = lalloc(ud, NULL, 0, path_len)) == NULL) + return pusherror(L, "lalloc"); + lua_pushstring(L, dirname(strcpy(b,path))); + lalloc(ud, b, path_len, 0); + return 1; +} + + +static const luaL_Reg posix_libgen_fns[] = +{ + LPOSIX_FUNC( Pbasename ), + LPOSIX_FUNC( Pdirname ), + {NULL, NULL} +}; + + +LUALIB_API int +luaopen_posix_libgen(lua_State *L) +{ + luaL_register(L, "posix.libgen", posix_libgen_fns); + lua_pushliteral(L, "posix.libgen for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + return 1; +} diff --git a/ext/posix/poll.c b/ext/posix/poll.c new file mode 100644 index 0000000..b543415 --- /dev/null +++ b/ext/posix/poll.c @@ -0,0 +1,300 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Synchronous I/O Multiplexing. + + Examine file descriptors for events, such as readyness for I/O. + +@module posix.poll +*/ + +#include + +#include + +#include "_helpers.c" + + +static struct { + short bit; + const char *name; +} poll_event_map[] = { +#define MAP(_NAME) \ + {POLL##_NAME, #_NAME} + MAP(IN), + MAP(PRI), + MAP(OUT), + MAP(ERR), + MAP(HUP), + MAP(NVAL), +#undef MAP +}; + +#define PPOLL_EVENT_NUM (sizeof(poll_event_map) / sizeof(*poll_event_map)) + +static void +poll_events_createtable(lua_State *L) +{ + lua_createtable(L, 0, PPOLL_EVENT_NUM); +} + +static short +poll_events_from_table(lua_State *L, int table) +{ + short events = 0; + size_t i; + + /* Convert to absolute index */ + if (table < 0) + table = lua_gettop(L) + table + 1; + + for (i = 0; i < PPOLL_EVENT_NUM; i++) + { + lua_getfield(L, table, poll_event_map[i].name); + if (lua_toboolean(L, -1)) + events |= poll_event_map[i].bit; + lua_pop(L, 1); + } + + return events; +} + +static void +poll_events_to_table(lua_State *L, int table, short events) +{ + size_t i; + + /* Convert to absolute index */ + if (table < 0) + table = lua_gettop(L) + table + 1; + + for (i = 0; i < PPOLL_EVENT_NUM; i++) + { + lua_pushboolean(L, events & poll_event_map[i].bit); + lua_setfield(L, table, poll_event_map[i].name); + } +} + +static nfds_t +poll_fd_list_check_table(lua_State *L, int table) +{ + nfds_t fd_num = 0; + + /* + * Assume table is an argument number. + * Should be an assert(table > 0). + */ + + luaL_checktype(L, table, LUA_TTABLE); + + /* Nil key - the one before first */ + lua_pushnil(L); + + /* Push each key/value pair, popping previous key */ + while (lua_next(L, 1) != 0) + { + /* Verify the fd key */ + luaL_argcheck(L, lua_isinteger(L, -2), table, + "contains non-integer key(s)"); + + /* Verify the table value */ + luaL_argcheck(L, lua_istable(L, -1), table, + "contains non-table value(s)"); + lua_getfield(L, -1, "events"); + luaL_argcheck(L, lua_istable(L, -1), table, + "contains invalid value table(s)"); + lua_pop(L, 1); + lua_getfield(L, -1, "revents"); + luaL_argcheck(L, lua_isnil(L, -1) || lua_istable(L, -1), table, + "contains invalid value table(s)"); + lua_pop(L, 1); + + /* Remove value (but leave the key) */ + lua_pop(L, 1); + + /* Count the fds */ + fd_num++; + } + + return fd_num; +} + +static void +poll_fd_list_from_table(lua_State *L, int table, struct pollfd *fd_list) +{ + struct pollfd *pollfd = fd_list; + + /* + * Assume the table didn't change since + * the call to poll_fd_list_check_table + */ + + /* Convert to absolute index */ + if (table < 0) + table = lua_gettop(L) + table + 1; + + /* Nil key - the one before first */ + lua_pushnil(L); + + /* Push each key/value pair, popping previous key */ + while (lua_next(L, table) != 0) + { + /* Transfer the fd key */ + pollfd->fd = lua_tointeger(L, -2); + + /* Transfer "events" field from the value */ + lua_getfield(L, -1, "events"); + pollfd->events = poll_events_from_table(L, -1); + lua_pop(L, 1); + + /* Remove value (but leave the key) */ + lua_pop(L, 1); + + /* Proceed to next fd */ + pollfd++; + } +} + +static void +poll_fd_list_to_table(lua_State *L, int table, const struct pollfd *fd_list) +{ + const struct pollfd *pollfd = fd_list; + + /* + * Assume the table didn't change since + * the call to poll_fd_list_check_table. + */ + + /* Convert to absolute index */ + if (table < 0) + table = lua_gettop(L) + table + 1; + + /* Nil key - the one before first */ + lua_pushnil(L); + + /* Push each key/value pair, popping previous key */ + while (lua_next(L, 1) != 0) + { + /* Transfer "revents" field to the value */ + lua_getfield(L, -1, "revents"); + if (lua_isnil(L, -1)) + { + lua_pop(L, 1); + poll_events_createtable(L); + lua_pushvalue(L, -1); + lua_setfield(L, -3, "revents"); + } + poll_events_to_table(L, -1, pollfd->revents); + lua_pop(L, 1); + + /* Remove value (but leave the key) */ + lua_pop(L, 1); + + /* Proceed to next fd */ + pollfd++; + } +} + + +/*** +Wait for events on multiple file descriptors. +@function poll +@tparam table fds list of file descriptors +@int[opt=-1] timeout maximum timeout in milliseconds, or -1 to block indefinitely +@treturn[1] int 0 if timed out, 1 if *fd* is ready +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see poll(2) +@see rpoll +@see poll.lua +*/ +static int +Ppoll(lua_State *L) +{ + struct pollfd *fd_list, static_fd_list[16]; + nfds_t fd_num = poll_fd_list_check_table(L, 1); + int r, timeout = optint(L, 2, -1); + checknargs(L, 2); + + fd_list = (fd_num <= sizeof(static_fd_list) / sizeof(*static_fd_list)) + ? static_fd_list + : lua_newuserdata(L, sizeof(*fd_list) * fd_num); + + + poll_fd_list_from_table(L, 1, fd_list); + + r = poll(fd_list, fd_num, timeout); + + /* If any of the descriptors changed state */ + if (r > 0) + poll_fd_list_to_table(L, 1, fd_list); + + return pushresult(L, r, NULL); +} + + +/*** +Wait for some event on a file descriptor. +Based on [http://lua-users.org/lists/lua-l/2007-11/msg00346.html](). +@function rpoll +@int fd file descriptor +@int[opt=-1] timeout maximum timeout in milliseconds, or -1 to block indefinitely +@treturn[1] int 0 if timed out, 1 if *fd* is ready +@return[2] nil +@return[2] error message +@treturn[2] int errnum +@see poll +@usage +fh = io.open "one" +while true do + r = rpoll (fh, 500) + if r == 0 then + print 'timeout' + elseif r == 1 then + print (fh:read ()) + else + print "finish!" + break + end +end +*/ +static int +Prpoll(lua_State *L) +{ + struct pollfd fds; + int file = checkint(L, 1); + int timeout = checkint(L, 2); + checknargs(L, 2); + fds.fd = file; + fds.events = POLLIN; + return pushresult(L, poll(&fds, 1, timeout), NULL); +} + + +static const luaL_Reg posix_poll_fns[] = +{ + LPOSIX_FUNC( Ppoll ), + LPOSIX_FUNC( Prpoll ), + {NULL, NULL} +}; + + +LUALIB_API int +luaopen_posix_poll(lua_State *L) +{ + luaL_register(L, "posix.poll", posix_poll_fns); + lua_pushliteral(L, "posix.poll for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + return 1; +} diff --git a/ext/posix/posix.c b/ext/posix/posix.c new file mode 100644 index 0000000..2e13b3b --- /dev/null +++ b/ext/posix/posix.c @@ -0,0 +1,42 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ + +#include "ctype.c" +#include "curses.c" +#include "dirent.c" +#include "errno.c" +#include "fcntl.c" +#include "fnmatch.c" +#include "getopt.c" +#include "glob.c" +#include "grp.c" +#include "libgen.c" +#include "poll.c" +#include "pwd.c" +#include "sched.c" +#include "signal.c" +#include "stdio.c" +#include "stdlib.c" +#include "sys/msg.c" +#include "sys/resource.c" +#include "sys/socket.c" +#include "sys/stat.c" +#include "sys/statvfs.c" +#include "sys/time.c" +#include "sys/times.c" +#include "sys/utsname.c" +#include "sys/wait.c" +#include "syslog.c" +#include "termio.c" +#include "time.c" +#include "unistd.c" +#include "utime.c" diff --git a/ext/posix/pwd.c b/ext/posix/pwd.c new file mode 100644 index 0000000..35e41a9 --- /dev/null +++ b/ext/posix/pwd.c @@ -0,0 +1,176 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Password Database Operations. + + Query the system password database. + +@module posix.pwd +*/ + +#include + +#include +#include +#include /* for geteuid(2) */ + +#include "_helpers.c" + + +/*** +Password record. +@table PosixPasswd +@string pw_name user's login name +@int pw_uid unique user id +@int pw_gid user's default group id +@string pw_dir initial working directory +@string pw_shell user's login shell path +*/ + +static int +pushpasswd(lua_State *L, struct passwd *p) +{ + if (!p) + return lua_pushnil(L), 1; + + lua_createtable(L, 0, 6); + setintegerfield(p, pw_uid); + setintegerfield(p, pw_gid); + setstringfield(p, pw_name); + setstringfield(p, pw_dir); + setstringfield(p, pw_shell); + setstringfield(p, pw_passwd); + + settypemetatable("PosixPasswd"); + return 1; +} + + +/*** +Release password database resources. +@function endpwent +@see getpwent +*/ +static int +Pendpwent(lua_State *L) +{ + checknargs(L, 0); + endpwent(); + return 0; +} + + +/*** +Fetch next password entry. +@function getpwent +@treturn PosixPasswd next password record +@see endpwent +@usage + t = P.getpwent () + while t ~= nil do + process (t) + t = P.getpwent () + end + P.endpwent () +*/ +static int +Pgetpwent(lua_State *L) +{ + struct passwd *p; + checknargs(L, 0); + p = getpwent(); + if (!p && errno == 0) + endpwent(); + return pushpasswd(L, p); +} + + +/*** +Fetch named user. +@function getpwnam +@string name user name +@treturn PosixPasswd passwd record for *name* +@usage + t = P.getpwnam "root" +*/ +static int +Pgetpwnam(lua_State *L) +{ + const char *name = luaL_checkstring(L, 1); + struct passwd *p; + checknargs(L, 1); + + errno = 0; /* so we can recognise a successful empty result */ + p = getpwnam (name); + if (!p && errno != 0) + return pusherror(L, "getpwnam"); + return pushpasswd(L, p); +} + + +/*** +Fetch password entry with given user id. +@function getpwuid +@int uid user id +@treturn PosixPasswd passwd record for *uid* +@usage + t = P.getpwuid (0) +*/ +static int +Pgetpwuid(lua_State *L) +{ + uid_t uid = (uid_t) checkint(L, 1); + struct passwd *p; + checknargs(L, 1); + + errno = 0; /* so we can recognise a successful empty result */ + p = getpwuid(uid); + if (!p && errno != 0) + return pusherror(L, "getpwuid"); + return pushpasswd(L, p); +} + + +/*** +Rewind next @{getpwent} back to start of database. +@function setpwent +@see getpwent +*/ +static int +Psetpwent(lua_State *L) +{ + checknargs(L, 0); + setpwent(); + return 0; +} + + +static const luaL_Reg posix_pwd_fns[] = +{ + LPOSIX_FUNC( Pendpwent ), + LPOSIX_FUNC( Pgetpwent ), + LPOSIX_FUNC( Pgetpwnam ), + LPOSIX_FUNC( Pgetpwuid ), + LPOSIX_FUNC( Psetpwent ), + {NULL, NULL} +}; + + +LUALIB_API int +luaopen_posix_pwd(lua_State *L) +{ + luaL_register(L, "posix.pwd", posix_pwd_fns); + lua_pushliteral(L, "posix.pwd for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + return 1; +} diff --git a/ext/posix/sched.c b/ext/posix/sched.c new file mode 100644 index 0000000..13b196b --- /dev/null +++ b/ext/posix/sched.c @@ -0,0 +1,136 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Kernel Thread Scheduling Priority. + + Where supported by the underlying system, functions to discover and + change the kernel thread scheduling priority. If the module loads + successfully, but there is no kernel support, then `posix.sched.version` + will be set, but the unsupported APIs will be `nil`. +@module posix.sched +*/ + +#include + +#include /* for _POSIX_PRIORITY_SCHEDULING */ + +#ifdef _POSIX_PRIORITY_SCHEDULING +#include +#endif + +#include "_helpers.c" + + +/*** +get scheduling policy +@function sched_getscheduler +@int[opt=0] pid process to act on, or `0` for caller process +@treturn[1] int scheduling policy `SCHED_FIFO`, `SCHED_RR`, `SCHED_OTHER`, + if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see sched_getscheduler(2) +*/ +#if HAVE_SCHED_GETSCHEDULER +static int +Psched_getscheduler(lua_State *L) +{ + struct sched_param sched_param = {0}; + pid_t pid = optint(L, 1, 0); + checknargs(L, 1); + return pushresult(L, sched_getscheduler(pid), NULL); +} +#endif + + +/*** +set scheduling policy/priority +@function sched_setscheduler +@see sched_setscheduler(2) +@int[opt=0] pid process to act on, or `0` for caller process +@int[opt=`SCHED_OTHER`] policy one of `SCHED_FIFO`, `SCHED_RR` or + `SCHED_OTHER` +@int[opt=0] priority must be `0` for `SCHED_OTHER`, or else a positive + number below 100 for real-time policies +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +*/ +#if HAVE_SCHED_SETSCHEDULER +static int +Psched_setscheduler(lua_State *L) +{ + struct sched_param sched_param = {0}; + pid_t pid = optint(L, 1, 0); + int policy = optint(L, 2, SCHED_OTHER); + sched_param.sched_priority = optint (L, 3, 0); + checknargs(L, 3); + return pushresult(L, sched_setscheduler(pid, policy, &sched_param), NULL); +} +#endif + + +static const luaL_Reg posix_sched_fns[] = +{ +#if HAVE_SCHED_GETSCHEDULER + LPOSIX_FUNC( Psched_getscheduler ), +#endif +#if HAVE_SCHED_SETSCHEDULER + LPOSIX_FUNC( Psched_setscheduler ), +#endif + {NULL, NULL} +}; + + +/*** +Constants. +@section constants +*/ + +/*** +Scheduler constants. +Any constants not available in the underlying system will be `nil` valued. +@table posix.sched +@int SCHED_FIFO first-in, first-out scheduling policy +@int SCHED_RR round-robin scheduling policy +@int SCHED_OTHER another scheduling policy +@usage + -- Print scheduler constants supported on this host. + for name, value in pairs (require "posix.sched") do + if type (value) == "number" then + print (name, value) + end + end +*/ + +LUALIB_API int +luaopen_posix_sched(lua_State *L) +{ + luaL_register(L, "posix.sched", posix_sched_fns); + lua_pushliteral(L, "posix.sched for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + /* Psched_setscheduler flags */ +#ifdef SCHED_FIFO + LPOSIX_CONST( SCHED_FIFO ); +#endif +#ifdef SCHED_RR + LPOSIX_CONST( SCHED_RR ); +#endif +#ifdef SCHED_OTHER + LPOSIX_CONST( SCHED_OTHER ); +#endif + + return 1; +} diff --git a/ext/posix/signal.c b/ext/posix/signal.c new file mode 100644 index 0000000..dd3a94c --- /dev/null +++ b/ext/posix/signal.c @@ -0,0 +1,441 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Software Signal Facilities. + + Constants and functions for propagating signals among processes. + + Note that `posix.signal.signal` is implemented with sigaction(2) for + consistent semantics across platforms. + +@module posix.signal +*/ + +#include + +#include + +#include "_helpers.c" + + +/*** +Send a signal to the given process. +@function kill +@int pid process to act on +@int[opt=`SIGTERM` sig signal to send +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see kill(2) +*/ +static int +Pkill(lua_State *L) +{ + pid_t pid = checkint(L, 1); + int sig = optint(L, 2, SIGTERM); + checknargs(L, 2); + return pushresult(L, kill(pid, sig), NULL); +} + + +/*** +Send a signal to the given process group. +@function killpg +@int pgrp group id to act on, or `0` for the sending process`s group +@int[opt=`SIGTERM`] sig signal to send +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see killpg(2) +*/ +static int +Pkillpg(lua_State *L) +{ + int pgrp = checkint(L, 1); + int sig = optint(L, 2, SIGTERM); + checknargs(L, 2); + return pushresult(L, killpg(pgrp, sig), NULL); +} + + +/*** +Raise a signal on this process. +@function raise +@int sig signal to send +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see raise(3) +*/ +static int +Praise(lua_State *L) +{ + int sig = checkint(L, 1); + checknargs(L, 1); + lua_pop(L, 1); + return pushintresult(raise(sig)); +} + + +static lua_State *signalL; + +#define SIGNAL_QUEUE_MAX 25 +static volatile sig_atomic_t signal_pending, defer_signal; +static volatile sig_atomic_t signal_count = 0; +static volatile sig_atomic_t signals[SIGNAL_QUEUE_MAX]; + +#define sigmacros_map \ + MENTRY( _DFL ) \ + MENTRY( _IGN ) + +static const char *const Ssigmacros[] = +{ +#define MENTRY(_s) LPOSIX_STR_1(LPOSIX_SPLICE(_SIG, _s)), + sigmacros_map +#undef MENTRY + NULL +}; + +static void (*Fsigmacros[])(int) = +{ +#define MENTRY(_s) LPOSIX_SPLICE(SIG, _s), + sigmacros_map +#undef MENTRY + NULL +}; + + +static void +sig_handle (lua_State *L, lua_Debug *LPOSIX_UNUSED (ar)) +{ + /* Block all signals until we have run the Lua signal handler */ + sigset_t mask, oldmask; + sigfillset(&mask); + sigprocmask(SIG_SETMASK, &mask, &oldmask); + + lua_sethook(L, NULL, 0, 0); + + /* Get signal handlers table */ + lua_pushlightuserdata(L, &signalL); + lua_rawget(L, LUA_REGISTRYINDEX); + + /* Empty the signal queue */ + while (signal_count--) + { + sig_atomic_t signalno = signals[signal_count]; + /* Get handler */ + lua_pushinteger(L, signalno); + lua_gettable(L, -2); + + /* Call handler with signal number */ + lua_pushinteger(L, signalno); + if (lua_pcall(L, 1, 0, 0) != 0) + fprintf(stderr,"error in signal handler %ld: %s\n", (long)signalno, lua_tostring(L,-1)); + } + signal_count = 0; /* reset global to initial state */ + + /* Having run the Lua signal handler, restore original signal mask */ + sigprocmask(SIG_SETMASK, &oldmask, NULL); +} + + +static void +sig_postpone (int i) +{ + if (defer_signal) + { + signal_pending = i; + return; + } + if (signal_count == SIGNAL_QUEUE_MAX) + return; + defer_signal++; + /* Queue signals */ + signals[signal_count] = i; + signal_count ++; + lua_sethook(signalL, sig_handle, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1); + defer_signal--; + /* re-raise any pending signals */ + if (defer_signal == 0 && signal_pending != 0) + raise (signal_pending); +} + + +static int +sig_handler_wrap (lua_State *L) +{ + int sig = luaL_checkinteger(L, lua_upvalueindex(1)); + void (*handler)(int) = lua_touserdata(L, lua_upvalueindex(2)); + handler(sig); + return 0; +} + + +/*** +Install a signal handler for this signal number. +Although this is the same API as signal(2), it uses sigaction for guaranteed semantics. +@function signal +@see signal.lua +@int signum +@tparam[opt=SIG_DFL] function handler function, or `SIG_IGN` or `SIG_DFL` constants +@param[opt] flags the `sa_flags` element of `struct sigaction` +@treturn function previous handler function +@see sigaction(2) +*/ +static int +Psignal (lua_State *L) +{ + struct sigaction sa, oldsa; + int sig = checkint(L, 1), ret; + void (*handler)(int) = sig_postpone; + + checknargs(L, 3); + + /* Check handler is OK */ + switch (lua_type(L, 2)) + { + case LUA_TNIL: + case LUA_TSTRING: + handler = Fsigmacros[luaL_checkoption(L, 2, "SIG_DFL", Ssigmacros)]; + break; + case LUA_TFUNCTION: + if (lua_tocfunction(L, 2) == sig_handler_wrap) + { + lua_getupvalue(L, 2, 1); + handler = lua_touserdata(L, -1); + lua_pop(L, 1); + } + break; + default: + argtypeerror(L, 2, "function, string or nil"); + break; + } + + /* Set up C signal handler, getting old handler */ + sa.sa_handler = handler; + sa.sa_flags = optint(L, 3, 0); + sigfillset(&sa.sa_mask); + ret = sigaction(sig, &sa, &oldsa); + if (ret == -1) + return 0; + + /* Set Lua handler if necessary */ + if (handler == sig_postpone) + { + lua_pushlightuserdata(L, &signalL); /* We could use an upvalue, but we need this for sig_handle anyway. */ + lua_rawget(L, LUA_REGISTRYINDEX); + lua_pushvalue(L, 1); + lua_pushvalue(L, 2); + lua_rawset(L, -3); + lua_pop(L, 1); + } + + /* Push old handler as result */ + if (oldsa.sa_handler == sig_postpone) + { + lua_pushlightuserdata(L, &signalL); + lua_rawget(L, LUA_REGISTRYINDEX); + lua_pushvalue(L, 1); + lua_rawget(L, -2); + } else if (oldsa.sa_handler == SIG_DFL) + lua_pushstring(L, "SIG_DFL"); + else if (oldsa.sa_handler == SIG_IGN) + lua_pushstring(L, "SIG_IGN"); + else + { + lua_pushinteger(L, sig); + lua_pushlightuserdata(L, oldsa.sa_handler); + lua_pushcclosure(L, sig_handler_wrap, 2); + } + return 1; +} + + +static const luaL_Reg posix_signal_fns[] = +{ + LPOSIX_FUNC( Pkill ), + LPOSIX_FUNC( Pkillpg ), + LPOSIX_FUNC( Praise ), + LPOSIX_FUNC( Psignal ), + {NULL, NULL} +}; + + +/*** +Constants. +@section constants +*/ + +/*** +Signal constants. +Any constants not available in the underlying system will be `nil` valued. +@table posix.signal +@int SIGABRT abort () +@int SIGALRM alarm clock +@int SIGBUS bus error +@int SIGCHLD to parent on child stop or exit +@int SIGCONT continue a stopped process +@int SIGFPE floating point error +@int SIGHUP hangup +@int SIGILL illegal instruction +@int SIGINT interrupt +@int SIGKILL kill +@int SIGPIPE write on pipe with no reader +@int SIGQUIT quit +@int SIGSEGV segmentation violation +@int SIGSTOP stop +@int SIGTERM terminate +@int SIGTSTP stop signal from tty +@int SIGTTIN to readers process group on background tty read +@int SIGTTOU to readers process group on background tty output +@int SIGUSR1 user defined +@int SIGUSR2 user defined +@int SIGSYS bad argument to system call +@int SIGTRAP trace trap +@int SIGURG urgent condition on i/o channel +@int SIGVTALRM virtual time alarm +@int SIGXCPU exceeded cpu time limit +@int SIGXFSZ exceeded file size limit +@int SA_NOCLDSTOP do not generate a SIGCHLD on child stop +@int SA_NOCLDWAIT don't keep zombies child processes +@int SA_RESETHAND reset to SIG_DFL when taking a signal +@int SA_NODEFER don't mask the signal we're delivering +@usage + -- Print signal constants supported on this host. + for name, value in pairs (require "posix.signal") do + if type (value) == "number" then + print (name, value) + end + end +*/ + +LUALIB_API int +luaopen_posix_signal(lua_State *L) +{ + luaL_register(L, "posix.signal", posix_signal_fns); + lua_pushliteral(L, "posix.signal for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + /* Signals table stored in registry for Psignal and sig_handle */ + lua_pushlightuserdata(L, &signalL); + lua_newtable(L); + lua_rawset(L, LUA_REGISTRYINDEX); + + signalL = L; /* For sig_postpone */ + + /* Signals */ +#ifdef SIGABRT + LPOSIX_CONST( SIGABRT ); +#endif +#ifdef SIGALRM + LPOSIX_CONST( SIGALRM ); +#endif +#ifdef SIGBUS + LPOSIX_CONST( SIGBUS ); +#endif +#ifdef SIGCHLD + LPOSIX_CONST( SIGCHLD ); +#endif +#ifdef SIGCONT + LPOSIX_CONST( SIGCONT ); +#endif +#ifdef SIGFPE + LPOSIX_CONST( SIGFPE ); +#endif +#ifdef SIGHUP + LPOSIX_CONST( SIGHUP ); +#endif +#ifdef SIGILL + LPOSIX_CONST( SIGILL ); +#endif +#ifdef SIGINT + LPOSIX_CONST( SIGINT ); +#endif +#ifdef SIGKILL + LPOSIX_CONST( SIGKILL ); +#endif +#ifdef SIGPIPE + LPOSIX_CONST( SIGPIPE ); +#endif +#ifdef SIGQUIT + LPOSIX_CONST( SIGQUIT ); +#endif +#ifdef SIGSEGV + LPOSIX_CONST( SIGSEGV ); +#endif +#ifdef SIGSTOP + LPOSIX_CONST( SIGSTOP ); +#endif +#ifdef SIGTERM + LPOSIX_CONST( SIGTERM ); +#endif +#ifdef SIGTSTP + LPOSIX_CONST( SIGTSTP ); +#endif +#ifdef SIGTTIN + LPOSIX_CONST( SIGTTIN ); +#endif +#ifdef SIGTTOU + LPOSIX_CONST( SIGTTOU ); +#endif +#ifdef SIGUSR1 + LPOSIX_CONST( SIGUSR1 ); +#endif +#ifdef SIGUSR2 + LPOSIX_CONST( SIGUSR2 ); +#endif +#ifdef SIGSYS + LPOSIX_CONST( SIGSYS ); +#endif +#ifdef SIGTRAP + LPOSIX_CONST( SIGTRAP ); +#endif +#ifdef SIGURG + LPOSIX_CONST( SIGURG ); +#endif +#ifdef SIGVTALRM + LPOSIX_CONST( SIGVTALRM ); +#endif +#ifdef SIGXCPU + LPOSIX_CONST( SIGXCPU ); +#endif +#ifdef SIGXFSZ + LPOSIX_CONST( SIGXFSZ ); +#endif + + /* String constants */ + lua_pushliteral(L, "SIG_DFL"); + lua_setfield(L, -2, "SIG_DFL"); + + lua_pushliteral(L, "SIG_IGN"); + lua_setfield(L, -2, "SIG_IGN"); + + + /* Signal flags */ +#ifdef SA_NOCLDSTOP + LPOSIX_CONST( SA_NOCLDSTOP ); +#endif +#ifdef SA_NOCLDWAIT + LPOSIX_CONST( SA_NOCLDWAIT ); +#endif +#ifdef SA_RESETHAND + LPOSIX_CONST( SA_RESETHAND ); +#endif +#ifdef SA_NODEFER + LPOSIX_CONST( SA_NODEFER ); +#endif + + return 1; +} diff --git a/ext/posix/stdio.c b/ext/posix/stdio.c new file mode 100644 index 0000000..d167252 --- /dev/null +++ b/ext/posix/stdio.c @@ -0,0 +1,153 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + A few Standard I/O functions not already in Lua core. + +@module posix.stdio +*/ + +#include + +#include + +#include "_helpers.c" + +/*** +Name of controlling terminal. +@function ctermid +@treturn string controlling terminal for current process +@see ctermid(3) +*/ +static int +Pctermid(lua_State *L) +{ + char b[L_ctermid]; + checknargs(L, 0); + return pushstringresult(ctermid(b)); +} + + +/*** +File descriptor corresponding to a Lua file object. +@function fileno +@tparam file file Lua file object +@treturn[1] int file descriptor for *file*, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@usage +STDOUT_FILENO = P.fileno (io.stdout) +*/ +static int +Pfileno(lua_State *L) +{ + FILE *f = *(FILE**) luaL_checkudata(L, 1, LUA_FILEHANDLE); + checknargs(L, 1); + return pushresult(L, fileno(f), NULL); +} + + +/* This helper function is adapted from Lua 5.3's liolib.c */ +static int +stdio_fclose (lua_State *L) { + luaL_Stream *p = ((luaL_Stream *)luaL_checkudata(L, 1, LUA_FILEHANDLE)); + int res = fclose(p->f); + return luaL_fileresult(L, (res == 0), NULL); +} + +/* This function could be used more generally; see */ +static int +pushfile (lua_State *L, int fd, const char *mode) { + luaL_Stream *p = (luaL_Stream *)lua_newuserdata(L, sizeof(luaL_Stream)); + luaL_getmetatable(L, LUA_FILEHANDLE); + lua_setmetatable(L, -2); + p->closef = stdio_fclose; + p->f = fdopen(fd, mode); + return p->f != NULL; +} + +/*** +Create a Lua file object from a file descriptor. +@function fdopen +@tparam int fd file descriptor +@treturn[1] file file Lua file object *fd*, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@usage +stdout = P.fdopen (posix.STDOUT_FILENO) +*/ +static int +Pfdopen(lua_State *L) /** fdopen(fd, mode) */ +{ + int fd = checkint(L, 1); + const char *mode = luaL_checkstring(L, 2); + checknargs(L, 2); + if (!pushfile(L, fd, mode)) + return pusherror(L, "fdopen"); + return 1; +} + + +static const luaL_Reg posix_stdio_fns[] = +{ + LPOSIX_FUNC( Pctermid ), + LPOSIX_FUNC( Pfileno ), + LPOSIX_FUNC( Pfdopen ), + {NULL, NULL} +}; + + +/*** +Constants. +@section constants +*/ + +/*** +Stdio constants. +Any constants not available in the underlying system will be `nil` valued. +@table posix.stdio +@int _IOFBF fully buffered +@int _IOLBF line buffered +@int _IONBF unbuffered +@int BUFSIZ size of buffer +@int EOF end of file +@int FOPEN_MAX maximum number of open files +@int FILENAME_MAX maximum length of filename +@usage + -- Print stdio constants supported on this host. + for name, value in pairs (require "posix.stdio") do + if type (value) == "number" then + print (name, value) + end + end +*/ + +LUALIB_API int +luaopen_posix_stdio(lua_State *L) +{ + luaL_register(L, "posix.stdio", posix_stdio_fns); + lua_pushliteral(L, "posix.stdio for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + /* stdio.h constants */ + /* Those that are omitted already have a Lua interface, or alternative. */ + LPOSIX_CONST( _IOFBF ); + LPOSIX_CONST( _IOLBF ); + LPOSIX_CONST( _IONBF ); + LPOSIX_CONST( BUFSIZ ); + LPOSIX_CONST( EOF ); + LPOSIX_CONST( FOPEN_MAX ); + LPOSIX_CONST( FILENAME_MAX ); + + return 1; +} diff --git a/ext/posix/stdlib.c b/ext/posix/stdlib.c new file mode 100644 index 0000000..4a45d7a --- /dev/null +++ b/ext/posix/stdlib.c @@ -0,0 +1,330 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Standard Posix Library functions. + +@module posix.stdlib +*/ + +#include + +#include /* for open(2) */ +#include + +#include "_helpers.c" + + +/*** +Abort the program immediately. +@function abort +@see abort(3) +*/ +static int +Pabort(lua_State *L) +{ + checknargs(L, 0); + abort(); + return 0; /* Avoid a compiler warning (or possibly cause one + if the compiler's too clever, sigh). */ +} + + +/*** +Get value of environment variable, or _all_ variables. +@function getenv +@see getenv(3) +@string[opt] name if nil, get all +@return value if name given, otherwise a name-indexed table of values. +@usage for a,b in pairs(posix.getenv()) do print(a, b) end +*/ +static int +Pgetenv(lua_State *L) +{ + checknargs(L, 1); + if (lua_isnoneornil(L, 1)) + { + extern char **environ; + char **e; + lua_newtable(L); + for (e=environ; *e!=NULL; e++) + { + char *s=*e; + char *eq=strchr(s, '='); + if (eq==NULL) /* will this ever happen? */ + { + lua_pushstring(L, s); + lua_pushboolean(L, 1); + } + else + { + lua_pushlstring(L, s, eq-s); + lua_pushstring(L, eq+1); + } + lua_settable(L, -3); + } + } + else + lua_pushstring(L, getenv(optstring(L, 1, + "lua_isnoneornil prevents this happening"))); + return 1; +} + + +/*** +Grant access to a slave pseudoterminal +@function grantpt +@int fd descriptor returned by openpt +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see grantpt(3) +@see openpt +@see ptsname +@see unlockpt +*/ +static int +Pgrantpt(lua_State *L) +{ + int fd=checkint(L, 1); + checknargs(L, 1); + return pushresult(L, grantpt(fd), "grantpt"); +} + + +/*** +Create a unique temporary directory. +@function mkdtemp +@string templ pattern that ends in six 'X' characters +@treturn[1] string path to directory, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see mkdtemp(3) +*/ +static int +Pmkdtemp(lua_State *L) +{ +#if defined LPOSIX_2008_COMPLIANT + const char *path = luaL_checkstring(L, 1); + size_t path_len = strlen(path) + 1; + void *ud; + lua_Alloc lalloc; + char *tmppath; + char *r; + checknargs(L, 1); + lalloc = lua_getallocf(L, &ud); + + if ((tmppath = lalloc(ud, NULL, 0, path_len)) == NULL) + return pusherror(L, "lalloc"); + strcpy(tmppath, path); + + if ((r = mkdtemp(tmppath))) + lua_pushstring(L, tmppath); + lalloc(ud, tmppath, path_len, 0); + return (r == NULL) ? pusherror(L, path) : 1; +#else + return binding_notimplemented(L, "mkdtemp", "C"); +#endif +} + + +/*** +Create a unique temporary file. +@function mkstemp +@string templ pattern that ends in six 'X' characters +@treturn[1] int open file descriptor +@treturn[2] string path to file, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see mkstemp(3) +@usage P.mkstemp 'wooXXXXXX' +*/ +static int +Pmkstemp(lua_State *L) +{ + const char *path = luaL_checkstring(L, 1); + size_t path_len = strlen(path) + 1; + void *ud; + lua_Alloc lalloc; + char *tmppath; + int r; + checknargs(L, 1); + lalloc = lua_getallocf(L, &ud); + + if ((tmppath = lalloc(ud, NULL, 0, path_len)) == NULL) + return pusherror(L, "lalloc"); + strcpy(tmppath, path); + r = mkstemp(tmppath); + + if (r != -1) + { + lua_pushinteger(L, r); + lua_pushstring(L, tmppath); + } + + lalloc(ud, tmppath, path_len, 0); + return (r == -1) ? pusherror(L, path) : 2; +} + + +/*** +Open a pseudoterminal. +@function openpt +@int oflags bitwise OR of zero or more of `O_RDWR` and `O_NOCTTY` +@return[1] file descriptor of pseudoterminal, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see posix_openpt(3) +@see grantpt +@see ptsname +@see unlockpt +*/ +static int +Popenpt(lua_State *L) +{ + int flags = checkint(L, 1); + checknargs(L, 1); + /* The name of the pseudo-device is specified by POSIX */ + return pushresult(L, open("/dev/ptmx", flags), NULL); +} + + +/*** +Get the name of a slave pseudo-terminal +@function ptsname +@int fd descriptor returned by @{openpt} +@return[1] path name of the slave terminal device, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see ptsname(3) +@see grantpt +@see unlockpt +*/ +static int +Pptsname(lua_State *L) +{ + int fd=checkint(L, 1); + const char* slave; + checknargs(L, 1); + slave = ptsname(fd); + if (!slave) + return pusherror(L, "getptsname"); + return pushstringresult(slave); +} + + +/*** +Find canonicalized absolute pathname. +@function realpath +@string path file to act on +@treturn[1] string canonicalized absolute path, if successful +@return[2] nil +@treturn[2] string error messag +@treturn[2] int errnum +@see realpath(3) +*/ +static int +Prealpath(lua_State *L) +{ + char *s; + checknargs(L, 1); + if ((s = realpath(luaL_checkstring(L, 1), NULL)) == NULL) + return pusherror(L, "realpath"); + lua_pushstring(L, s); + free(s); + return 1; +} + + +/*** +Set an environment variable for this process. +(Child processes will inherit this) +@function setenv +@string name +@string[opt] value (maybe nil, meaning 'unset') +@param[opt] overwrite non-nil prevents overwriting a variable +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see setenv(3) +*/ +static int +Psetenv(lua_State *L) +{ + const char *name=luaL_checkstring(L, 1); + const char *value=optstring(L, 2, NULL); + checknargs(L, 3); + if (value==NULL) + { + unsetenv(name); + return pushresult(L, 0, NULL); + } + else + { + int overwrite=lua_isnoneornil(L, 3) || lua_toboolean(L, 3); + return pushresult(L, setenv(name,value,overwrite), NULL); + } +} + + +/*** +Unlock a pseudoterminal master/slave pair +@function unlockpt +@int fd descriptor returned by openpt +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see unlockpt(3) +@see openpt +@see ptsname +@see grantpt +*/ +static int +Punlockpt(lua_State *L) +{ + int fd=checkint(L, 1); + checknargs(L, 1); + return pushresult(L, unlockpt(fd), "unlockpt"); +} + + +static const luaL_Reg posix_stdlib_fns[] = +{ + LPOSIX_FUNC( Pabort ), + LPOSIX_FUNC( Pgetenv ), + LPOSIX_FUNC( Pgrantpt ), + LPOSIX_FUNC( Pmkdtemp ), + LPOSIX_FUNC( Pmkstemp ), + LPOSIX_FUNC( Popenpt ), + LPOSIX_FUNC( Pptsname ), + LPOSIX_FUNC( Prealpath ), + LPOSIX_FUNC( Psetenv ), + LPOSIX_FUNC( Punlockpt ), + {NULL, NULL} +}; + + +LUALIB_API int +luaopen_posix_stdlib(lua_State *L) +{ + luaL_register(L, "posix.stdlib", posix_stdlib_fns); + lua_pushliteral(L, "posix.stdlib for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + return 1; +} diff --git a/ext/posix/sys/msg.c b/ext/posix/sys/msg.c new file mode 100644 index 0000000..61c3d3d --- /dev/null +++ b/ext/posix/sys/msg.c @@ -0,0 +1,208 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Sys V Message Queue Operations. + + Where supported by the underlying system, functions to send and receive + interprocess messages. If the module loads successfully, but there is + no system support, then `posix.sys.msg.version` will be set, but the + unsupported APIs wil be `nil`. + +@module posix.sys.msg +*/ + +#include + +#include "_helpers.c" /* For LPOSIX_2001_COMPLIANT */ + +#if HAVE_SYSV_MESSAGING +#include +#include +#include + +/*** +Get a message queue identifier +@function msgget +@int key message queue id, or `IPC_PRIVATE` for a new queue +@int[opt=0] flags bitwise OR of zero or more from `IPC_CREAT` and `IPC_EXCL`, + and access permissions `S_IRUSR`, `S_IWUSR`, `S_IRGRP`, `S_IWGRP`, `S_IROTH` + and `S_IWOTH` (from @{posix.sys.stat}) +@treturn[1] int message queue identifier, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see msgget(2) +*/ +static int +Pmsgget(lua_State *L) +{ + checknargs (L, 2); + return pushresult(L, msgget(checkint(L, 1), optint(L, 2, 0)), "msgget"); +} + + +/*** +Send message to a message queue +@function msgsnd +@int id message queue identifier returned by @{msgget} +@int type arbitrary message type +@string message content +@int[opt=0] flags optionally `IPC_NOWAIT` +@treturn int 0, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see msgsnd(2) + */ +static int +Pmsgsnd(lua_State *L) +{ + void *ud; + lua_Alloc lalloc = lua_getallocf(L, &ud); + struct { + long mtype; + char mtext[0]; + } *msg; + size_t len; + size_t msgsz; + ssize_t r; + + int msgid = checkint(L, 1); + long msgtype = checklong(L, 2); + const char *msgp = luaL_checklstring(L, 3, &len); + int msgflg = optint(L, 4, 0); + + checknargs(L, 4); + + msgsz = sizeof(long) + len; + + if ((msg = lalloc(ud, NULL, 0, msgsz)) == NULL) + return pusherror(L, "lalloc"); + + msg->mtype = msgtype; + memcpy(msg->mtext, msgp, len); + + r = msgsnd(msgid, msg, msgsz, msgflg); + lua_pushinteger(L, r); + + lalloc(ud, msg, msgsz, 0); + + return (r == -1 ? pusherror(L, NULL) : 1); +} + + +/*** +Receive message from a message queue +@function msgrcv +@int id message queue identifier returned by @{msgget} +@int size maximum message size +@int type message type (optional, default - 0) +@int[opt=0] flags bitwise OR of zero or more of `IPC_NOWAIT`, `MSG_EXCEPT` + and `MSG_NOERROR` +@treturn[1] int message type from @{msgsnd} +@treturn[1] string message text, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see msgrcv(2) + */ +static int +Pmsgrcv(lua_State *L) +{ + int msgid = checkint(L, 1); + size_t msgsz = checkint(L, 2); + long msgtyp = optint(L, 3, 0); + int msgflg = optint(L, 4, 0); + + void *ud; + lua_Alloc lalloc; + struct { + long mtype; + char mtext[0]; + } *msg; + + checknargs(L, 4); + lalloc = lua_getallocf(L, &ud); + + if ((msg = lalloc(ud, NULL, 0, msgsz)) == NULL) + return pusherror(L, "lalloc"); + + int res = msgrcv(msgid, msg, msgsz, msgtyp, msgflg); + if (res != -1) + { + lua_pushinteger(L, msg->mtype); + lua_pushlstring(L, msg->mtext, res - sizeof(long)); + } + lalloc(ud, msg, msgsz, 0); + + return (res == -1) ? pusherror(L, NULL) : 2; +} +#endif /*!HAVE_SYSV_MESSAGING*/ + + +static const luaL_Reg posix_sys_msg_fns[] = +{ +#if HAVE_SYSV_MESSAGING + LPOSIX_FUNC( Pmsgget ), + LPOSIX_FUNC( Pmsgsnd ), + LPOSIX_FUNC( Pmsgrcv ), +#endif + {NULL, NULL} +}; + + +/*** +Constants. +@section constants +*/ + +/*** +Message constants. +Any constants not available in the underlying system will be `nil` valued. +@table posix.sys.msg +@int IPC_CREAT create entry if key does not exist +@int IPC_EXCL fail if key exists +@int IPC_PRIVATE private key +@int IPC_NOWAIT error if request must wait +@int MSG_EXCEPT read messages with differing type +@int MSG_NOERROR truncate received message rather than erroring +@usage + -- Print msg constants supported on this host. + for name, value in pairs (require "posix.sys.msg") do + if type (value) == "number" then + print (name, value) + end + end +*/ + +LUALIB_API int +luaopen_posix_sys_msg(lua_State *L) +{ + luaL_register(L, "posix.sys.msg", posix_sys_msg_fns); + lua_pushliteral(L, "posix.sys.msg for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + +#if HAVE_SYSV_MESSAGING + LPOSIX_CONST( IPC_CREAT ); + LPOSIX_CONST( IPC_EXCL ); + LPOSIX_CONST( IPC_PRIVATE ); + LPOSIX_CONST( IPC_NOWAIT ); +# ifdef MSG_EXCEPT + LPOSIX_CONST( MSG_EXCEPT ); +# endif +# ifdef MSG_NOERROR + LPOSIX_CONST( MSG_NOERROR ); +# endif +#endif + + return 1; +} diff --git a/ext/posix/sys/resource.c b/ext/posix/sys/resource.c new file mode 100644 index 0000000..013950b --- /dev/null +++ b/ext/posix/sys/resource.c @@ -0,0 +1,171 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Control Maximum System Resource Consumption. + +@module posix.sys.resource +*/ + +#include + +#include + +#include "_helpers.c" + +/* OpenBSD 5.6 recommends using RLIMIT_DATA in place of missing RLIMIT_AS */ +#ifndef RLIMIT_AS +# define RLIMIT_AS RLIMIT_DATA +#endif + + +/*** +Resource limit record. +@table PosixRlimit +@int rlim_cur current soft limit +@int rlim_max hard limit +*/ +static int +pushrlimit(lua_State *L, struct rlimit *lim) +{ + if (!lim) + return lua_pushnil(L), 1; + + lua_createtable(L, 0, 2); + + setnumberfield(lim, rlim_cur); + setnumberfield(lim, rlim_max); + + settypemetatable("PosixRlimit"); + return 1; +} + + +/*** +Get resource limits for this process. +@function getrlimit +@int resource one of `RLIMIT_CORE`, `RLIMIT_CPU`, `RLIMIT_DATA`, `RLIMIT_FSIZE`, + `RLIMIT_NOFILE`, `RLIMIT_STACK` or `RLIMIT_AS` +@treturn[1] int softlimit +@treturn[1] int hardlimit, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see getrlimit(2) +@see setrlimit +*/ +static int +Pgetrlimit(lua_State *L) +{ + struct rlimit lim; + int r; + checknargs(L, 1); + r = getrlimit(checkint(L, 1), &lim); + if (r < 0) + return pusherror(L, "getrlimit"); + return pushrlimit(L, &lim); +} + + +/*** +Set a resource limit for subsequent child processes. +@function setrlimit +@string resource one of "core", "cpu", "data", "fsize", + "nofile", "stack" or "as" +@param[opt] softlimit process may receive a signal when reached +@param[opt] hardlimit process may be terminated when reached +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see getrlimit(2) +@see limit.lua +@usage P.setrlimit ("nofile", 1000, 2000) +*/ + +static const char *Srlimit_fields[] = { "rlim_cur", "rlim_max" }; + +static int +Psetrlimit(lua_State *L) +{ + struct rlimit lim; + int rid = checkint(L, 1); + + luaL_checktype(L, 2, LUA_TTABLE); + checknargs(L, 2); + + lim.rlim_cur = checknumberfield(L, 2, "rlim_cur"); + lim.rlim_max = checknumberfield(L, 2, "rlim_max"); + checkfieldnames(L, 2, Srlimit_fields); + + return pushresult(L, setrlimit(rid, &lim), "setrlimit"); +} + + +static const luaL_Reg posix_sys_resource_fns[] = +{ + LPOSIX_FUNC( Pgetrlimit ), + LPOSIX_FUNC( Psetrlimit ), + {NULL, NULL} +}; + + +/*** +Constants. +@section constants +*/ + +/*** +Rlimit constants. +@table posix.sys.resource +@int RLIM_INFINITY unlimited resource usage +@int RLIM_SAVED_CUR saved current resource soft limit +@int RLIM_SAVED_MAX saved resource hard limit +@int RLIMIT_CORE maximum bytes allowed for a core file +@int RLIMIT_CPU maximum cputime secconds allowed per process +@int RLIMIT_DATA maximum data segment bytes per process +@int RLIMIT_FSIZE maximum bytes in any file +@int RLIMIT_NOFILE maximum number of open files per process +@int RLIMIT_STACK maximum stack segment bytes per process +@int RLIMIT_AS maximum bytes total address space per process +@usage + -- Print resource constants supported on this host. + for name, value in pairs (require "posix.sys.resource") do + if type (value) == "number" then + print (name, value) + end + end +*/ + +LUALIB_API int +luaopen_posix_sys_resource(lua_State *L) +{ + luaL_register(L, "posix.sys.resource", posix_sys_resource_fns); + lua_pushliteral(L, "posix.sys.resource for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + LPOSIX_CONST( RLIM_INFINITY ); +#if defined RLIM_SAVED_CUR + LPOSIX_CONST( RLIM_SAVED_CUR ); +#endif +#if defined RLIM_SAVED_MAX + LPOSIX_CONST( RLIM_SAVED_MAX ); +#endif + LPOSIX_CONST( RLIMIT_CORE ); + LPOSIX_CONST( RLIMIT_CPU ); + LPOSIX_CONST( RLIMIT_DATA ); + LPOSIX_CONST( RLIMIT_FSIZE ); + LPOSIX_CONST( RLIMIT_NOFILE ); + LPOSIX_CONST( RLIMIT_STACK ); + LPOSIX_CONST( RLIMIT_AS ); + + return 1; +} diff --git a/ext/posix/sys/socket.c b/ext/posix/sys/socket.c new file mode 100644 index 0000000..1332091 --- /dev/null +++ b/ext/posix/sys/socket.c @@ -0,0 +1,978 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + BSD Sockets. + + Where supported by the underlying system, functions and constants to create, + connect and communicate over BSD sockets. If the module loads successfully, + but there is no kernel support, then `posix.sys.socket.version` will be set, + but the unsupported APIs will be `nil`. + +@module posix.sys.socket +*/ + +#include + +#include "_helpers.c" /* For LPOSIX_2001_COMPLIANT */ + +#include +#if LPOSIX_2001_COMPLIANT +#include +#if HAVE_LINUX_NETLINK_H +#include +#endif +#include /* Needs to be before net/if.h on OpenBSD 5.6 */ +#ifdef HAVE_NET_IF_H +#include +#endif +#include +#include +#include +#include +#include + +/* strlcpy() implementation for non-BSD based Unices. + strlcpy() is a safer less error-prone replacement for strncpy(). */ +#include "strlcpy.c" + + +/*** +Socket address. +All sockaddr tables have the *family* field, and depending on its value, also +a subset of the following fields too. +@table sockaddr +@int family one of `AF_INET`, `AF_INET6`, `AF_UNIX` or (where supported) `AF_NETLINK` +@int[opt] port socket port number for `AF_INET` (and equivalently `AF_INET6`) *family* +@string[opt] addr socket host address in correct format, for `AF_INET` *family* +@int[opt] socktype one of `SOCK_STREAM`, `SOCK_DGRAM` or `SOCK_RAW` for `AF_INET` *family* +@string[opt] canonname canonical name for service location, for `AF_INET` *family* +@int[opt] protocol one of `IPPROTO_TCP` or `IPPROTO_UDP`, for `AF_INET` *family* +@string[opt] path location in file system, for `AF_UNIX` *family* +@int[opt] pid process identifier, for `AF_NETLINK` *family* +@int[opt] groups process group owner identifier, for `AF_NETLINK` *family* +*/ + + +/*** +Address information hints. +@table PosixAddrInfo +@int family one of `AF_INET`, `AF_INET6`, `AF_UNIX` or `AF_NETLINK` +@int flags bitwise OR of zero or more of `AI_ADDRCONFIG`, `AI_ALL`, + `AI_CANONNAME`, `AI_NUMERICHOST`, `AI_NUMERICSERV`, `AI_PASSIVE` and + `AI_V4MAPPED` +@int socktype one of `SOCK_STREAM`, `SOCK_DGRAM` or `SOCK_RAW` +@int protocol one of `IPPROTO_TCP` or `IPPROTO_UDP` +*/ +static int +pushsockaddrinfo(lua_State *L, int family, struct sockaddr *sa) +{ + char addr[INET6_ADDRSTRLEN]; + struct sockaddr_in *sa4; + struct sockaddr_in6 *sa6; + + lua_newtable(L); + pushintegerfield("family", family); + + switch (family) + { + case AF_INET: + sa4 = (struct sockaddr_in *)sa; + inet_ntop(family, &sa4->sin_addr, addr, sizeof addr); + pushintegerfield("port", ntohs(sa4->sin_port)); + pushstringfield("addr", addr); + break; + case AF_INET6: + sa6 = (struct sockaddr_in6 *)sa; + inet_ntop(family, &sa6->sin6_addr, addr, sizeof addr); + pushintegerfield("port", ntohs(sa6->sin6_port)); + pushstringfield("addr", addr); + break; + case AF_UNIX: + pushstringfield("path", ((struct sockaddr_un *) sa)->sun_path); + break; +#if HAVE_LINUX_NETLINK_H + case AF_NETLINK: + pushintegerfield("pid", ((struct sockaddr_nl *) sa)->nl_pid); + pushintegerfield("groups", ((struct sockaddr_nl *) sa)->nl_groups); + break; +#endif + } + + settypemetatable("PosixAddrInfo"); + return 1; +} + + +/*** +Create an endpoint for communication. +@function socket +@int domain one of `AF_INET`, `AF_INET6`, `AF_UNIX` or `AF_NETLINK` +@int type one of `SOCK_STREAM`, `SOCK_DGRAM` or `SOCK_RAW` +@int options usually 0, but some socket types might implement other protocols. +@treturn[1] int socket descriptor, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see socket(2) +@usage sockd = P.socket (P.AF_INET, P.SOCK_STREAM, 0) +*/ +static int +Psocket(lua_State *L) +{ + int domain = checkint(L, 1); + int type = checkint(L, 2); + int options = checkint(L, 3); + checknargs(L, 3); + return pushresult(L, socket(domain, type, options), NULL); +} + + +/*** +Create a pair of connected sockets. +@function socketpair +@int domain one of `AF_INET`, `AF_INET6`, `AF_UNIX` or `AF_NETLINK` +@int socktype one of `SOCK_STREAM`, `SOCK_DGRAM` or `SOCK_RAW` +@int options usually 0, but some socket types might implement other protocols. +@treturn[1] int descriptor of one end of the socket pair +@treturn[1] int descriptor of the other end of the pair, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@usage sockr, sockw = P.socketpair (P.AF_INET, P.SOCK_STREAM, 0) +*/ +static int +Psocketpair(lua_State *L) +{ + int domain = checkint(L, 1); + int socktype = checkint(L, 2); + int options = checkint(L, 3); + int fd[2]; + int rc; + checknargs(L, 3); + if ((rc = socketpair(domain, socktype, options, fd)) < 0) + return pusherror(L, "socketpair"); + lua_pushinteger(L, fd[0]); + lua_pushinteger(L, fd[1]); + return 2; +} + + +static const char *Safinet_fields[] = { "family", "port", "addr", + /* Also allow getaddrinfo result tables */ + "socktype", "canonname", "protocol" }; +static const char *Safunix_fields[] = { "family", "path" }; +static const char *Safnetlink_fields[] = { "family", "pid", "groups" }; + + +/* Populate a sockaddr_storage with the info from the given lua table */ +static int +sockaddr_from_lua(lua_State *L, int index, struct sockaddr_storage *sa, socklen_t *addrlen) +{ + int family, r = -1; + + luaL_checktype(L, index, LUA_TTABLE); + family = checkintfield(L, index, "family"); + + memset(sa, 0, sizeof *sa); + + switch (family) + { + case AF_INET: + { + struct sockaddr_in *sa4 = (struct sockaddr_in *)sa; + int port = checkintfield(L, index, "port"); + const char *addr = checkstringfield(L, index, "addr"); + + checkfieldnames (L, index, Safinet_fields); + + if (inet_pton(AF_INET, addr, &sa4->sin_addr) == 1) + { + sa4->sin_family = family; + sa4->sin_port = htons(port); + *addrlen = sizeof(*sa4); + r = 0; + } + break; + } + case AF_INET6: + { + struct sockaddr_in6 *sa6= (struct sockaddr_in6 *)sa; + int port = checkintfield(L, index, "port"); + const char *addr = checkstringfield(L, index, "addr"); + + checkfieldnames (L, index, Safinet_fields); + + if (inet_pton(AF_INET6, addr, &sa6->sin6_addr) == 1) + { + sa6->sin6_family= family; + sa6->sin6_port = htons(port); + *addrlen = sizeof(*sa6); + r = 0; + } + break; + } + case AF_UNIX: + { + struct sockaddr_un *sau = (struct sockaddr_un *)sa; + const char *path = checkstringfield(L, index, "path"); + + checkfieldnames (L, index, Safunix_fields); + + sau->sun_family = family; + strlcpy(sau->sun_path, path, sizeof(sau->sun_path)); + sau->sun_path[sizeof(sau->sun_path) - 1]= '\0'; + *addrlen = sizeof(*sau); + r = 0; + break; + } +#if HAVE_LINUX_NETLINK_H + case AF_NETLINK: + { + struct sockaddr_nl *san = (struct sockaddr_nl *)sa; + san->nl_family = family; + san->nl_pid = checkintfield(L, index, "pid"); + san->nl_groups = checkintfield(L, index, "groups"); + *addrlen = sizeof(*san); + + checkfieldnames (L, index, Safnetlink_fields); + + r = 0; + break; + } +#endif + default: + lua_pushfstring(L, "unsupported family type %d", family); + luaL_argcheck(L, 0, index, lua_tostring (L, -1)); + lua_pop (L, 1); + break; + + } + return r; +} + + +static const char *Sai_fields[] = { "family", "socktype", "protocol", "flags" }; + + +/*** +Network address and service translation. +@function getaddrinfo +@string host name of a host +@string service name of service +@tparam[opt] PosixAddrInfo hints table +@treturn[1] list of @{sockaddr} tables +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see getaddrinfo(2) +@usage +local res, errmsg, errcode = posix.getaddrinfo ("www.lua.org", "http", + { family = P.IF_INET, socktype = P.SOCK_STREAM } +) +*/ +static int +Pgetaddrinfo(lua_State *L) +{ + int n = 1; + const char *host = optstring(L, 1, NULL); + const char *service = NULL; + struct addrinfo *res, hints; + + memset(&hints, 0, sizeof hints); + hints.ai_family = PF_UNSPEC; + + checknargs(L, 3); + + switch (lua_type(L, 2)) + { + case LUA_TNONE: + case LUA_TNIL: + if (host == NULL) + argtypeerror(L, 2, "string or int"); + break; + case LUA_TNUMBER: + case LUA_TSTRING: + service = lua_tostring(L, 2); + break; + default: + argtypeerror(L, 2, "string, int or nil"); + break; + } + + switch (lua_type(L, 3)) + { + case LUA_TNONE: + case LUA_TNIL: + break; + case LUA_TTABLE: + checkfieldnames (L, 3, Sai_fields); + hints.ai_family = optintfield(L, 3, "family", PF_UNSPEC); + hints.ai_socktype = optintfield(L, 3, "socktype", 0); + hints.ai_protocol = optintfield(L, 3, "protocol", 0); + hints.ai_flags = optintfield(L, 3, "flags", 0); + break; + default: + argtypeerror(L, 3, "table or nil"); + break; + } + + { + int r; + if ((r = getaddrinfo(host, service, &hints, &res)) != 0) + { + lua_pushnil(L); + lua_pushstring(L, gai_strerror(r)); + lua_pushinteger(L, r); + return 3; + } + } + + /* Copy getaddrinfo() result into Lua table */ + { + struct addrinfo *p; + lua_newtable(L); + for (p = res; p != NULL; p = p->ai_next) + { + lua_pushinteger(L, n++); + pushsockaddrinfo(L, p->ai_family, p->ai_addr); + pushintegerfield("socktype", p->ai_socktype); + pushstringfield("canonname", p->ai_canonname); + pushintegerfield("protocol", p->ai_protocol); + lua_settable(L, -3); + } + } + freeaddrinfo(res); + + + return 1; +} + + +/*** +Initiate a connection on a socket. +@function connect +@int fd socket descriptor to act on +@tparam sockaddr addr socket address +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see connect(2) +*/ +static int +Pconnect(lua_State *L) +{ + struct sockaddr_storage sa; + socklen_t salen; + int fd = checkint(L, 1); + checknargs (L, 2); + if (sockaddr_from_lua(L, 2, &sa, &salen) != 0) + return pusherror(L, "not a valid IPv4 dotted-decimal or IPv6 address string"); + + return pushresult(L, connect(fd, (struct sockaddr *)&sa, salen), "connect"); +} + + +/*** +Bind an address to a socket. +@function bind +@int fd socket descriptor to act on +@tparam sockaddr addr socket address +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see bind(2) +*/ +static int +Pbind(lua_State *L) +{ + struct sockaddr_storage sa; + socklen_t salen; + int fd; + checknargs (L, 2); + fd = checkint(L, 1); + if (sockaddr_from_lua(L, 2, &sa, &salen) != 0) + return pusherror(L, "not a valid IPv4 dotted-decimal or IPv6 address string"); + + return pushresult(L, bind(fd, (struct sockaddr *)&sa, salen), "bind"); +} + + +/*** +Listen for connections on a socket. +@function listen +@int fd socket descriptor to act on +@int backlog maximum length for queue of pending connections +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see listen(2) +*/ +static int +Plisten(lua_State *L) +{ + int fd = checkint(L, 1); + int backlog = checkint(L, 2); + checknargs(L, 2); + + return pushresult(L, listen(fd, backlog), "listen"); +} + + +/*** +Accept a connection on a socket. +@function accept +@int fd socket descriptor to act on +@treturn[1] int connection descriptor +@treturn[1] table connection address, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see accept(2) +*/ +static int +Paccept(lua_State *L) +{ + int fd_client; + struct sockaddr_storage sa; + unsigned int salen; + + int fd = checkint(L, 1); + + checknargs(L, 1); + + salen = sizeof(sa); + fd_client = accept(fd, (struct sockaddr *)&sa, &salen); + if (fd_client == -1) + return pusherror(L, "accept"); + + lua_pushinteger(L, fd_client); + return 1 + pushsockaddrinfo(L, sa.ss_family, (struct sockaddr *)&sa); +} + + +/*** +Receive a message from a socket. +@function recv +@int fd socket descriptor to act on +@int count maximum number of bytes to receive +@treturn[1] int received bytes, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see recv(2) +*/ +static int +Precv(lua_State *L) +{ + int fd = checkint(L, 1); + int count = checkint(L, 2), ret; + void *ud, *buf; + lua_Alloc lalloc; + + checknargs(L, 2); + lalloc = lua_getallocf(L, &ud); + + /* Reset errno in case lalloc doesn't set it */ + errno = 0; + if ((buf = lalloc(ud, NULL, 0, count)) == NULL && count > 0) + return pusherror(L, "lalloc"); + + ret = recv(fd, buf, count, 0); + if (ret < 0) + { + lalloc(ud, buf, count, 0); + return pusherror(L, NULL); + } + + lua_pushlstring(L, buf, ret); + lalloc(ud, buf, count, 0); + return 1; +} + + +/*** +Receive a message from a socket. +@function recvfrom +@int fd socket descriptor to act on +@int count maximum number of bytes to receive +@treturn[1] int received bytes +@treturn[1] sockaddr address of message source, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see recvfrom(2) +*/ +static int +Precvfrom(lua_State *L) +{ + void *ud, *buf; + socklen_t salen; + struct sockaddr_storage sa; + int r; + int fd = checkint(L, 1); + int count = checkint(L, 2); + lua_Alloc lalloc; + + checknargs(L, 2); + lalloc = lua_getallocf(L, &ud); + + /* Reset errno in case lalloc doesn't set it */ + errno = 0; + if ((buf = lalloc(ud, NULL, 0, count)) == NULL && count > 0) + return pusherror(L, "lalloc"); + + salen = sizeof(sa); + r = recvfrom(fd, buf, count, 0, (struct sockaddr *)&sa, &salen); + if (r < 0) + { + lalloc(ud, buf, count, 0); + return pusherror(L, NULL); + } + + lua_pushlstring(L, buf, r); + lalloc(ud, buf, count, 0); + return 1 + pushsockaddrinfo(L, sa.ss_family, (struct sockaddr *)&sa); +} + + +/*** +Send a message from a socket. +@function send +@int fd socket descriptor to act on +@string buffer message bytes to send +@treturn[1] int number of bytes sent, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see send(2) +*/ +static int +Psend(lua_State *L) +{ + int fd = checkint (L, 1); + size_t len; + const char *buf = luaL_checklstring(L, 2, &len); + + checknargs(L, 2); + return pushresult(L, send(fd, buf, len, 0), "send"); +} + + +/*** +Send a message from a socket. +@function sendto +@int fd socket descriptor to act on +@string buffer message bytes to send +@tparam sockaddr destination socket address +@treturn[1] int number of bytes sent, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see sendto(2) +*/ +static int +Psendto(lua_State *L) +{ + size_t len; + int fd = checkint(L, 1); + const char *buf = luaL_checklstring(L, 2, &len); + struct sockaddr_storage sa; + socklen_t salen; + checknargs (L, 3); + if (sockaddr_from_lua(L, 3, &sa, &salen) != 0) + return pusherror (L, "not a valid IPv4 dotted-decimal or IPv6 address string"); + + return pushresult(L, sendto(fd, buf, len, 0, (struct sockaddr *)&sa, salen), "sendto"); +} + + +/*** +Shut down part of a full-duplex connection. +@function shutdown +@int fd socket descriptor to act on +@int how one of `SHUT_RD`, `SHUT_WR` or `SHUT_RDWR` +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see shutdown(2) +@usage ok, errmsg = P.shutdown (sock, P.SHUT_RDWR) +*/ +static int +Pshutdown(lua_State *L) +{ + int fd = checkint(L, 1); + int how = checkint(L, 2); + checknargs(L, 2); + return pushresult(L, shutdown(fd, how), "shutdown"); +} + + +/*** +Get and set options on sockets. +@function setsockopt +@int fd socket descriptor +@int level one of `SOL_SOCKET`, `IPPROTO_IPV6`, `IPPROTO_TCP` +@int name option name, varies according to `level` value +@param value1 option value to set +@param[opt] value2 some option *name*s need an additional value +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see setsockopt(2) +@usage ok, errmsg = P.setsockopt (sock, P.SOL_SOCKET, P.SO_SNDTIMEO, 1, 0) +*/ +static int +Psetsockopt(lua_State *L) +{ + int fd = checkint(L, 1); + int level = checkint(L, 2); + int optname = checkint(L, 3); + struct linger linger; + struct timeval tv; + struct ipv6_mreq mreq6; +#ifdef SO_BINDTODEVICE + struct ifreq ifr; +#endif + int vint = 0; + void *val = NULL; + socklen_t len = sizeof(vint); + + switch (level) + { + case SOL_SOCKET: + switch (optname) + { + case SO_LINGER: + checknargs(L, 5); + + linger.l_onoff = checkint(L, 4); + linger.l_linger = checkint(L, 5); + val = &linger; + len = sizeof(linger); + break; + case SO_RCVTIMEO: + case SO_SNDTIMEO: + checknargs(L, 5); + + tv.tv_sec = checkint(L, 4); + tv.tv_usec = checkint(L, 5); + val = &tv; + len = sizeof(tv); + break; +#ifdef SO_BINDTODEVICE + case SO_BINDTODEVICE: + checknargs(L, 4); + + strlcpy(ifr.ifr_name, luaL_checkstring(L, 4), IFNAMSIZ); + val = 𝔦 + len = sizeof(ifr); +#endif + default: + checknargs(L, 4); + break; + } + break; +#if defined IPV6_JOIN_GROUP && defined IPV6_LEAVE_GROUP + case IPPROTO_IPV6: + switch (optname) + { + case IPV6_JOIN_GROUP: + case IPV6_LEAVE_GROUP: + checknargs(L, 4); + + memset(&mreq6, 0, sizeof mreq6); + inet_pton(AF_INET6, luaL_checkstring(L, 4), &mreq6.ipv6mr_multiaddr); + val = &mreq6; + len = sizeof(mreq6); + break; + default: + checknargs(L, 4); + break; + } + break; +#endif + case IPPROTO_TCP: + switch (optname) + { + default: + checknargs(L, 4); + break; + } + break; + default: + break; + } + + /* Default fallback to int if no specific handling of type above */ + + if (val == NULL) + { + vint = checkint(L, 4); + val = &vint; + len = sizeof(vint); + } + + return pushresult(L, setsockopt(fd, level, optname, val, len), "setsockopt"); +} + + +/*** +Get socket name. +@function getsockname +@see getsockname(2) +@int sockfd socket descriptor +@treturn[1] sockaddr the current address to which the socket *sockfd* is bound +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@usage sa, err = posix.getsockname (sockfd) +*/ +static int Pgetsockname(lua_State *L) +{ + int fd = checkint(L, 1); + struct sockaddr_storage sa; + socklen_t salen; + checknargs (L, 1); + if (getsockname(fd, (struct sockaddr *)&sa, &salen) != 0) + return pusherror(L, "getsockname"); + return pushsockaddrinfo(L, sa.ss_family, (struct sockaddr *)&sa); +} +#endif + + +static const luaL_Reg posix_sys_socket_fns[] = +{ +#if LPOSIX_2001_COMPLIANT + LPOSIX_FUNC( Psocket ), + LPOSIX_FUNC( Psocketpair ), + LPOSIX_FUNC( Pgetaddrinfo ), + LPOSIX_FUNC( Pconnect ), + LPOSIX_FUNC( Pbind ), + LPOSIX_FUNC( Plisten ), + LPOSIX_FUNC( Paccept ), + LPOSIX_FUNC( Precv ), + LPOSIX_FUNC( Precvfrom ), + LPOSIX_FUNC( Psend ), + LPOSIX_FUNC( Psendto ), + LPOSIX_FUNC( Pshutdown ), + LPOSIX_FUNC( Psetsockopt ), + LPOSIX_FUNC( Pgetsockname ), +#endif + {NULL, NULL} +}; + + +/*** +Constants. +@section constants +*/ + +/*** +Socket constants. +Any constants not available in the underlying system will be `nil` valued. +@table posix.sys.socket +@int AF_INET IP protocol family +@int AF_INET6 IP version 6 +@int AF_NETLINK Netlink protocol family +@int AF_UNIX local to host +@int AF_UNSPEC unspecified +@int AI_ADDRCONFIG use host configuration for returned address type +@int AI_ALL return IPv4 mapped and IPv6 addresses +@int AI_CANONNAME request canonical name +@int AI_NUMERICHOST don't use domain name resolution +@int AI_NUMERICSERV don't use service name resolution +@int AI_PASSIVE address is intended for @{bind} +@int AI_V4MAPPED IPv4 mapped addresses are acceptable +@int IPPROTO_ICMP internet control message protocol +@int IPPROTO_IP internet protocol +@int IPPROTO_IPV6 IPv6 header +@int IPPROTO_TCP transmission control protocol +@int IPPROTO_UDP user datagram protocol +@int IPV6_JOIN_GROUP +@int IPV6_LEAVE_GROUP +@int IPV6_MULTICAST_HOPS +@int IPV6_MULTICAST_IF +@int IPV6_MULTICAST_LOOP +@int IPV6_UNICAST_HOPS +@int IPV6_V6ONLY +@int NETLINK_AUDIT auditing +@int NETLINK_CONNECTOR +@int NETLINK_DNRTMSG decnet routing messages +@int NETLINK_ECRYPTFS +@int NETLINK_FIB_LOOKUP +@int NETLINK_FIREWALL firewalling hook +@int NETLINK_GENERIC +@int NETLINK_IP6_FW +@int NETLINK_ISCSI open iSCSI +@int NETLINK_KOBJECT_UEVENT kernel messages to userspace +@int NETLINK_NETFILTER netfilter subsystem +@int NETLINK_NFLOG netfilter/iptables ULOG +@int NETLINK_ROUTE routing/device hook +@int NETLINK_SCSITRANSPORT SCSI transports +@int NETLINK_SELINUX SELinux event notifications +@int NETLINK_UNUSED unused number +@int NETLINK_USERSOCK reserved for user mode socket protocols +@int NETLINK_XFRM ipsec +@int SHUT_RD no more receptions +@int SHUT_RDWR no more receptions or transmissions +@int SHUT_WR no more transmissions +@int SOCK_DGRAM connectionless unreliable datagrams +@int SOCK_RAW raw protocol interface +@int SOCK_STREAM connection based byte stream +@int SOL_SOCKET socket level +@int SOMAXCONN maximum concurrent connections +@int SO_ACCEPTCONN does this socket accept connections +@int SO_BINDTODEVICE bind to a particular device +@int SO_BROADCAST permit broadcasts +@int SO_DEBUG turn-on socket debugging +@int SO_DONTROUTE bypass standard routing +@int SO_ERROR set socket error flag +@int SO_KEEPALIVE periodically transmit keep-alive message +@int SO_LINGER linger on a @{posix.unistd.close} if data is still present +@int SO_OOBINLINE leave out-of-band data inline +@int SO_RCVBUF set receive buffer size +@int SO_RCVLOWAT set receive buffer low water mark +@int SO_RCVTIMEO set receive timeout +@int SO_REUSEADDR reuse local addresses +@int SO_SNDBUF set send buffer size +@int SO_SNDLOWAT set send buffer low water mark +@int SO_SNDTIMEO set send timeout +@int SO_TYPE get the socket type +@int TCP_NODELAY don't delay send for packet coalescing +@usage + -- Print socket constants supported on this host. + for name, value in pairs (require "posix.sys.socket") do + if type (value) == "number" then + print (name, value) + end + end +*/ + +LUALIB_API int +luaopen_posix_sys_socket(lua_State *L) +{ + luaL_register(L, "posix.sys.socket", posix_sys_socket_fns); + lua_pushliteral(L, "posix.sys.socket for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + +#if LPOSIX_2001_COMPLIANT + LPOSIX_CONST( SOMAXCONN ); + LPOSIX_CONST( AF_UNSPEC ); + LPOSIX_CONST( AF_INET ); + LPOSIX_CONST( AF_INET6 ); + LPOSIX_CONST( AF_UNIX ); +# if HAVE_LINUX_NETLINK_H + LPOSIX_CONST( AF_NETLINK ); +# endif + LPOSIX_CONST( SOL_SOCKET ); + LPOSIX_CONST( IPPROTO_TCP ); + LPOSIX_CONST( IPPROTO_UDP ); + LPOSIX_CONST( IPPROTO_IP ); + LPOSIX_CONST( IPPROTO_IPV6 ); +# ifdef IPPROTO_ICMP + LPOSIX_CONST( IPPROTO_ICMP ); +# endif + LPOSIX_CONST( SOCK_STREAM ); + LPOSIX_CONST( SOCK_DGRAM ); +# ifdef SOCK_RAW + LPOSIX_CONST( SOCK_RAW ); +# endif + LPOSIX_CONST( SHUT_RD ); + LPOSIX_CONST( SHUT_WR ); + LPOSIX_CONST( SHUT_RDWR ); + + LPOSIX_CONST( SO_ACCEPTCONN ); + LPOSIX_CONST( SO_BROADCAST ); + LPOSIX_CONST( SO_LINGER ); + LPOSIX_CONST( SO_RCVTIMEO ); + LPOSIX_CONST( SO_SNDTIMEO ); +# ifdef SO_BINDTODEVICE + LPOSIX_CONST( SO_BINDTODEVICE ); +# endif + LPOSIX_CONST( SO_DEBUG ); + LPOSIX_CONST( SO_DONTROUTE ); + LPOSIX_CONST( SO_ERROR ); + LPOSIX_CONST( SO_KEEPALIVE ); + LPOSIX_CONST( SO_OOBINLINE ); + LPOSIX_CONST( SO_RCVBUF ); + LPOSIX_CONST( SO_RCVLOWAT ); + LPOSIX_CONST( SO_REUSEADDR ); + LPOSIX_CONST( SO_SNDBUF ); + LPOSIX_CONST( SO_SNDLOWAT ); + LPOSIX_CONST( SO_TYPE ); + + LPOSIX_CONST( TCP_NODELAY ); + +# ifdef AI_ADDRCONFIG + LPOSIX_CONST( AI_ADDRCONFIG ); +# endif +# ifdef AI_ALL + LPOSIX_CONST( AI_ALL ); +# endif + LPOSIX_CONST( AI_CANONNAME ); + LPOSIX_CONST( AI_NUMERICHOST ); + LPOSIX_CONST( AI_NUMERICSERV ); + LPOSIX_CONST( AI_PASSIVE ); +# ifdef AI_V4MAPPED + LPOSIX_CONST( AI_V4MAPPED ); +# endif + +# ifdef IPV6_JOIN_GROUP + LPOSIX_CONST( IPV6_JOIN_GROUP ); +# endif +# ifdef IPV6_LEAVE_GROUP + LPOSIX_CONST( IPV6_LEAVE_GROUP ); +# endif +# ifdef IPV6_MULTICAST_HOPS + LPOSIX_CONST( IPV6_MULTICAST_HOPS ); +# endif +# ifdef IPV6_MULTICAST_IF + LPOSIX_CONST( IPV6_MULTICAST_IF ); +# endif +# ifdef IPV6_MULTICAST_LOOP + LPOSIX_CONST( IPV6_MULTICAST_LOOP ); +# endif +# ifdef IPV6_UNICAST_HOPS + LPOSIX_CONST( IPV6_UNICAST_HOPS ); +# endif +# ifdef IPV6_V6ONLY + LPOSIX_CONST( IPV6_V6ONLY ); +# endif +# if HAVE_LINUX_NETLINK_H + LPOSIX_CONST( NETLINK_ROUTE ); + LPOSIX_CONST( NETLINK_UNUSED ); + LPOSIX_CONST( NETLINK_USERSOCK ); + LPOSIX_CONST( NETLINK_FIREWALL ); + LPOSIX_CONST( NETLINK_NFLOG ); + LPOSIX_CONST( NETLINK_XFRM ); + LPOSIX_CONST( NETLINK_SELINUX ); + LPOSIX_CONST( NETLINK_ISCSI ); + LPOSIX_CONST( NETLINK_AUDIT ); + LPOSIX_CONST( NETLINK_FIB_LOOKUP ); + LPOSIX_CONST( NETLINK_CONNECTOR ); + LPOSIX_CONST( NETLINK_NETFILTER ); + LPOSIX_CONST( NETLINK_IP6_FW ); + LPOSIX_CONST( NETLINK_DNRTMSG ); + LPOSIX_CONST( NETLINK_KOBJECT_UEVENT ); + LPOSIX_CONST( NETLINK_GENERIC ); + LPOSIX_CONST( NETLINK_SCSITRANSPORT ); + LPOSIX_CONST( NETLINK_ECRYPTFS ); +# endif +#endif + + return 1; +} diff --git a/ext/posix/sys/stat.c b/ext/posix/sys/stat.c new file mode 100644 index 0000000..0c784cf --- /dev/null +++ b/ext/posix/sys/stat.c @@ -0,0 +1,382 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + File Status Querying and Setting. + +@module posix.sys.stat +*/ + +#include + +#include + +#include "_helpers.c" + + +/*** +File state record. +@table PosixStat +@int st_dev device id +@int st_ino inode number +@int st_mode mode of file +@int st_nlink number of hardlinks to file +@int st_uid user id of file owner +@int st_gid group id of file owner +@int st_rdev additional device specific id for special files +@int st_size file size in bytes +@int st_atime time of last access +@int st_mtime time of last data modification +@int st_ctime time of last state change +@int st_blksize preferred block size +@int st_blocks number of blocks allocated +*/ +static int +pushstat(lua_State *L, struct stat *st) +{ + if (!st) + return lua_pushnil(L), 1; + + lua_createtable(L, 0, 13); + + setintegerfield(st, st_dev); + setintegerfield(st, st_ino); + setintegerfield(st, st_mode); + setintegerfield(st, st_nlink); + setintegerfield(st, st_uid); + setintegerfield(st, st_gid); + setintegerfield(st, st_rdev); + setintegerfield(st, st_size); + setintegerfield(st, st_blksize); + setintegerfield(st, st_blocks); + + /* st_[amc]time is a macro on at least Mac OS, so we have to + assign field name strings manually. */ + pushintegerfield("st_atime", st->st_atime); + pushintegerfield("st_mtime", st->st_mtime); + pushintegerfield("st_ctime", st->st_ctime); + + settypemetatable("PosixStat"); + return 1; +} + + +/*** +Test for a block special file. +@function S_ISBLK +@int mode the st_mode field of a @{PosixStat} +@treturn int non-zero if *mode* represents a block special file +*/ +static int +PS_ISBLK(lua_State *L) +{ + checknargs(L, 1); + return pushintresult(S_ISBLK((mode_t) checkint(L, 1))); +} + + +/*** +Test for a character special file. +@function S_ISCHR +@int mode the st_mode field of a @{PosixStat} +@treturn int non-zero if *mode* represents a character special file +*/ +static int +PS_ISCHR(lua_State *L) +{ + checknargs(L, 1); + return pushintresult(S_ISCHR((mode_t) checkint(L, 1))); +} + + +/*** +Test for a directory. +@function S_ISDIR +@int mode the st_mode field of a @{PosixStat} +@treturn int non-zero if *mode* represents a directory +*/ +static int +PS_ISDIR(lua_State *L) +{ + checknargs(L, 1); + return pushintresult(S_ISDIR((mode_t) checkint(L, 1))); +} + + +/*** +Test for a fifo special file. +@function S_ISFIFO +@int mode the st_mode field of a @{PosixStat} +@treturn int non-zero if *mode* represents a fifo special file +*/ +static int +PS_ISFIFO(lua_State *L) +{ + checknargs(L, 1); + return pushintresult(S_ISFIFO((mode_t) checkint(L, 1))); +} + + +/*** +Test for a symbolic link. +@function S_ISLNK +@int mode the st_mode field of a @{PosixStat} +@treturn int non-zero if *mode* represents a symbolic link +*/ +static int +PS_ISLNK(lua_State *L) +{ + checknargs(L, 1); + return pushintresult(S_ISLNK((mode_t) checkint(L, 1))); +} + + +/*** +Test for a regular file. +@function S_ISREG +@int mode the st_mode field of a @{PosixStat} +@treturn int non-zero if *mode* represents a regular file +*/ +static int +PS_ISREG(lua_State *L) +{ + checknargs(L, 1); + return pushintresult(S_ISREG((mode_t) checkint(L, 1))); +} + + +/*** +Test for a socket. +@function S_ISSOCK +@int mode the st_mode field of a @{PosixStat} +@treturn int non-zero if *mode* represents a socket +*/ +static int +PS_ISSOCK(lua_State *L) +{ + checknargs(L, 1); + return pushintresult(S_ISSOCK((mode_t) checkint(L, 1))); +} + + +/*** +Change the mode of the path. +@function chmod +@string path existing file path to act on +@int mode access modes to set for *path* +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see chmod(2) +@usage P.chmod ('bin/dof', bit.bor (P.S_IRWXU, P.S_IRGRP)) +*/ +static int +Pchmod(lua_State *L) +{ + const char *path = luaL_checkstring(L, 1); + checknargs(L, 2); + return pushresult(L, chmod(path, (mode_t) checkint(L, 2)), path); +} + + +/*** +Information about an existing file path. +If file is a symbolic link, return information about the link itself. +@function lstat +@string path file to act on +@treturn PosixStat information about *path* +@see lstat(2) +@see stat +@usage for a, b in pairs (P.lstat "/etc/") do print (a, b) end +*/ +static int +Plstat(lua_State *L) +{ + struct stat s; + const char *path = luaL_checkstring(L, 1); + checknargs(L, 1); + if (lstat(path, &s) == -1) + return pusherror(L, path); + return pushstat(L, &s); +} + + +/*** +Make a directory. +@function mkdir +@string path location in file system to create directory +@int[opt=511] mode access modes to set for *path* +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see mkdir(2) +*/ +static int +Pmkdir(lua_State *L) +{ + const char *path = luaL_checkstring(L, 1); + checknargs(L, 2); + return pushresult(L, mkdir(path, (mode_t) optint(L, 2, 0777)), path); +} + + +/*** +Make a FIFO pipe. +@function mkfifo +@string path location in file system to create fifo +@int[opt=511] mode access modes to set for *path* +@treturn[1] int file descriptor for *path*, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see mkfifo(2) +*/ +static int +Pmkfifo(lua_State *L) +{ + const char *path = luaL_checkstring(L, 1); + checknargs(L, 2); + return pushresult(L, mkfifo(path, (mode_t) optint(L, 2, 0777)), path); +} + + +/*** +Information about an existing file path. +If file is a symbolic link, return information about the file the link points to. +@function stat +@string path file to act on +@treturn PosixStat information about *path* +@see stat(2) +@see lstat +@usage for a, b in pairs (P.stat "/etc/") do print (a, b) end +*/ +static int +Pstat(lua_State *L) +{ + struct stat s; + const char *path = luaL_checkstring(L, 1); + checknargs(L, 1); + if (stat(path, &s) == -1) + return pusherror(L, path); + return pushstat(L, &s); +} + + +/*** +Set file mode creation mask. +@function umask +@int[opt] mode new file creation mask +@treturn int previous umask +@see umask(2) +@see posix.umask +*/ +static int +Pumask(lua_State *L) +{ + checknargs(L, 1); + return pushintresult(umask((mode_t) checkint(L, 1))); +} + + +static const luaL_Reg posix_sys_stat_fns[] = +{ + LPOSIX_FUNC( PS_ISBLK ), + LPOSIX_FUNC( PS_ISCHR ), + LPOSIX_FUNC( PS_ISDIR ), + LPOSIX_FUNC( PS_ISFIFO ), + LPOSIX_FUNC( PS_ISLNK ), + LPOSIX_FUNC( PS_ISREG ), + LPOSIX_FUNC( PS_ISSOCK ), + LPOSIX_FUNC( Pchmod ), + LPOSIX_FUNC( Plstat ), + LPOSIX_FUNC( Pmkdir ), + LPOSIX_FUNC( Pmkfifo ), + LPOSIX_FUNC( Pstat ), + LPOSIX_FUNC( Pumask ), + {NULL, NULL} +}; + + +/*** +Constants. +@section constants +*/ + +/*** +Stat constants. +Any constants not available in the underlying system will be `nil` valued. +@table posix.sys.stat +@int S_IFMT file type mode bitmask +@int S_IFBLK block special +@int S_IFCHR character special +@int S_IFDIR directory +@int S_IFIFO fifo +@int S_IFLNK symbolic link +@int S_IFREG regular file +@int S_IFSOCK socket +@int S_IRWXU user read, write and execute +@int S_IRUSR user read +@int S_IWUSR user write +@int S_IXUSR user execute +@int S_IRWXG group read, write and execute +@int S_IRGRP group read +@int S_IWGRP group write +@int S_IXGRP group execute +@int S_IRWXO other read, write and execute +@int S_IROTH other read +@int S_IWOTH other write +@int S_IXOTH other execute +@int S_ISGID set group id on execution +@int S_ISUID set user id on execution +@usage + -- Print stat constants supported on this host. + for name, value in pairs (require "posix.sys.stat") do + if type (value) == "number" then + print (name, value) + end + end +*/ + + +LUALIB_API int +luaopen_posix_sys_stat(lua_State *L) +{ + luaL_register(L, "posix.sys.stat", posix_sys_stat_fns); + lua_pushliteral(L, "posix.sys.stat for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + LPOSIX_CONST( S_IFMT ); + LPOSIX_CONST( S_IFBLK ); + LPOSIX_CONST( S_IFCHR ); + LPOSIX_CONST( S_IFDIR ); + LPOSIX_CONST( S_IFIFO ); + LPOSIX_CONST( S_IFLNK ); + LPOSIX_CONST( S_IFREG ); + LPOSIX_CONST( S_IFSOCK ); + LPOSIX_CONST( S_IRWXU ); + LPOSIX_CONST( S_IRUSR ); + LPOSIX_CONST( S_IWUSR ); + LPOSIX_CONST( S_IXUSR ); + LPOSIX_CONST( S_IRWXG ); + LPOSIX_CONST( S_IRGRP ); + LPOSIX_CONST( S_IWGRP ); + LPOSIX_CONST( S_IXGRP ); + LPOSIX_CONST( S_IRWXO ); + LPOSIX_CONST( S_IROTH ); + LPOSIX_CONST( S_IWOTH ); + LPOSIX_CONST( S_IXOTH ); + LPOSIX_CONST( S_ISGID ); + LPOSIX_CONST( S_ISUID ); + + return 1; +} diff --git a/ext/posix/sys/statvfs.c b/ext/posix/sys/statvfs.c new file mode 100644 index 0000000..8171203 --- /dev/null +++ b/ext/posix/sys/statvfs.c @@ -0,0 +1,131 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Retrieve File System Information. + + Where supported by the underlying system, query the file system. If the + module loads, but there is no kernel support, then `posix.sys.statvfs.version` + will be set, but the unsupported APIs will be `nil`. + +@module posix.sys.statvfs +*/ + +#include + +#if defined HAVE_STATVFS + +#include + +#include "_helpers.c" + + +/*** +Files system information record. +@table PosixStatvfs +@int f_bsize file system block size +@int f_frsize fundamental file system block size +@int f_blocks number of *f_frsize* sized blocks in file system +@int f_bfree number of free blocks +@int f_bavail number of free blocks available to non-privileged process +@int f_files number of file serial numbers +@int f_ffree number of free file serial numbers +@int f_favail number of free file serial numbers available +@int f_fsid file system id +@int f_flag flag bits +@int f_namemax maximum filename length +*/ +static int +pushstatvfs(lua_State *L, struct statvfs *sv) +{ + if (!sv) + return lua_pushnil(L), 1; + + lua_createtable(L, 0, 11); + + setintegerfield(sv, f_bsize); + setintegerfield(sv, f_frsize); + setintegerfield(sv, f_blocks); + setintegerfield(sv, f_bfree); + setintegerfield(sv, f_bavail); + setintegerfield(sv, f_files); + setintegerfield(sv, f_ffree); + setintegerfield(sv, f_favail); + setintegerfield(sv, f_fsid); + setintegerfield(sv, f_flag); + setintegerfield(sv, f_namemax); + + settypemetatable("PosixStatvfs"); + return 1; +} + + +/*** +Get file system statistics. +@function statvfs +@string path any path within the mounted file system +@treturn PosixStatvfs information about file system containing *path* +@see statvfs(3) +@usage for a, b in pairs (P.statvfs "/") do print (a, b) end +*/ +static int +Pstatvfs(lua_State *L) +{ + struct statvfs s; + const char *path = luaL_checkstring(L, 1); + checknargs(L, 1); + if (statvfs(path, &s) == -1) + return pusherror(L, path); + return pushstatvfs(L, &s); +} + + +static const luaL_Reg posix_sys_statvfs_fns[] = +{ + LPOSIX_FUNC( Pstatvfs ), + {NULL, NULL} +}; + + +/*** +Constants. +@section constants +*/ + +/*** +Statvfs constants. +Any constants not available in the underlying system will be `nil` valued. +@table posix.sys.statvfs +@int ST_RDONLY read-only file system +@int ST_NOSUID does not support `S_ISUID` nor `S_ISGID` file mode bits +@usage + -- Print statvfs constants supported on this host. + for name, value in pairs (require "posix.sys.statvfs") do + if type (value) == "number" then + print (name, value) + end + end +*/ + + +LUALIB_API int +luaopen_posix_sys_statvfs(lua_State *L) +{ + luaL_register(L, "posix.sys.statvfs", posix_sys_statvfs_fns); + lua_pushliteral(L, "posix.sys.statvfs for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + LPOSIX_CONST( ST_RDONLY ); + LPOSIX_CONST( ST_NOSUID ); + + return 1; +} +#endif diff --git a/ext/posix/sys/time.c b/ext/posix/sys/time.c new file mode 100644 index 0000000..d22e618 --- /dev/null +++ b/ext/posix/sys/time.c @@ -0,0 +1,81 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Get and Set System Date and Time. + +@module posix.sys.time +*/ + + +#include + +#include + +#include "_helpers.c" + + +/*** +Time value. +@table PosixTimeval +@int tv_sec seconds elapsed +@int tv_usec remainder in microseconds +@see posix.time.PosixTimespec +*/ +static int +pushtimeval(lua_State *L, struct timeval *tv) +{ + if (!tv) + return lua_pushnil(L), 1; + + lua_createtable(L, 0, 2); + setintegerfield(tv, tv_sec); + setintegerfield(tv, tv_usec); + + settypemetatable("PosixTimeval"); + return 1; +} + + +/*** +Get time of day. +@function gettimeofday +@treturn PosixTimeval time elapsed since *epoch* +@see gettimeofday(2) +*/ +static int +Pgettimeofday(lua_State *L) +{ + struct timeval tv; + checknargs(L, 0); + if (gettimeofday(&tv, NULL) == -1) + return pusherror(L, "gettimeofday"); + + return pushtimeval(L, &tv); +} + + +static const luaL_Reg posix_sys_time_fns[] = +{ + LPOSIX_FUNC( Pgettimeofday ), + {NULL, NULL} +}; + + +LUALIB_API int +luaopen_posix_sys_time(lua_State *L) +{ + luaL_register(L, "posix.sys.time", posix_sys_time_fns); + lua_pushliteral(L, "posix.sys.time for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + return 1; +} diff --git a/ext/posix/sys/times.c b/ext/posix/sys/times.c new file mode 100644 index 0000000..957277b --- /dev/null +++ b/ext/posix/sys/times.c @@ -0,0 +1,96 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Process Times. + +@module posix.sys.times +*/ + +#include + +#include + +#include "_helpers.c" + +#define pushtimefield(k,x) pushintegerfield((k), ((lua_Integer)x)/clk_tck) + +/*** +Process times record. +All times are measured in cpu seconds. +@table PosixTms +@int tms_utime time spent executing user instructions +@int tms_stime time spent in system execution +@int tms_cutime sum of *tms_utime* for calling process and its children +@int tms_cstime sum of *tms_stime* for calling process and its children +*/ +static int +pushtms(lua_State *L) +{ + static long clk_tck = 0; + + struct tms t; + clock_t elapsed = times(&t); + + if (elapsed == (clock_t) -1) + return pusherror(L, "times"); + + if (clk_tck == 0) + clk_tck = sysconf(_SC_CLK_TCK); + + lua_createtable(L, 0, 5); + + /* record elapsed time, and save accounting to struct */ + pushtimefield("elapsed", elapsed); + + /* record struct entries */ + pushtimefield("tms_utime", t.tms_utime); + pushtimefield("tms_stime", t.tms_stime); + pushtimefield("tms_cutime", t.tms_cutime); + pushtimefield("tms_cstime", t.tms_cstime); + + settypemetatable("PosixTms"); + return 1; +} + +/*** +Get the current process times. +@function times +@treturn[1] PosixTms time accounting for this process, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see times(2) +*/ +static int +Ptimes(lua_State *L) +{ + checknargs(L, 0); + return pushtms(L); +} + + +static const luaL_Reg posix_sys_times_fns[] = +{ + LPOSIX_FUNC( Ptimes ), + {NULL, NULL} +}; + + +LUALIB_API int +luaopen_posix_sys_times(lua_State *L) +{ + luaL_register(L, "posix.sys.times", posix_sys_times_fns); + lua_pushliteral(L, "posix.sys.times for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + return 1; +} diff --git a/ext/posix/sys/utsname.c b/ext/posix/sys/utsname.c new file mode 100644 index 0000000..6ca7e80 --- /dev/null +++ b/ext/posix/sys/utsname.c @@ -0,0 +1,88 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Get System Identification. + +@module posix.sys.utsname +*/ + +#include + +#include + +#include "_helpers.c" + + +/*** +System identification record. +@table utsname +@string machine hardware platform name +@string nodename network node name +@string release operating system release level +@string sysname operating system name +@string version operating system version +*/ + +static int +pushutsname(lua_State *L, struct utsname *u) +{ + if (!u) + return lua_pushnil(L), 1; + + lua_createtable(L, 0, 5); + setstringfield(u, machine); + setstringfield(u, nodename); + setstringfield(u, release); + setstringfield(u, sysname); + setstringfield(u, version); + + settypemetatable("PosixUtsname"); + return 1; +} + + +/*** +Return information about this machine. +@function uname +@treturn[1] utsname system information +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see uname(2) +*/ +static int +Puname(lua_State *L) +{ + struct utsname u; + checknargs(L, 0); + if (uname(&u)==-1) + return pusherror(L, "uname"); + return pushutsname(L, &u); +} + + +static const luaL_Reg posix_sys_utsname_fns[] = +{ + LPOSIX_FUNC( Puname ), + {NULL, NULL} +}; + + +LUALIB_API int +luaopen_posix_sys_utsname(lua_State *L) +{ + luaL_register(L, "posix.sys.utsname", posix_sys_utsname_fns); + lua_pushliteral(L, "posix.sys.utsname for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + return 1; +} diff --git a/ext/posix/sys/wait.c b/ext/posix/sys/wait.c new file mode 100644 index 0000000..c2ce8c6 --- /dev/null +++ b/ext/posix/sys/wait.c @@ -0,0 +1,111 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Wait for Process Termination. + +@module posix.sys.wait +*/ + +#include + +#include + +#include "_helpers.c" + + +/*** +Wait for child process to terminate. +@function wait +@int[opt=-1] pid child process id to wait for, or -1 for any child process +@int[opt] options bitwise OR of `WNOHANG` and `WUNTRACED` +@treturn[1] int pid of terminated child, if successful +@treturn[1] string "exited", "killed" or "stopped" +@treturn[1] int exit status, or signal number responsible for "killed" or "stopped" +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see waitpid(2) +@see posix.unistd.fork +*/ +static int +Pwait(lua_State *L) +{ + int status = 0; + pid_t pid = optint(L, 1, -1); + int options = optint(L, 2, 0); + checknargs(L, 2); + + pid = waitpid(pid, &status, options); + if (pid == -1) + return pusherror(L, NULL); + lua_pushinteger(L, pid); + if (WIFEXITED(status)) + { + lua_pushliteral(L,"exited"); + lua_pushinteger(L, WEXITSTATUS(status)); + return 3; + } + else if (WIFSIGNALED(status)) + { + lua_pushliteral(L,"killed"); + lua_pushinteger(L, WTERMSIG(status)); + return 3; + } + else if (WIFSTOPPED(status)) + { + lua_pushliteral(L,"stopped"); + lua_pushinteger(L, WSTOPSIG(status)); + return 3; + } + return 1; +} + + +static const luaL_Reg posix_sys_wait_fns[] = +{ + LPOSIX_FUNC( Pwait ), + {NULL, NULL} +}; + + +/*** +Constants. +@section constants +*/ + +/*** +Wait constants. +Any constants not available in the underlying system will be `nil` valued. +@table posix.sys.wait +@int WNOHANG don't block waiting +@int WUNTRACED report status of stopped children +@usage + -- Print wait constants supported on this host. + for name, value in pairs (require "posix.sys.wait") do + if type (value) == "number" then + print (name, value) + end + end +*/ + +LUALIB_API int +luaopen_posix_sys_wait(lua_State *L) +{ + luaL_register(L, "posix.sys.wait", posix_sys_wait_fns); + lua_pushliteral(L, "posix.sys.wait for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + LPOSIX_CONST( WNOHANG ); + LPOSIX_CONST( WUNTRACED ); + + return 1; +} diff --git a/ext/posix/syslog.c b/ext/posix/syslog.c new file mode 100644 index 0000000..9e36beb --- /dev/null +++ b/ext/posix/syslog.c @@ -0,0 +1,223 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Control System Log. + +@module posix.syslog +*/ + +#include + +#include "_helpers.c" /* For LPOSIX_2001_COMPLIANT */ + +#if LPOSIX_2001_COMPLIANT +#include + +/*** +Open the system logger. +@function openlog +@string ident all messages will start with this +@int[opt] option bitwise OR of zero or more of `LOG_CONS`, `LOG_NDELAY`, + or `LOG_PID` +@int[opt=`LOG_USER`] facility one of `LOG_AUTH`, `LOG_AUTHPRIV`, `LOG_CRON`, + `LOG_DAEMON`, `LOG_FTP`, `LOG_KERN`, `LOG_LPR`, `LOG_MAIL`, `LOG_NEWS`, + `LOG_SECURITY`, `LOG_SYSLOG`, `LOG_USER`, `LOG_UUCP` or `LOG_LOCAL0` + through `LOG_LOCAL7` +@see syslog(3) +*/ +static int +Popenlog(lua_State *L) +{ + const char *ident = luaL_checkstring(L, 1); + int option = optint(L, 2, 0); + int facility = optint(L, 3, LOG_USER); + checknargs(L, 3); + openlog(ident, option, facility); + return 0; +} + + +/*** +Write to the system logger. +@function syslog +@int priority one of `LOG_EMERG`, `LOG_ALERT`, `LOG_CRIT`, `LOG_WARNING`, + `LOG_NOTICE`, `LOG_INFO` or `LOG_DEBUG` +@string message log message +@see syslog(3) +*/ +static int +Psyslog(lua_State *L) +{ + int priority = checkint(L, 1); + const char *msg = luaL_checkstring(L, 2); + checknargs(L, 2); + syslog(priority, "%s", msg); + return 0; +} + + +/*** +Close system log. +@function closelog +@see syslog(3) +*/ +static int +Pcloselog(lua_State *L) +{ + checknargs(L, 0); + closelog(); + return 0; +} + + +/*** +Set log priority mask. +@function setlogmask +@int mask bitwise OR of @{LOG_MASK} bits. +@treturn[1] int previous mask, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see setlogmask(3) +*/ +static int +Psetlogmask(lua_State *L) +{ + checknargs(L, 1); + return pushresult(L, setlogmask(optint(L, 1, 0)), "setlogmask"); +} + + +/*** +Mask bit for given log priority. +@function LOG_MASK +@int priority one of `LOG_EMERG`, `LOG_ALERT`, `LOG_CRIT`, `LOG_WARNING`, + `LOG_NOTICE`, `LOG_INFO` or `LOG_DEBUG` +@treturn int mask bit corresponding to *priority* +@see setlogmask(3) +*/ +static int +PLOG_MASK(lua_State *L) +{ + checknargs(L, 1); + return pushintresult(LOG_MASK(checkint(L, 1))); +} +#endif + + +static const luaL_Reg posix_syslog_fns[] = +{ +#if LPOSIX_2001_COMPLIANT + LPOSIX_FUNC( PLOG_MASK ), + LPOSIX_FUNC( Popenlog ), + LPOSIX_FUNC( Psyslog ), + LPOSIX_FUNC( Pcloselog ), + LPOSIX_FUNC( Psetlogmask ), +#endif + {NULL, NULL} +}; + + +/*** +Constants. +@section constants +*/ + +/*** +System logging constants. +Any constants not available in the underlying system will be `nil` valued. +@table posix.syslog +@int LOG_AUTH security/authorisation messages +@int LOG_AUTHPRIV private authorisation messages +@int LOG_CONS write directly to system console +@int LOG_CRON clock daemon +@int LOG_DAEMON system daemons +@int LOG_FTP ftp daemon +@int LOG_KERN kernel messages +@int LOG_LOCAL0 reserved for local use +@int LOG_LOCAL1 reserved for local use +@int LOG_LOCAL2 reserved for local use +@int LOG_LOCAL3 reserved for local use +@int LOG_LOCAL4 reserved for local use +@int LOG_LOCAL5 reserved for local use +@int LOG_LOCAL6 reserved for local use +@int LOG_LOCAL7 reserved for local use +@int LOG_LPR line printer subsystem +@int LOG_MAIL mail system +@int LOG_NDELAY open the connection immediately +@int LOG_NEWS network news subsystem +@int LOG_PID include process id with each log message +@int LOG_SYSLOG messages generated internally by syslogd +@int LOG_USER random user-level messages +@int LOG_UUCP unix-to-unix copy subsystem +@int LOG_EMERG system is unusable +@int LOG_ALERT action must be taken immediately +@int LOG_CRIT critical conditions +@int LOG_ERR error conditions +@int LOG_WARNING warning conditions +@int LOG_NOTICE normal but significant conditions +@int LOG_INFO informational +@int LOG_DEBUG debug-level messages +@usage + -- Print syslog constants supported on this host. + for name, value in pairs (require "posix.syslog") do + if type (value) == "number" then + print (name, value) + end + end +*/ + +LUALIB_API int +luaopen_posix_syslog(lua_State *L) +{ + luaL_register(L, "posix.syslog", posix_syslog_fns); + lua_pushliteral(L, "posix.syslog for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + +#if LPOSIX_2001_COMPLIANT + LPOSIX_CONST( LOG_CONS ); + LPOSIX_CONST( LOG_NDELAY ); + LPOSIX_CONST( LOG_PID ); + + LPOSIX_CONST( LOG_AUTH ); + LPOSIX_CONST( LOG_AUTHPRIV ); + LPOSIX_CONST( LOG_CRON ); + LPOSIX_CONST( LOG_DAEMON ); + LPOSIX_CONST( LOG_FTP ); + LPOSIX_CONST( LOG_KERN ); + LPOSIX_CONST( LOG_LOCAL0 ); + LPOSIX_CONST( LOG_LOCAL1 ); + LPOSIX_CONST( LOG_LOCAL2 ); + LPOSIX_CONST( LOG_LOCAL3 ); + LPOSIX_CONST( LOG_LOCAL4 ); + LPOSIX_CONST( LOG_LOCAL5 ); + LPOSIX_CONST( LOG_LOCAL6 ); + LPOSIX_CONST( LOG_LOCAL7 ); + LPOSIX_CONST( LOG_LPR ); + LPOSIX_CONST( LOG_MAIL ); + LPOSIX_CONST( LOG_NEWS ); + LPOSIX_CONST( LOG_SYSLOG ); + LPOSIX_CONST( LOG_USER ); + LPOSIX_CONST( LOG_UUCP ); + + LPOSIX_CONST( LOG_EMERG ); + LPOSIX_CONST( LOG_ALERT ); + LPOSIX_CONST( LOG_CRIT ); + LPOSIX_CONST( LOG_ERR ); + LPOSIX_CONST( LOG_WARNING ); + LPOSIX_CONST( LOG_NOTICE ); + LPOSIX_CONST( LOG_INFO ); + LPOSIX_CONST( LOG_DEBUG ); +#endif + + return 1; +} diff --git a/ext/posix/termio.c b/ext/posix/termio.c new file mode 100644 index 0000000..8af570c --- /dev/null +++ b/ext/posix/termio.c @@ -0,0 +1,610 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Control Terminal I/O. + + Functions and constants for controlling terminal behaviour. + +@module posix.termio +*/ + +#include + +#include + +#include "_helpers.c" + + +/*** +Control characters. +The field names below are not strings, but index constants each +referring to a terminal control character. +@table ccs +@int VINTR interrupt control character +@int VQUIT quit control character +@int WERASE erase control character +@int VKILL kill control character +@int VEOF end-of-file control character +@int VEOL end-of-line control charactor +@int VEOL2 another end-of-line control charactor +@int VMIN 1 +@int VTIME 0 +@int VSTART xon/xoff start control character +@int VSTOP xon/xoff stop control character +@int VSUSP suspend control character +*/ + +/*** +Terminal attributes. +The constants named below are all available in this submodule's namespace, +as long as they are supported by the underlying system. +@table termios +@int cflag bitwise OR of zero or more of `B0`, `B50`, `B75`, `B110`, + `B134`, `B150`, `B200`, `B300`, `B600`, `B1200`, `B1800`, `B2400`, + `B4800`, `B9600`, `B19200`, `B38400`, `B57600`, `B115200`, `CSIZE`, + `CS5`, `CS6`, `CS7`, `CS8`, `CSTOPB`, `CREAD`, `PARENB`, `PARODD`, + `HUPCL`, `CLOCAL` and `CRTSCTS` +@int iflag input flags; bitwise OR of zero or more of `IGNBRK`, `BRKINT`, + `IGNPAR`, `PARMRK`, `INPCK`, `ISTRIP`, `INLCR`, `IGNCR`, `ICRNL`, + `IXON`, `IXOFF`, `IXANY`, `IMAXBEL` and `IUTF8` +@int lflags local flags; bitwise OR of zero or more of `ISIG`, `ICANON`, + `ECHO`, `ECHOE`, `ECHOK', 'ECHONL`, `NOFLSH`, `IEXTEN` and `TOSTOP` +@int oflag output flags; bitwise OR of zero or more of `OPOST`, `ONLCR`, + `OXTABS`, `ONOEOT`, `OCRNL`, `ONOCR`, `ONLRET`, `OFILL`, `NLDLY`, + `TABDLY`, `CRDLY`, `FFDLY`, `BSDLY`, `VTDLY` and `OFDEL` +@tfield ccs cc array of terminal control characters +*/ + + +/*** +Wait for all written output to reach the terminal. +@function tcdrain +@int fd terminal descriptor to act on +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see tcdrain(3) +*/ +static int +Ptcdrain(lua_State *L) +{ + int fd = checkint(L, 1); + checknargs(L, 1); + return pushresult(L, tcdrain(fd), NULL); +} + + +/*** +Suspend transmission or receipt of data. +@function tcflow +@int fd terminal descriptor to act on +@int action one of `TCOOFF`, `TCOON`, `TCIOFF` or `TCION` +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see tcflow(3) +*/ +static int +Ptcflow(lua_State *L) +{ + int fd = checkint(L, 1); + int action = checkint(L, 2); + checknargs(L, 2); + return pushresult(L, tcflow(fd, action), NULL); +} + + +/*** +Discard any data already written but not yet sent to the terminal. +@function tcflush +@int fd terminal descriptor to act on +@int action one of `TCIFLUSH`, `TCOFLUSH`, `TCIOFLUSH` +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see tcflush(3) +*/ +static int +Ptcflush(lua_State *L) +{ + int fd = checkint(L, 1); + int qs = checkint(L, 2); + checknargs(L, 2); + return pushresult(L, tcflush(fd, qs), NULL); +} + + +/*** +Get termios state. +@function tcgetattr +@int fd terminal descriptor +@treturn[1] termios terminal attributes, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@return error message if failed +@see tcgetattr(3) +@usage +local termios, errmsg = tcgetattr (fd) +*/ +static int +Ptcgetattr(lua_State *L) +{ + int r, i; + struct termios t; + int fd = checkint(L, 1); + + checknargs(L, 1); + r = tcgetattr(fd, &t); + if (r == -1) return pusherror(L, NULL); + + lua_newtable(L); + pushintegerfield("iflag", t.c_iflag); + pushintegerfield("oflag", t.c_oflag); + pushintegerfield("lflag", t.c_lflag); + pushintegerfield("cflag", t.c_cflag); + + lua_newtable(L); + for (i=0; i, 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Time and Clock Functions. + +@module posix.time +*/ + +#include + +#include +#include + +#include "_helpers.c" + + +static const char *Stimespec_fields[] = { "tv_sec", "tv_nsec" }; + +static void +totimespec(lua_State *L, int index, struct timespec *ts) +{ + luaL_checktype(L, index, LUA_TTABLE); + ts->tv_sec = optintfield(L, index, "tv_sec", 0); + ts->tv_nsec = optintfield(L, index, "tv_nsec", 0); + + checkfieldnames(L, index, Stimespec_fields); +} + + +/*** +Timespec record. +@table PosixTimespec +@int tv_sec seconds +@int tv_nsec nanoseconds +@see posix.sys.time.PosixTimeval +*/ +static int +pushtimespec(lua_State *L, struct timespec *ts) +{ + if (!ts) + return lua_pushnil(L), 1; + + lua_createtable(L, 0, 2); + setintegerfield(ts, tv_sec); + setintegerfield(ts, tv_nsec); + + settypemetatable("PosixTimespec"); + return 1; +} + + +static const char *Stm_fields[] = { + "tm_sec", "tm_min", "tm_hour", "tm_mday", "tm_mon", "tm_year", "tm_wday", + "tm_yday", "tm_isdst", +}; + +static void +totm(lua_State *L, int index, struct tm *t) +{ + luaL_checktype(L, index, LUA_TTABLE); + t->tm_sec = optintfield(L, index, "tm_sec", 0); + t->tm_min = optintfield(L, index, "tm_min", 0); + t->tm_hour = optintfield(L, index, "tm_hour", 0); + t->tm_mday = optintfield(L, index, "tm_mday", 0); + t->tm_mon = optintfield(L, index, "tm_mon", 0); + t->tm_year = optintfield(L, index, "tm_year", 0); + t->tm_wday = optintfield(L, index, "tm_wday", 0); + t->tm_yday = optintfield(L, index, "tm_yday", 0); + t->tm_isdst = optintfield(L, index, "tm_isdst", 0); + + checkfieldnames(L, index, Stm_fields); +} + + +/*** +Datetime record. +@table PosixTm +@int tm_sec second [0,60] +@int tm_min minute [0,59] +@int tm_hour hour [0,23] +@int tm_mday day of month [1, 31] +@int tm_mon month of year [0,11] +@int tm_year years since 1900 +@int tm_wday day of week [0=Sunday,6] +@int tm_yday day of year [0,365[ +@int tm_isdst 0 if daylight savings time is not in effect +*/ +static int +pushtm(lua_State *L, struct tm *t) +{ + if (!t) + return lua_pushnil(L), 1; + + lua_createtable(L, 0, 9); + setintegerfield(t, tm_sec); + setintegerfield(t, tm_min); + setintegerfield(t, tm_hour); + setintegerfield(t, tm_mday); + setintegerfield(t, tm_mday); + setintegerfield(t, tm_mon); + setintegerfield(t, tm_year); + setintegerfield(t, tm_wday); + setintegerfield(t, tm_yday); + setintegerfield(t, tm_isdst); + + settypemetatable("PosixTm"); + return 1; +} + + +#if defined _XOPEN_REALTIME && _XOPEN_REALTIME != -1 +/*** +Find the precision of a clock. +@function clock_getres +@int clk name of clock, one of `CLOCK_REALTIME`, `CLOCK_PROCESS_CPUTIME_ID`, + `CLOCK_MONOTONIC` or `CLOCK_THREAD_CPUTIME_ID` +@treturn[1] PosixTimespec resolution of *clk*, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see clock_getres(3) +*/ +static int +Pclock_getres(lua_State *L) +{ + struct timespec resolution; + int clk = checkint(L, 1); + checknargs(L, 1); + if (clock_getres(clk, &resolution) == -1) + return pusherror(L, "clock_getres"); + return pushtimespec(L, &resolution); +} + + +/*** +Read a clock. +@function clock_gettime +@int clk name of clock, one of `CLOCK_REALTIME`, `CLOCK_PROCESS_CPUTIME_ID`, + `CLOCK_MONOTONIC` or `CLOCK_THREAD_CPUTIME_ID` +@treturn[1] PosixTimespec current value of *clk*, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see clock_gettime(3) +*/ +static int +Pclock_gettime(lua_State *L) +{ + struct timespec ts; + int clk = checkint(L, 1); + checknargs(L, 1); + if (clock_gettime(clk, &ts) == -1) + return pusherror(L, "clock_gettime"); + return pushtimespec(L, &ts); +} +#endif + + +/*** +Convert epoch time value to a broken-down UTC time. +@function gmtime +@int t seconds since epoch +@treturn PosixTm broken-down time +@see gmtime(3) +*/ +static int +Pgmtime(lua_State *L) +{ + struct tm t; + time_t epoch = checkint(L, 1); + checknargs(L, 1); + if (gmtime_r(&epoch, &t) == NULL) + return pusherror(L, "gmtime"); + return pushtm(L, &t); +} + + +/*** +Convert epoch time value to a broken-down local time. +@function localtime +@int t seconds since epoch +@treturn PosixTm broken-down time +@see localtime(3) +@see mktime +*/ +static int +Plocaltime(lua_State *L) +{ + struct tm t; + time_t epoch = checkint(L, 1); + checknargs(L, 1); + if (localtime_r(&epoch, &t) == NULL) + return pusherror(L, "localtime"); + return pushtm(L, &t); +} + + +/*** +Convert a broken-down localtime table into an epoch time. +@function mktime +@tparam PosixTm broken-down localtime +@treturn int seconds since epoch +@see mktime(3) +@see localtime +*/ +static int +Pmktime(lua_State *L) +{ + struct tm t; + time_t epoch; + checknargs(L, 1); + totm(L, 1, &t); + if ((epoch = mktime(&t)) < 0) + return 0; + return pushintresult(epoch); +} + + +/*** +Sleep with nanosecond precision. +@function nanosleep +@tparam PosixTimespec requested sleep time +@treturn[1] int `0` if requested time has elapsed +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@treturn[2] PosixTimespec unslept time remaining, if interrupted +@see nanosleep(2) +@see posix.unistd.sleep +*/ +static int +Pnanosleep(lua_State *L) +{ + struct timespec req; + struct timespec rem; + int r; + + totimespec(L, 1, &req); + checknargs(L, 1); + r = pushresult (L, nanosleep(&req, &rem), "nanosleep"); + if (r == 3 && errno == EINTR) + r = r + pushtimespec (L, &rem); + return r; +} + + +/*** +Write a time out according to a format. +@function strftime +@string format specifier with `%` place-holders +@tparam PosixTm tm broken-down local time +@treturn string *format* with place-holders plugged with *tm* values +@see strftime(3) +*/ +static int +Pstrftime(lua_State *L) +{ + char tmp[256]; + const char *fmt = luaL_checkstring(L, 1); + struct tm t; + + totm(L, 2, &t); + checknargs(L, 2); + + strftime(tmp, sizeof(tmp), fmt, &t); + return pushstringresult(tmp); +} + + +/*** +Parse a date string. +@function strptime +@string s +@string format same as for `strftime` +@usage posix.strptime('20','%d').monthday == 20 +@treturn[1] PosixTm broken-down local time +@treturn[1] int next index of first character not parsed as part of the date +@return[2] nil +@see strptime(3) +*/ +static int +Pstrptime(lua_State *L) +{ + struct tm t; + const char *s = luaL_checkstring(L, 1); + const char *fmt = luaL_checkstring(L, 2); + char *r; + checknargs(L, 2); + + memset(&t, 0, sizeof(struct tm)); + r = strptime(s, fmt, &t); + if (r) + { + pushtm(L, &t); + lua_pushinteger(L, r - s + 1); + return 2; + } else + return 0; +} + + +/*** +Get current time. +@function time +@see time(2) +@return time in seconds since epoch +*/ +static int +Ptime(lua_State *L) +{ + time_t t = time(NULL); + checknargs(L, 0); + if ((time_t) -1 == t) + return pusherror(L, "time"); + lua_pushinteger(L, t); + return 1; +} + + +static const luaL_Reg posix_time_fns[] = +{ +#if defined _XOPEN_REALTIME && _XOPEN_REALTIME != -1 + LPOSIX_FUNC( Pclock_getres ), + LPOSIX_FUNC( Pclock_gettime ), +#endif + LPOSIX_FUNC( Pgmtime ), + LPOSIX_FUNC( Plocaltime ), + LPOSIX_FUNC( Pmktime ), + LPOSIX_FUNC( Pnanosleep ), + LPOSIX_FUNC( Pstrftime ), + LPOSIX_FUNC( Pstrptime ), + LPOSIX_FUNC( Ptime ), + {NULL, NULL} +}; + + +LUALIB_API int +luaopen_posix_time(lua_State *L) +{ + luaL_register(L, "posix.time", posix_time_fns); + lua_pushliteral(L, "posix.time for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + +#if defined _XOPEN_REALTIME && _XOPEN_REALTIME != -1 + LPOSIX_CONST( CLOCK_MONOTONIC ); + LPOSIX_CONST( CLOCK_PROCESS_CPUTIME_ID ); + LPOSIX_CONST( CLOCK_REALTIME ); + LPOSIX_CONST( CLOCK_THREAD_CPUTIME_ID ); +#endif + + return 1; +} diff --git a/ext/posix/unistd.c b/ext/posix/unistd.c new file mode 100644 index 0000000..9276640 --- /dev/null +++ b/ext/posix/unistd.c @@ -0,0 +1,1157 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Unix Standard APIs. + + Where the underlying system does not support one of these functions, it + will have a `nil` value in the module table. + +@module posix.unistd +*/ + +#include + +#if HAVE_CRYPT_H +# include +#endif +#include +#include +#include + +#include "_helpers.c" + +static uid_t +mygetuid(lua_State *L, int i) +{ + if (lua_isnoneornil(L, i)) + return (uid_t)-1; + else if (lua_isinteger(L, i)) + return (uid_t) lua_tointeger(L, i); + else if (lua_isstring(L, i)) + { + struct passwd *p = getpwnam(lua_tostring(L, i)); + return (p == NULL) ? (uid_t) -1 : p->pw_uid; + } + else + return argtypeerror(L, i, "string, int or nil"); +} + +static gid_t +mygetgid(lua_State *L, int i) +{ + if (lua_isnoneornil(L, i)) + return (gid_t)-1; + else if (lua_isinteger(L, i)) + return (gid_t) lua_tointeger(L, i); + else if (lua_isstring(L, i)) + { + struct group *g = getgrnam(lua_tostring(L, i)); + return (g == NULL) ? (uid_t) -1 : g->gr_gid; + } + else + return argtypeerror(L, i, "string, int or nil"); +} + +/*** +Terminate the calling process. +@function _exit +@int status process exit status +@see _exit(2) +*/ +static int +P_exit(lua_State *L) +{ + pid_t ret = checkint(L, 1); + checknargs(L, 1); + _exit(ret); + return 0; /* Avoid a compiler warning (or possibly cause one + if the compiler's too clever, sigh). */ +} + + +/*** +Check real user's permissions for a file. +@function access +@string path file to act on +@string[opt="f"] mode can contain 'r','w','x' and 'f' +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see access(2) +@usage status, errstr, errno = P.access("/etc/passwd", "rw") +*/ +static int +Paccess(lua_State *L) +{ + int mode=F_OK; + const char *path=luaL_checkstring(L, 1); + const char *s; + checknargs(L, 2); + for (s=optstring(L, 2, "f"); *s!=0 ; s++) + switch (*s) + { + case ' ': break; + case 'r': mode |= R_OK; break; + case 'w': mode |= W_OK; break; + case 'x': mode |= X_OK; break; + case 'f': mode |= F_OK; break; + default: badoption(L, 2, "mode", *s); break; + } + return pushresult(L, access(path, mode), path); +} + + +/*** +Set the working directory. +@function chdir +@string path file to act on +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see chdir(2) +@usage status, errstr, errno = P.chdir("/var/tmp") +*/ +static int +Pchdir(lua_State *L) +{ + const char *path = luaL_checkstring(L, 1); + checknargs(L, 1); + return pushresult(L, chdir(path), path); +} + + +/*** +Change ownership of a file. +@function chown +@string path existing file path +@tparam string|int uid new owner user id +@tparam string|int gid new owner group id +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error messoge +@treturn[2] int errnum +@see chown(2) +@usage +-- will fail for a normal user, and print an error +print(P.chown("/etc/passwd",100,200)) +*/ +static int +Pchown(lua_State *L) +{ + const char *path = luaL_checkstring(L, 1); + uid_t uid = mygetuid(L, 2); + gid_t gid = mygetgid(L, 3); + checknargs(L, 3); + return pushresult(L, chown(path, uid, gid), path); +} + + +/*** +Close an open file descriptor. +@function close +@int fd file descriptor to act on +@treturn[1] int `0` if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see close(2) +@usage +local ok, errmsg = P.close (log) +if not ok then error (errmsg) end +*/ +static int +Pclose(lua_State *L) +{ + int fd = checkint(L, 1); + checknargs(L, 1); + return pushresult(L, close(fd), NULL); +} + + +#if defined HAVE_CRYPT +/*** +Encrypt a password. +Not recommended for general encryption purposes. +@function crypt +@string trypass string to hash +@string salt two-character string from [a-zA-Z0-9./] +@return encrypted string +@see crypt(3) +@usage +local salt, hash = pwent:match ":$6$(.-)$([^:]+)" +if P.crypt (trypass, salt) ~= hash then + error "wrong password" +end +*/ +static int +Pcrypt(lua_State *L) +{ + const char *str, *salt; + char *r; + + str = luaL_checkstring(L, 1); + salt = luaL_checkstring(L, 2); + if (strlen(salt) < 2) + luaL_error(L, "not enough salt"); + checknargs(L, 2); + + r = crypt(str, salt); + return pushstringresult(r); +} +#endif + + +/*** +Duplicate an open file descriptor. +@function dup +@int fd file descriptor to act on +@treturn[1] int new file descriptor duplicating *fd*, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see dup(2) +@usage +local outfd = P.dup (P.fileno (io.stdout)) +*/ +static int +Pdup(lua_State *L) +{ + int fd = checkint(L, 1); + checknargs(L, 1); + return pushresult(L, dup(fd), NULL); +} + + +/*** +Duplicate one open file descriptor to another. +If *newfd* references an open file already, it is closed before being +reallocated to *fd*. +@function dup2 +@int fd an open file descriptor to act on +@int newfd new descriptor to duplicate *fd* +@treturn[1] int new file descriptor, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see dup2(2) +*/ +static int +Pdup2(lua_State *L) +{ + int fd = checkint(L, 1); + int newfd = checkint(L, 2); + checknargs(L, 2); + return pushresult(L, dup2(fd, newfd), NULL); +} + + +static int +runexec(lua_State *L, int use_shell) +{ + char **argv; + const char *path = luaL_checkstring(L, 1); + int i, n; + checknargs(L, 2); + + if (lua_type(L, 2) != LUA_TTABLE) + argtypeerror(L, 2, "table"); + + n = lua_objlen(L, 2); + argv = lua_newuserdata(L, (n + 2) * sizeof(char*)); + + /* Set argv[0], defaulting to command */ + argv[0] = (char*) path; + lua_pushinteger(L, 0); + lua_gettable(L, 2); + if (lua_type(L, -1) == LUA_TSTRING) + argv[0] = (char*)lua_tostring(L, -1); + else + lua_pop(L, 1); + + /* Read argv[1..n] from table. */ + for (i=1; i<=n; i++) + { + lua_pushinteger(L, i); + lua_gettable(L, 2); + argv[i] = (char*)lua_tostring(L, -1); + } + argv[n+1] = NULL; + + (use_shell ? execvp : execv) (path, argv); + return pusherror(L, path); +} + + +/*** +Execute a program without using the shell. +@function exec +@string path +@tparam table argt arguments (table can include index 0) +@return nil +@treturn string error message +@see execve(2) +@usage exec ("/bin/bash", {[0] = "-sh", "--norc}) +*/ +static int +Pexec(lua_State *L) +{ + return runexec(L, 0); +} + + +/*** +Execute a program using the shell. +@function execp +@string path +@tparam table argt arguments (table can include index 0) +@return nil +@treturn string error message +@see execve(2) +*/ +static int +Pexecp(lua_State *L) +{ + return runexec(L, 1); +} + + +#if LPOSIX_2001_COMPLIANT + +#if !HAVE_DECL_FDATASYNC +extern int fdatasync (); +#endif + +/*** +Synchronize a file's in-core state with storage device without metadata. +@function fdatasync +@int fd +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see fdatasync(2) +*/ +static int +Pfdatasync(lua_State *L) +{ + int fd = checkint(L, 1); + checknargs(L, 1); + return pushresult(L, fdatasync(fd), NULL); +} +#endif + + +/*** +Fork this program. +@function fork +@treturn[1] int `0` in the resulting child process +@treturn[2] int process id of child, in the calling process +@return[3] nil +@treturn[3] string error message +@treturn[3] int errnum +@see fork(2) +@see fork.lua +@see fork2.lua +@usage +local pid, errmsg = P.fork () +if pid == nil then + error (errmsg) +elseif pid == 0 then + print ("in child:", P.getpid "pid") +else + print (P.wait (pid)) +end +os.exit () +*/ +static int +Pfork(lua_State *L) +{ + checknargs(L, 0); + return pushresult(L, fork(), NULL); +} + + +/*** +Synchronize a file's in-core state with storage device. +@function fsync +@int fd +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see fsync(2) +@see sync +*/ +static int +Pfsync(lua_State *L) +{ + int fd = checkint(L, 1); + checknargs(L, 1); + return pushresult(L, fsync(fd), NULL); +} + + +/*** +Current working directory for this process. +@function getcwd +@treturn[1] string path of current working directory, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see getcwd(3) +*/ +static int +Pgetcwd(lua_State *L) +{ +#ifdef __GNU__ + char *b = get_current_dir_name(); + checknargs(L, 0); + if (b == NULL) + /* we return the same error as below */ + return pusherror(L, "."); + return pushstringresult(b); +#else + long size = pathconf(".", _PC_PATH_MAX); + void *ud; + lua_Alloc lalloc; + char *b, *r; + checknargs(L, 0); + lalloc = lua_getallocf(L, &ud); + if (size == -1) + size = _POSIX_PATH_MAX; /* FIXME: Retry if this is not long enough */ + if ((b = lalloc(ud, NULL, 0, (size_t)size + 1)) == NULL) + return pusherror(L, "lalloc"); + r = getcwd(b, (size_t)size); + if (r != NULL) + lua_pushstring(L, b); + lalloc(ud, b, (size_t)size + 1, 0); + return (r == NULL) ? pusherror(L, ".") : 1; +#endif +} + + +/*** +Return effective group id of calling process. +@function getegid +@treturn int effective group id of calling process +@see getgid +*/ +static int +Pgetegid(lua_State *L) +{ + checknargs(L, 0); + return pushintresult(getegid ()); +} + + +/*** +Return effective user id of calling process. +@function geteuid +@treturn int effective user id of calling process +@see getuid +*/ +static int +Pgeteuid(lua_State *L) +{ + checknargs(L, 0); + return pushintresult(geteuid ()); +} + + +/*** +Return group id of calling process. +@function getgid +@treturn int group id of calling process +@see getegid +*/ +static int +Pgetgid(lua_State *L) +{ + checknargs(L, 0); + return pushintresult(getgid ()); +} + + +#if LPOSIX_2001_COMPLIANT +/*** +Get list of supplementary group ids. +@function getgroups +@see getgroups(2) +@treturn table group id +*/ +static int +Pgetgroups(lua_State *L) +{ + int n_group_slots = getgroups(0, NULL); + checknargs(L, 0); + + if (n_group_slots < 0) + return pusherror(L, NULL); + else if (n_group_slots == 0) + lua_newtable(L); + else + { + gid_t *group; + int n_groups; + int i; + + group = lua_newuserdata(L, sizeof(*group) * n_group_slots); + + n_groups = getgroups(n_group_slots, group); + if (n_groups < 0) + return pusherror(L, NULL); + + lua_createtable(L, n_groups, 0); + for (i = 0; i < n_groups; i++) + { + lua_pushinteger(L, group[i]); + lua_rawseti(L, -2, i + 1); + } + } + + return 1; +} +#endif + + +/*** +Current logged-in user. +@treturn[1] string username, if successful +@return[2] nil +@see getlogin(3) +*/ +static int +Pgetlogin(lua_State *L) +{ + checknargs(L, 0); + return pushstringresult(getlogin()); +} + + +/*** +Return process group id of calling process. +@function getpgrp +@treturn int process group id of calling process +@see getpid +*/ +static int +Pgetpgrp(lua_State *L) +{ + checknargs(L, 0); + return pushintresult(getpgrp ()); +} + + +/*** +Return process id of calling process. +@function getpid +@treturn int process id of calling process +*/ +static int +Pgetpid(lua_State *L) +{ + checknargs(L, 0); + return pushintresult(getpid ()); +} + + +/*** +Return parent process id of calling process. +@function getppid +@treturn int parent process id of calling process +@see getpid +*/ +static int +Pgetppid(lua_State *L) +{ + checknargs(L, 0); + return pushintresult(getppid ()); +} + + +/*** +Return user id of calling process. +@function getuid +@treturn int user id of calling process +@see geteuid +*/ +static int +Pgetuid(lua_State *L) +{ + checknargs(L, 0); + return pushintresult(getuid ()); +} + + +/*** +Get host id. +@function gethostid +@see gethostid(3) +@treturn[1] int host id +@return[2] nil +@treturn[2] string error message +*/ +static int +Pgethostid(lua_State *L) +{ + checknargs(L, 0); +#if HAVE_GETHOSTID + return pushintresult(gethostid()); +#else + lua_pushnil(L); + lua_pushliteral(L, "unsupported by this host"); + return 2; +#endif +} + + +/*** +Test whether a file descriptor refers to a terminal. +@function isatty +@int fd file descriptor to act on +@treturn[1] int `1` if *fd* is open and refers to a terminal, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see isatty(3) +*/ +static int +Pisatty(lua_State *L) +{ + int fd = checkint(L, 1); + checknargs(L, 1); + return pushresult(L, isatty(fd) == 0 ? -1 : 1, "isatty"); +} + + +/*** +Create a link. +@function link +@string target name +@string link name +@bool[opt=false] soft link +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see link(2) +@see symlink(2) +*/ +static int +Plink(lua_State *L) +{ + const char *oldpath = luaL_checkstring(L, 1); + const char *newpath = luaL_checkstring(L, 2); + int symbolicp = optboolean(L, 3, 0); + checknargs(L, 3); + return pushresult(L, (symbolicp ? symlink : link)(oldpath, newpath), NULL); +} + +/*** +reposition read/write file offset +@function lseek +@see lseek(2) +@int fd open file descriptor to act on +@int offset bytes to seek +@int whence one of `SEEK_SET`, `SEEK_CUR` or `SEEK_END` +@treturn[1] int new offset, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +*/ +static int +Plseek(lua_State *L) +{ + int fd = checkint(L, 1); + int offset = checkint(L, 2); + int whence = checkint(L, 3); + checknargs(L, 3); + return pushresult(L, lseek(fd, offset, whence), NULL); +} + + +/*** +change process priority +@function nice +@int inc adds inc to the nice value for the calling process +@treturn[1] int new nice value, if successful +@return[2] nil +@return[2] string error message +@treturn[2] int errnum +@see nice(2) +*/ +static int +Pnice(lua_State *L) +{ + int inc = checkint(L, 1); + checknargs(L, 1); + return pushresult(L, nice(inc), "nice"); +} + + +/*** +Get a value for a configuration option for a filename. +@function pathconf +@string path optional +@int key one of `_PC_LINK_MAX`, `_PC_MAX_CANON`, `_PC_NAME_MAX`, + `_PC_PIPE_BUF`, `_PC_CHOWN_RESTRICTED`, `_PC_NO_TRUNC` or + `_PC_VDISABLE` +@treturn int associated path configuration value +@see pathconf(3) +@usage for a, b in pairs (P.pathconf "/dev/tty") do print(a, b) end +*/ +static int +Ppathconf(lua_State *L) +{ + const char *path = luaL_checkstring(L, 1); + checknargs(L, 2); + return pushintresult(pathconf(path, checkint(L, 2))); +} + + +/*** +Creates a pipe. +@function pipe +@treturn[1] int read end file descriptor +@treturn[1] int write end file descriptor +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see pipe(2) +@see fork.lua +*/ +static int +Ppipe(lua_State *L) +{ + int pipefd[2]; + int rc; + checknargs(L, 0); + rc = pipe(pipefd); + if (rc < 0) + return pusherror(L, "pipe"); + lua_pushinteger(L, pipefd[0]); + lua_pushinteger(L, pipefd[1]); + return 2; +} + + +/*** +Read bytes from a file. +@function read +@int fd the file descriptor to act on +@int count maximum number of bytes to read +@treturn[1] string string from *fd* with at most *count* bytes, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see read(2) +*/ +static int +Pread(lua_State *L) +{ + int fd = checkint(L, 1); + int count = checkint(L, 2), ret; + void *ud, *buf; + lua_Alloc lalloc; + + checknargs(L, 2); + lalloc = lua_getallocf(L, &ud); + + /* Reset errno in case lalloc doesn't set it */ + errno = 0; + if ((buf = lalloc(ud, NULL, 0, count)) == NULL && count > 0) + return pusherror(L, "lalloc"); + + ret = read(fd, buf, count); + if (ret >= 0) + lua_pushlstring(L, buf, ret); + lalloc(ud, buf, count, 0); + return (ret < 0) ? pusherror(L, NULL) : 1; +} + + +/*** +Read value of a symbolic link. +@function readlink +@string path file to act on +@treturn[1] string link target, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see readlink(2) +*/ +static int +Preadlink(lua_State *L) +{ + char *b; + struct stat s; + const char *path = luaL_checkstring(L, 1); + void *ud; + lua_Alloc lalloc; + ssize_t n; + int err; + checknargs(L, 1); + lalloc = lua_getallocf(L, &ud); + + errno = 0; /* ignore outstanding unreported errors */ + + /* s.st_size is length of linkname, with no trailing \0 */ + if (lstat(path, &s) < 0) + return pusherror(L, path); + + /* diagnose non-symlinks */ + if (!S_ISLNK(s.st_mode)) + { + lua_pushnil(L); + lua_pushfstring(L, "%s: not a symbolic link", path); + lua_pushinteger(L, EINVAL); + return 3; + } + + /* allocate a buffer for linkname, with no trailing \0 */ + if ((b = lalloc(ud, NULL, 0, s.st_size)) == NULL) + return pusherror(L, "lalloc"); + + n = readlink(path, b, s.st_size); + err = errno; /* save readlink error code, if any */ + if (n != -1) + lua_pushlstring(L, b, s.st_size); + lalloc(ud, b, s.st_size, 0); + + /* report new errors from this function */ + if (n < 0) + { + errno = err; /* restore readlink error code */ + return pusherror(L, "readlink"); + } + else if (n < s.st_size) + { + lua_pushnil(L); + lua_pushfstring(L, "%s: readlink wrote only %d of %d bytes", path, n, s.st_size); + return 2; + } + + return 1; +} + + +/*** +Remove a directory. +@function rmdir +@string path file to act on +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see rmdir(2) +*/ +static int +Prmdir(lua_State *L) +{ + const char *path = luaL_checkstring(L, 1); + checknargs(L, 1); + return pushresult(L, rmdir(path), path); +} + + +/*** +Set the uid, euid, gid, egid, sid or pid & gid. +@function setpid +@string what one of 'u', 'U', 'g', 'G', 's', 'p' (upper-case means "effective") +@int id (uid, gid or pid for every value of `what` except 's') +@int[opt] gid (only for `what` value 'p') +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see setuid(2) +@see seteuid(2) +@see setgid(2) +@see setegid(2) +@see setsid(2) +@see setpgid(2) +*/ +static int +Psetpid(lua_State *L) +{ + const char *what=luaL_checkstring(L, 1); + checknargs(L, *what == 'p' ? 3 : 2); + switch (*what) + { + case 'U': + return pushresult(L, seteuid(mygetuid(L, 2)), NULL); + case 'u': + return pushresult(L, setuid(mygetuid(L, 2)), NULL); + case 'G': + return pushresult(L, setegid(mygetgid(L, 2)), NULL); + case 'g': + return pushresult(L, setgid(mygetgid(L, 2)), NULL); + case 's': + return pushresult(L, setsid(), NULL); + case 'p': + { + pid_t pid = checkint(L, 2); + pid_t pgid = checkint(L, 3); + return pushresult(L, setpgid(pid,pgid), NULL); + } + default: + badoption(L, 1, "id", *what); + return 0; + } +} + + +/*** +Sleep for a number of seconds. +@function sleep +@int seconds minimum numebr of seconds to sleep +@treturn[1] int `0` if the requested time has elapsed +@treturn[2] int unslept seconds remaining, if interrupted +@see sleep(3) +@see posix.time.nanosleep +*/ +static int +Psleep(lua_State *L) +{ + unsigned int seconds = checkint(L, 1); + checknargs(L, 1); + return pushintresult(sleep(seconds)); +} + + +/*** +Commit buffer cache to disk. +@function sync +@see fsync +@see sync(2) +*/ +static int +Psync(lua_State *L) +{ + checknargs(L, 0); + sync(); + return 0; +} + + +/*** +Get configuration information at runtime. +@function sysconf +@int key one of `_SC_ARG_MAX`, `_SC_CHILD_MAX`, `_SC_CLK_TCK`, `_SC_JOB_CONTROL`, + `_SC_OPEN_MAX`, `_SC_NGROUPS_MAX`, `_SC_SAVED_IDS`, `_SC_STREAM_MAX`, + `_SC_TZNAME_MAX` or `_SC_VERSION`, +@treturn int associated system configuration value +@see sysconf(3) +*/ +static int +Psysconf(lua_State *L) +{ + checknargs(L, 1); + return pushintresult(sysconf(checkint(L, 1))); +} + + +/*** +Name of a terminal device. +@function ttyname +@see ttyname(3) +@int[opt=0] fd file descriptor to process +@return string name +*/ +static int +Pttyname(lua_State *L) +{ + int fd=optint(L, 1, 0); + checknargs(L, 1); + return pushstringresult(ttyname(fd)); +} + + +/*** +Unlink a file. +@function unlink +@string path +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see unlink(2) +*/ +static int +Punlink(lua_State *L) +{ + const char *path = luaL_checkstring(L, 1); + checknargs(L, 1); + return pushresult(L, unlink(path), path); +} + + +/*** +Write bytes to a file. +@function write +@int fd the file descriptor to act on +@string buf containing bytes to write +@treturn[1] int number of bytes written, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +@see write(2) +*/ +static int +Pwrite(lua_State *L) +{ + int fd = checkint(L, 1); + const char *buf = luaL_checkstring(L, 2); + checknargs(L, 2); + return pushresult(L, write(fd, buf, lua_objlen(L, 2)), NULL); +} + + +static const luaL_Reg posix_unistd_fns[] = +{ + LPOSIX_FUNC( P_exit ), + LPOSIX_FUNC( Paccess ), + LPOSIX_FUNC( Pchdir ), + LPOSIX_FUNC( Pchown ), + LPOSIX_FUNC( Pclose ), +#if defined HAVE_CRYPT + LPOSIX_FUNC( Pcrypt ), +#endif + LPOSIX_FUNC( Pdup ), + LPOSIX_FUNC( Pdup2 ), + LPOSIX_FUNC( Pexec ), + LPOSIX_FUNC( Pexecp ), +#if LPOSIX_2001_COMPLIANT + LPOSIX_FUNC( Pfdatasync ), +#endif + LPOSIX_FUNC( Pfork ), + LPOSIX_FUNC( Pfsync ), + LPOSIX_FUNC( Pgetcwd ), +#if LPOSIX_2001_COMPLIANT + LPOSIX_FUNC( Pgetgroups ), +#endif + LPOSIX_FUNC( Pgetegid ), + LPOSIX_FUNC( Pgeteuid ), + LPOSIX_FUNC( Pgetgid ), + LPOSIX_FUNC( Pgetlogin ), + LPOSIX_FUNC( Pgetpgrp ), + LPOSIX_FUNC( Pgetpid ), + LPOSIX_FUNC( Pgetppid ), + LPOSIX_FUNC( Pgetuid ), + LPOSIX_FUNC( Pgethostid ), + LPOSIX_FUNC( Pisatty ), + LPOSIX_FUNC( Plink ), + LPOSIX_FUNC( Plseek ), + LPOSIX_FUNC( Pnice ), + LPOSIX_FUNC( Ppathconf ), + LPOSIX_FUNC( Ppipe ), + LPOSIX_FUNC( Pread ), + LPOSIX_FUNC( Preadlink ), + LPOSIX_FUNC( Prmdir ), + LPOSIX_FUNC( Psetpid ), + LPOSIX_FUNC( Psleep ), + LPOSIX_FUNC( Psync ), + LPOSIX_FUNC( Psysconf ), + LPOSIX_FUNC( Pttyname ), + LPOSIX_FUNC( Punlink ), + LPOSIX_FUNC( Pwrite ), + {NULL, NULL} +}; + + +/*** +Constants. +@section constants +*/ + +/*** +Standard constants. +Any constants not available in the underlying system will be `nil` valued. +@table posix.unistd +@int _PC_CHOWN_RESTRICTED return 1 if chown requires appropriate privileges, 0 otherwise +@int _PC_LINK_MAX maximum file link count +@int _PC_MAX_CANON maximum bytes in terminal canonical input line +@int _PC_MAX_INPUT maximum number of bytes in a terminal input queue +@int _PC_NAME_MAX maximum number of bytes in a file name +@int _PC_NO_TRUNC return 1 if over-long file names are truncated +@int _PC_PATH_MAXmaximum number of bytes in a pathname +@int _PC_PIPE_BUF maximum number of bytes in an atomic pipe write +@int _PC_VDISABLE terminal character disabling value +@int _SC_ARG_MAX maximum bytes of argument to @{posix.unistd.execp} +@int _SC_CHILD_MAX maximum number of processes per user +@int _SC_CLK_TCK statistics clock frequency +@int _SC_JOB_CONTROL return 1 if system has job control, -1 otherwise +@int _SC_NGROUPS_MAX maximum number of supplemental groups +@int _SC_OPEN_MAX maximum number of open files per user +@int _SC_SAVED_IDS return 1 if system supports saved user and group ids, -1 otherwise +@int _SC_STREAM_MAX maximum number of streams per process +@int _SC_TZNAME_MAX maximum number of timezone types +@int _SC_VERSION POSIX.1 compliance version +@int SEEK_CUR relative file pointer position +@int SEEK_END set file pointer to the end of file +@int SEEK_SET absolute file pointer position +@int STDERR_FILENO standard error file descriptor +@int STDIN_FILENO standard input file descriptor +@int STDOUT_FILENO standard output file descriptor +@usage + -- Print unistd constants supported on this host. + for name, value in pairs (require "posix.unistd") do + if type (value) == "number" then + print (name, value) + end + end +*/ + +LUALIB_API int +luaopen_posix_unistd(lua_State *L) +{ + luaL_register(L, "posix.unistd", posix_unistd_fns); + lua_pushliteral(L, "posix.unistd for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + /* pathconf arguments */ + LPOSIX_CONST( _PC_CHOWN_RESTRICTED ); + LPOSIX_CONST( _PC_LINK_MAX ); + LPOSIX_CONST( _PC_MAX_CANON ); + LPOSIX_CONST( _PC_MAX_INPUT ); + LPOSIX_CONST( _PC_NAME_MAX ); + LPOSIX_CONST( _PC_NO_TRUNC ); + LPOSIX_CONST( _PC_PATH_MAX ); + LPOSIX_CONST( _PC_PIPE_BUF ); + LPOSIX_CONST( _PC_VDISABLE ); + + /* sysconf arguments */ + LPOSIX_CONST( _SC_ARG_MAX ); + LPOSIX_CONST( _SC_CHILD_MAX ); + LPOSIX_CONST( _SC_CLK_TCK ); + LPOSIX_CONST( _SC_JOB_CONTROL ); + LPOSIX_CONST( _SC_OPEN_MAX ); + LPOSIX_CONST( _SC_NGROUPS_MAX ); + LPOSIX_CONST( _SC_SAVED_IDS ); + LPOSIX_CONST( _SC_STREAM_MAX ); + LPOSIX_CONST( _SC_TZNAME_MAX ); + LPOSIX_CONST( _SC_VERSION ); + + /* lseek arguments */ + LPOSIX_CONST( SEEK_CUR ); + LPOSIX_CONST( SEEK_END ); + LPOSIX_CONST( SEEK_SET ); + + /* Miscellaneous */ + LPOSIX_CONST( STDERR_FILENO ); + LPOSIX_CONST( STDIN_FILENO ); + LPOSIX_CONST( STDOUT_FILENO ); + + return 1; +} diff --git a/ext/posix/utime.c b/ext/posix/utime.c new file mode 100644 index 0000000..49c68d0 --- /dev/null +++ b/ext/posix/utime.c @@ -0,0 +1,66 @@ +/* + * POSIX library for Lua 5.1, 5.2 & 5.3. + * (c) Gary V. Vaughan , 2013-2015 + * (c) Reuben Thomas 2010-2013 + * (c) Natanael Copa 2008-2010 + * Clean up and bug fixes by Leo Razoumov 2006-10-11 + * Luiz Henrique de Figueiredo 07 Apr 2006 23:17:49 + * Based on original by Claudio Terra for Lua 3.x. + * With contributions by Roberto Ierusalimschy. + * With documentation from Steve Donovan 2012 + */ +/*** + Set File Times. + +@module posix.utime +*/ + +#include + +#include +#include + +#include "_helpers.c" + + +/*** +Change file last access and modification times. +@function utime +@see utime(2) +@string path existing file path +@int[opt=now] mtime modification time +@int[opt=now] atime access time +@treturn[1] int `0`, if successful +@return[2] nil +@treturn[2] string error message +@treturn[2] int errnum +*/ +static int +Putime(lua_State *L) +{ + struct utimbuf times; + time_t currtime = time(NULL); + const char *path = luaL_checkstring(L, 1); + times.modtime = optint(L, 2, currtime); + times.actime = optint(L, 3, currtime); + checknargs(L, 3); + return pushresult(L, utime(path, ×), path); +} + + +static const luaL_Reg posix_utime_fns[] = +{ + LPOSIX_FUNC( Putime ), + {NULL, NULL} +}; + + +LUALIB_API int +luaopen_posix_utime(lua_State *L) +{ + luaL_register(L, "posix.utime", posix_utime_fns); + lua_pushliteral(L, "posix.utime for " LUA_VERSION " / " PACKAGE_STRING); + lua_setfield(L, -2, "version"); + + return 1; +} diff --git a/lib/curses.lua b/lib/curses.lua new file mode 100644 index 0000000..0167ebb --- /dev/null +++ b/lib/curses.lua @@ -0,0 +1,59 @@ +--- Lua bindings for curses +local curses = require "posix.curses" +local M = curses + +-- These Lua functions detect number of args, like Unified Funcs in Perl Curses +-- see http://pjb.com.au/comp/lua/lcurses.html +-- see http://search.cpan.org/perldoc?Curses + +function M.addch (...) + if #{...} == 3 then + return curses.stdscr():mvaddch(...) + else + return curses.stdscr():addch(...) + end +end + +function M.addstr(...) -- detect number of args, like Unified Funcs in Perl Curses + if #{...} == 3 then + return curses.stdscr():mvaddstr(...) + else + return curses.stdscr():addstr(...) + end +end + +function M.attrset (a) return curses.stdscr():attrset(a) end +function M.clear () return curses.stdscr():clear() end +function M.clrtobot () return curses.stdscr():clrtobot() end +function M.clrtoeol () return curses.stdscr():clrtoeol() end + +function M.getch (...) + local c + if #{...} == 2 then + c = curses.stdscr():mvgetch(...) + else + c = curses.stdscr():getch() + end + if c < 256 then + return string.char(c) + end + -- could kludge-test for utf8, e.g. c3 a9 20 c3 aa 20 c3 ab 20 e2 82 ac 0a + return c +end + +function M.getstr (...) + if #{...} > 1 then + return curses.stdscr():mvgetstr(...) + else + return curses.stdscr():getstr(...) + end +end +M.getnstr = M.getstr + +function M.getyx () return curses.stdscr():getyx() end +function M.keypad (b) return curses.stdscr():keypad(b) end +function M.move (y,x) return curses.stdscr():move(y,x) end +function M.refresh () return curses.stdscr():refresh() end +function M.timeout (t) return curses.stdscr():timeout(t) end + +return M diff --git a/lib/posix.lua.in b/lib/posix.lua.in new file mode 100644 index 0000000..527a639 --- /dev/null +++ b/lib/posix.lua.in @@ -0,0 +1,496 @@ +--[[ + POSIX library for Lua 5.1, 5.2 & 5.3. + (c) Gary V. Vaughan , 2013-2015 + (c) Reuben Thomas 2010-2015 + (c) Natanael Copa 2008-2010 +]] +--[[-- + Lua POSIX bindings. + + In addition to the convenience functions documented in this module, all + APIs from submodules are copied into the return table for convenience and + backwards compatibility. + + @module posix +]] + +local bit = require "bit32" +local M = {} + + +-- For backwards compatibility, copy all table entries into M namespace. +for _, sub in ipairs { + "ctype", "dirent", "errno", "fcntl", "fnmatch", "getopt", "glob", "grp", + "libgen", "poll", "pwd", "sched", "signal", "stdio", "stdlib", "sys.msg", + "sys.resource", "sys.socket", "sys.stat", "sys.statvfs", "sys.time", + "sys.times", "sys.utsname", "sys.wait", "syslog", "termio", "time", + "unistd", "utime" +} do + local t = require ("posix." .. sub) + for k, v in pairs (t) do + if k ~= "version" then + assert(M[k] == nil, "posix namespace clash: " .. sub .. "." .. k) + M[k] = v + end + end +end + + +-- Inject deprecated APIs (overwriting submodules) for backwards compatibility. +for k, v in pairs (require "posix.deprecated") do + M[k] = v +end +for k, v in pairs (require "posix.compat") do + M[k] = v +end + +M.version = "posix for " .. _VERSION .. " / @PACKAGE_STRING@" + + +local argerror, argtypeerror, checkstring, checktable, toomanyargerror = + M.argerror, M.argtypeerror, M.checkstring, M.checktable, M.toomanyargerror + + +-- Code extracted from lua-stdlib with minimal modifications +local list = { + sub = function (l, from, to) + local r = {} + local len = #l + from = from or 1 + to = to or len + if from < 0 then + from = from + len + 1 + end + if to < 0 then + to = to + len + 1 + end + for i = from, to do + table.insert (r, l[i]) + end + return r + end +} +-- end of stdlib code + + + +--- Check permissions like @{posix.unistd.access}, but for euid. +-- Based on the glibc function of the same name. Does not always check +-- for read-only file system, text busy, etc., and does not work with +-- ACLs &c. +-- @function euidaccess +-- @string file file to check +-- @string mode checks to perform (as for access) +-- @return 0 if access allowed; nil otherwise (and errno is set) + +local access, set_errno, stat = M.access, M.set_errno, M.stat +local getegid, geteuid, getgid, getuid = + M.getegid, M.geteuid, M.getgid, M.getuid + +local function euidaccess (file, mode) + local euid, egid = geteuid (), getegid () + + if getuid () == euid and getgid () == egid then + -- If we are not set-uid or set-gid, access does the same. + return access (file, mode) + end + + local stats = stat (file) + if not stats then + return + end + + -- The super-user can read and write any file, and execute any file + -- that anyone can execute. + if euid == 0 and ((not string.match (mode, "x")) or + string.match (stats.st_mode, "x")) then + return 0 + end + + -- Convert to simple list of modes. + mode = string.gsub (mode, "[^rwx]", "") + + if mode == "" then + return 0 -- The file exists. + end + + -- Get the modes we need. + local granted = stats.st_mode:sub (1, 3) + if euid == stats.st_uid then + granted = stats.st_mode:sub (7, 9) + elseif egid == stats.st_gid or set.new (posix.getgroups ()):member (stats.st_gid) then + granted = stats.st_mode:sub (4, 6) + end + granted = string.gsub (granted, "[^rwx]", "") + + if string.gsub ("[^" .. granted .. "]", mode) == "" then + return 0 + end + set_errno (EACCESS) +end + +if _DEBUG ~= false then + M.euidaccess = function (...) + local argt = {...} + checkstring ("euidaccess", 1, argt[1]) + checkstring ("euidaccess", 2, argt[2]) + if #argt > 2 then toomanyargerror ("euidaccess", 2, #argt) end + return euidaccess (...) + end +else + M.euidaccess = euidaccess +end + + +--- Open a pseudo-terminal. +-- Based on the glibc function of the same name. +-- @fixme add support for term and win arguments +-- @treturn[1] int master file descriptor +-- @treturn[1] int slave file descriptor +-- @treturn[1] string slave file name +-- @return[2] nil +-- @treturn[2] string error message + +local bit = require "bit32" +local fcntl = require "posix.fcntl" +local stdlib = require "posix.stdlib" +local unistd = require "posix.unistd" + +local bor = bit.bor +local open, O_RDWR, O_NOCTTY = fcntl.open, fcntl.O_RDWR, fcntl.O_NOCTTY +local grantpt, openpt, ptsname, unlockpt = + stdlib.grantpt, stdlib.openpt, stdlib.ptsname, stdlib.unlockpt +local close = unistd.close + +local function openpty (term, win) + local ok, errmsg, master, slave, slave_name + master, errmsg = openpt (bor (O_RDWR, O_NOCTTY)) + if master then + ok, errmsg = grantpt (master) + if ok then + ok, errmsg = unlockpt (master) + if ok then + slave_name, errmsg = ptsname (master) + if slave_name then + slave, errmsg = open (slave_name, bor (O_RDWR, O_NOCTTY)) + if slave then + return master, slave, slave_name + end + end + end + end + close (master) + end + return nil, errmsg +end + +if _DEBUG ~= false then + M.openpty = function (...) + local argt = {...} + if #argt > 0 then toomanyargerror ("openpty", 0, #argt) end + return openpty (...) + end +else + M.openpty = openpty +end + + +--- Exec a command or Lua function. +-- @function execx +-- @param task, a table of arguments to `P.execp` or a Lua function, which +-- should read from standard input, write to standard output, and return +-- an exit code +-- @param ... positional arguments to the function +-- @treturn nil on error (normally does not return) +-- @treturn string error message + +local unpack = table.unpack or unpack -- 5.3 compatibility + +local errno, execp, _exit = + M.errno, M.execp, M._exit + +function execx (task, ...) + if type (task) == "table" then + execp (unpack (task)) + -- Only get here if there's an error; kill the fork + local _, n = errno () + _exit (n) + else + _exit (task (...) or 0) + end +end + +if _DEBUG ~= false then + M.execx = function (task, ...) + local argt, typetask = {task, ...}, type (task) + if typetask ~= "table" and typetask ~= "function" then + argtypeerror ("execx", 1, "table or function", task) + end + return execx (task, ...) + end +else + M.execx = execx +end + + +--- Run a command or function in a sub-process using `P.execx`. +-- @function spawn +-- @param task, as for `P.execx`. +-- @tparam string ... as for `P.execx` +-- @return values as for `P.wait` + +local unpack = table.unpack or unpack -- 5.3 compatibility + +local fork, wait = + M.fork, M.wait + +local function spawn (task, ...) + local pid, err = fork () + if pid == nil then + return pid, err + elseif pid == 0 then + execx (task, ...) + else + local _, reason, status = wait (pid) + return status, reason -- If wait failed, status is nil & reason is error + end +end + +if _DEBUG ~= false then + M.spawn = function (task, ...) + local argt, typetask = {task, ...}, type (task) + if typetask ~= "table" and typetask ~= "function" then + argtypeerror ("spawn", 1, "table or function", task) + end + return spawn (task, ...) + end +else + M.spawn = spawn +end + + +local close, dup2, fork, pipe, wait, _exit = + M.close, M.dup2, M.fork, M.pipe, M.wait, M._exit +local STDIN_FILENO, STDOUT_FILENO = M.STDIN_FILENO, M.STDOUT_FILENO + +--- Close a pipeline opened with popen or popen_pipeline. +-- @function pclose +-- @tparam table pfd pipeline object +-- @return values as for `P.wait`, for the last (or only) stage of the pipeline + +local function pclose (pfd) + close (pfd.fd) + for i = 1, #pfd.pids - 1 do + wait (pfd.pids[i]) + end + local _, reason, status = wait (pfd.pids[#pfd.pids]) + return reason, status +end + +if _DEBUG ~= false then + M.pclose = function (...) + local argt = {...} + checktable ("pclose", 1, argt[1]) + if #argt > 2 then toomanyargerror ("pclose", 1, #argt) end + return pclose (...) + end +else + M.pclose = pclose +end + + +local function move_fd (from_fd, to_fd) + if from_fd ~= to_fd then + if not dup2 (from_fd, to_fd) then + error "error dup2-ing" + end + close (from_fd) + end +end + +--- Run a commands or Lua function in a sub-process. +-- @function popen +-- @tparam task, as for @{execx} +-- @tparam string mode `"r"` for read or `"w"` for write +-- @func[opt] pipe_fn function returning a paired read and +-- write file descriptor (*default* @{posix.unistd.pipe}) +-- @treturn pfd pipeline object + +local function popen (task, mode, pipe_fn) + local read_fd, write_fd = (pipe_fn or pipe) () + if not read_fd then + error "error opening pipe" + end + local parent_fd, child_fd, in_fd, out_fd + if mode == "r" then + parent_fd, child_fd, in_fd, out_fd = read_fd, write_fd, STDIN_FILENO, STDOUT_FILENO + elseif mode == "w" then + parent_fd, child_fd, in_fd, out_fd = write_fd, read_fd, STDOUT_FILENO, STDIN_FILENO + else + error "invalid mode" + end + local pid = fork () + if pid == nil then + error "error forking" + elseif pid == 0 then -- child process + move_fd (child_fd, out_fd) + close (parent_fd) + _exit (execx (task, child_fd, in_fd, out_fd)) + end -- parent process + close (child_fd) + return {pids = {pid}, fd = parent_fd} +end + +if _DEBUG ~= false then + M.popen = function (task, ...) + local argt, typetask = {task, ...}, type (task) + if typetask ~= "table" and typetask ~= "function" then + argtypeerror ("popen", 1, "table or function", task) + end + checkstring ("popen", 2, argt[2]) + if argt[3] ~= nil and type (argt[3]) ~= "function" then + argtypeerror ("popen", 3, "function or nil", argt[3]) + end + if #argt > 3 then toomanyargerror ("popen", 3, #argt) end + return popen (task, ...) + end +else + M.popen = popen +end + + +--- Perform a series of commands and Lua functions as a pipeline. +-- @function popen_pipeline +-- @tparam table t tasks for @{execx} +-- @tparam string mode `"r"` for read or `"w"` for write +-- @func[opt] pipe_fn function returning a paired read and +-- write file descriptor (*default* @{posix.unistd.pipe}) +-- @treturn pfd pipeline object + +local close, _exit = M.close, M._exit + +local function popen_pipeline (tasks, mode, pipe_fn) + local first, from, to, inc = 1, 2, #tasks, 1 + if mode == "w" then + first, from, to, inc = #tasks, #tasks - 1, 1, -1 + end + local pfd = popen (tasks[first], mode, pipe_fn) + for i = from, to, inc do + local pfd_next = popen (function (fd, in_fd, out_fd) + move_fd (pfd.fd, in_fd) + _exit (execx (tasks[i])) + end, + mode, + pipe_fn) + close (pfd.fd) + pfd.fd = pfd_next.fd + table.insert (pfd.pids, pfd_next.pids[1]) + end + return pfd +end + +if _DEBUG ~= false then + M.popen_pipeline = function (...) + local argt = {...} + checktable ("popen_pipeline", 1, argt[1]) + checkstring ("popen_pipeline", 2, argt[2]) + if argt[3] ~= nil and type (argt[3]) ~= "function" then + argtypeerror ("popen_pipeline", 3, "function or nil", argt[3]) + end + if #argt > 3 then toomanyargerror ("popen_pipeline", 3, #argt) end + return popen_pipeline (...) + end +else + M.popen_pipeline = popen_pipeline +end + + +--- Add one gettimeofday() returned timeval to another. +-- @function timeradd +-- @param x a timeval +-- @param y another timeval +-- @return x + y, adjusted for usec overflow + +local function timeradd (x, y) + local sec, usec = 0, 0 + if x.sec then sec = sec + x.sec end + if y.sec then sec = sec + y.sec end + if x.usec then usec = usec + x.usec end + if y.usec then usec = usec + y.usec end + if usec > 1000000 then + sec = sec + 1 + usec = usec - 1000000 + end + + return { sec = sec, usec = usec } +end + +if _DEBUG ~= false then + M.timeradd = function (...) + local argt = {...} + checktable ("timeradd", 1, argt[1]) + checktable ("timeradd", 2, argt[2]) + if #argt > 2 then toomanyargerror ("timeradd", 2, #argt) end + return timeradd (...) + end +end + + +--- Compare one gettimeofday() returned timeval with another +-- @function timercmp +-- @param x a timeval +-- @param y another timeval +-- @return 0 if x and y are equal, >0 if x is newer, <0 if y is newer + +local function timercmp (x, y) + local x = { sec = x.sec or 0, usec = x.usec or 0 } + local y = { sec = y.sec or 0, usec = y.usec or 0 } + if x.sec ~= y.sec then + return x.sec - y.sec + else + return x.usec - y.usec + end +end + +if _DEBUG ~= false then + M.timercmp = function (...) + local argt = {...} + checktable ("timercmp", 1, argt[1]) + checktable ("timercmp", 2, argt[2]) + if #argt > 2 then toomanyargerror ("timercmp", 2, #argt) end + return timercmp (...) + end +end + + +--- Subtract one gettimeofday() returned timeval from another. +-- @function timersub +-- @param x a timeval +-- @param y another timeval +-- @return x - y, adjusted for usec underflow + +local function timersub (x,y) + local sec, usec = 0, 0 + if x.sec then sec = x.sec end + if y.sec then sec = sec - y.sec end + if x.usec then usec = x.usec end + if y.usec then usec = usec - y.usec end + if usec < 0 then + sec = sec - 1 + usec = usec + 1000000 + end + return { sec = sec, usec = usec } +end + +if _DEBUG ~= false then + M.timersub = function (...) + local argt = {...} + checktable ("timersub", 1, argt[1]) + checktable ("timersub", 2, argt[2]) + if #argt > 2 then toomanyargerror ("timersub", 2, #argt) end + return timersub (...) + end +end + + +return M diff --git a/lib/posix/_argcheck.lua b/lib/posix/_argcheck.lua new file mode 100644 index 0000000..b5ed4ab --- /dev/null +++ b/lib/posix/_argcheck.lua @@ -0,0 +1,117 @@ +--[[ + POSIX library for Lua 5.1, 5.2 & 5.3. + (c) Gary V. Vaughan , 2014-2015 +]] +--[[-- + Private argument checking helpers. + + Undocumented internal helpers for argcheck wrapping. + + @module posix._checkarg +]] + + +local function argerror (name, i, extramsg, level) + level = level or 1 + local s = string.format ("bad argument #%d to '%s'", i, name) + if extramsg ~= nil then + s = s .. " (" .. extramsg .. ")" + end + error (s, level + 1) +end + +local function toomanyargerror (name, expected, got, level) + level = level or 1 + local fmt = "no more than %d argument%s expected, got %d" + argerror (name, expected + 1, + fmt:format (expected, expected == 1 and "" or "s", got), level + 1) +end + +local function argtypeerror (name, i, expect, actual, level) + level = level or 1 + local fmt = "%s expected, got %s" + argerror (name, i, + fmt:format (expect, type (actual):gsub ("nil", "no value")), level + 1) +end + +local function badoption (name, i, what, option, level) + level = level or 1 + local fmt = "invalid %s option '%s'" + argerror (name, i, fmt:format (what, option), level + 1) +end + +local function checkint (name, i, actual, level) + level = level or 1 + if type (actual) ~= "number" then + argtypeerror (name, i, "int", actual, level + 1) + end + return actual +end + +local function checkstring (name, i, actual, level) + level = level or 1 + if type (actual) ~= "string" then + argtypeerror (name, i, "string", actual, level + 1) + end + return actual +end + +local function checkselection (fname, argi, fields, level) + level = level or 1 + local field1, type1 = fields[1], type (fields[1]) + if type1 == "table" and #fields > 1 then + toomanyargerror (fname, argi, #fields + argi - 1, level + 1) + elseif field1 ~= nil and type1 ~= "table" and type1 ~= "string" then + argtypeerror (fname, argi, "table, string or nil", field1, level + 1) + end + for i = 2, #fields do + checkstring (fname, i + argi - 1, fields[i], level + 1) + end +end + +local function checktable (name, i, actual, level) + level = level or 1 + if type (actual) ~= "table" then + argtypeerror (name, i, "table", actual, level + 1) + end + return actual +end + +local function optint (name, i, actual, def, level) + level = level or 1 + if actual ~= nil and type (actual) ~= "number" then + argtypeerror (name, i, "int or nil", actual, level + 1) + end + return actual or def +end + +local function optstring (name, i, actual, def, level) + level = level or 1 + if actual ~= nil and type (actual) ~= "string" then + argtypeerror (name, i, "string or nil", actual, level + 1) + end + return actual or def +end + +local function opttable (name, i, actual, def, level) + level = level or 1 + if actual ~= nil and type (actual) ~= "table" then + argtypeerror (name, i, "table or nil", actual, level + 1) + end + return actual or def +end + + +return { + argerror = argerror, + argtypeerror = argtypeerror, + badoption = badoption, + checkint = checkint, + checkselection = checkselection, + checkstring = checkstring, + checktable = checktable, + optint = optint, + optstring = optstring, + opttable = opttable, + toomanyargerror = toomanyargerror, +} diff --git a/lib/posix/compat.lua b/lib/posix/compat.lua new file mode 100644 index 0000000..2ab8fb7 --- /dev/null +++ b/lib/posix/compat.lua @@ -0,0 +1,447 @@ +--[[ + POSIX library for Lua 5.1, 5.2 & 5.3. + (c) Gary V. Vaughan , 2014-2015 +]] +--[[-- + Legacy Lua POSIX bindings. + + APIs for maintaining compatibility with previous releases. + + @module posix +]] + +local _argcheck = require "posix._argcheck" +local bit = require "bit32" + +local argerror, argtypeerror, badoption = + _argcheck.argerror, _argcheck.argtypeerror, _argcheck.badoption +local band, bnot, bor = bit.band, bit.bnot, bit.bor +local checkint, checkselection, checkstring, checktable = + _argcheck.checkint, _argcheck.checkselection, _argcheck.checkstring, _argcheck.checktable +local optint, optstring, opttable = + _argcheck.optint, _argcheck.optstring, _argcheck.opttable +local toomanyargerror = _argcheck.toomanyargerror + + +local st = require "posix.sys.stat" + +local S_IRUSR, S_IWUSR, S_IXUSR = st.S_IRUSR, st.S_IWUSR, st.S_IXUSR +local S_IRGRP, S_IWGRP, S_IXGRP = st.S_IRGRP, st.S_IWGRP, st.S_IXGRP +local S_IROTH, S_IWOTH, S_IXOTH = st.S_IROTH, st.S_IWOTH, st.S_IXOTH +local S_ISUID, S_ISGID, S_IRWXU, S_IRWXG, S_IRWXO = + st.S_ISUID, st.S_ISGID, st.S_IRWXU, st.S_IRWXG, st.S_IRWXO + +local mode_map = { + { c = "r", b = S_IRUSR }, { c = "w", b = S_IWUSR }, { c = "x", b = S_IXUSR }, + { c = "r", b = S_IRGRP }, { c = "w", b = S_IWGRP }, { c = "x", b = S_IXGRP }, + { c = "r", b = S_IROTH }, { c = "w", b = S_IWOTH }, { c = "x", b = S_IXOTH }, +} + +local function pushmode (mode) + local m = {} + for i = 1, 9 do + if band (mode, mode_map[i].b) ~= 0 then m[i] = mode_map[i].c else m[i] = "-" end + end + if band (mode, S_ISUID) ~= 0 then + if band (mode, S_IXUSR) ~= 0 then m[3] = "s" else m[3] = "S" end + end + if band (mode, S_ISGID) ~= 0 then + if band (mode, S_IXGRP) ~= 0 then m[6] = "s" else m[6] = "S" end + end + return table.concat (m) +end + +local function rwxrwxrwx (modestr) + local mode = 0 + for i = 1, 9 do + if modestr:sub (i, i) == mode_map[i].c then + mode = bor (mode, mode_map[i].b) + elseif modestr:sub (i, i) == "s" then + if i == 3 then + mode = bor (mode, S_ISUID, S_IXUSR) + elseif i == 6 then + mode = bor (mode, S_ISGID, S_IXGRP) + else + return nil -- bad mode + end + end + end + return mode +end + +local function octal_mode (modestr) + local mode = 0 + for i = 1, #modestr do + mode = mode * 8 + tonumber (modestr:sub (i, i)) + end + return mode +end + +local function mode_munch (mode, modestr) + if #modestr == 9 and modestr:match "^[-rswx]+$" then + return rwxrwxrwx (modestr) + elseif modestr:match "^[0-7]+$" then + return octal_mode (modestr) + elseif modestr:match "^[ugoa]+%s*[-+=]%s*[rswx]+,*" then + modestr:gsub ("%s*(%a+)%s*(.)%s*(%a+),*", function (who, op, what) + local bits, bobs = 0, 0 + if who:match "[ua]" then bits = bor (bits, S_ISUID, S_IRWXU) end + if who:match "[ga]" then bits = bor (bits, S_ISGID, S_IRWXG) end + if who:match "[oa]" then bits = bor (bits, S_IRWXO) end + if what:match "r" then bobs = bor (bobs, S_IRUSR, S_IRGRP, S_IROTH) end + if what:match "w" then bobs = bor (bobs, S_IWUSR, S_IWGRP, S_IWOTH) end + if what:match "x" then bobs = bor (bobs, S_IXUSR, S_IXGRP, S_IXOTH) end + if what:match "s" then bobs = bor (bobs, S_ISUID, S_ISGID) end + if op == "+" then + -- mode |= bits & bobs + mode = bor (mode, band (bits, bobs)) + elseif op == "-" then + -- mode &= ~(bits & bobs) + mode = band (mode, bnot (band (bits, bobs))) + elseif op == "=" then + -- mode = (mode & ~bits) | (bits & bobs) + mode = bor (band (mode, bnot (bits)), band (bits, bobs)) + end + end) + return mode + else + return nil, "bad mode" + end +end + +local M = { + argerror = argerror, + argtypeerror = argtypeerror, + badoption = badoption, + checkstring = checkstring, + checktable = checktable, + optstring = optstring, + toomanyargerror = toomanyargerror, +} + + + +--- Change the mode of the path. +-- @function chmod +-- @string path existing file path +-- @string mode one of the following formats: +-- +-- * "rwxrwxrwx" (e.g. "rw-rw-r--") +-- * "ugo+-=rwx" (e.g. "u+w") +-- * +-=rwx" (e.g. "+w") +-- +-- @return[1] int `0`, if successful +-- @return[2] nil +-- @treturn[2] string error message +-- @treturn[2] int errnum +-- @see chmod(2) +-- @usage P.chmod ('bin/dof', '+x') + +local bit = require "bit32" +local st = require "posix.sys.stat" + +local _chmod, stat = st.chmod, st.stat +local RWXALL = bit.bor (st.S_IRWXU, st.S_IRWXG, st.S_IRWXO) + +local function chmod (path, modestr) + local mode = (stat (path) or {}).st_mode + local bits, err = mode_munch (mode or 0, modestr) + if bits == nil then + argerror ("chmod", 2, err, 2) + end + return _chmod (path, band (bits, RWXALL)) +end + +if _DEBUG ~= false then + M.chmod = function (...) + local argt = {...} + checkstring ("chmod", 1, argt[1]) + checkstring ("chmod", 2, argt[2]) + if #argt > 2 then toomanyargerror ("chmod", 2, #argt) end + return chmod (...) + end +else + M.chmod = chmod +end + + +--- Create a file. +-- This function is obsoleted by @{posix.fcntl.open} with `posix.O_CREAT`. +-- @function creat +-- @string path name of file to create +-- @string mode permissions with which to create file +-- @treturn[1] int file descriptor of file at *path*, if successful +-- @return[2] nil +-- @treturn[2] string error message +-- @treturn[2] int errnum +-- @see creat(2) +-- @see posix.chmod +-- @usage +-- fd = P.creat ("data", "rw-r-----") + +local bit = require "bit32" +local fcntl = require "posix.fcntl" +local st = require "posix.sys.stat" + +local band, bor = bit.band, bit.bor +local creat_flags = bor (fcntl.O_CREAT, fcntl.O_WRONLY, fcntl.O_TRUNC) +local RWXALL = bor (st.S_IRWXU, st.S_IRWXG, st.S_IRWXO) + +local open = fcntl.open + +local function creat (path, modestr) + local mode, err = mode_munch (0, modestr) + if mode == nil then + argerror ("creat", 2, err, 2) + end + return open (path, creat_flags, band (mode, RWXALL)) +end + +if _DEBUG ~= false then + M.creat = function (...) + local argt = {...} + checkstring ("creat", 1, argt[1]) + checkstring ("creat", 2, argt[2]) + if #argt > 2 then toomanyargerror ("creat", 2, #argt) end + return creat (...) + end +else + M.creat = creat +end + + +--- Make a directory. +-- @function mkdir +-- @string path location in file system to create directory +-- @treturn[1] int `0`, if successful +-- @return[2] nil +-- @treturn[2] string error message +-- @treturn[2] int errnum + +local bit = require "bit32" +local st = require "posix.sys.stat" + +local _mkdir = st.mkdir +local RWXALL = bit.bor (st.S_IRWXU, st.S_IRWXG, st.S_IRWXO) + +local function mkdir (path) + return _mkdir (path, RWXALL) +end + +if _DEBUG ~= false then + M.mkdir = function (...) + local argt = {...} + checkstring ("mkdir", 1, argt[1]) + if #argt > 1 then toomanyargerror ("mkdir", 1, #argt) end + return mkdir (...) + end +else + M.mkdir = mkdir +end + + +--- Make a FIFO pipe. +-- @function mkfifo +-- @string path location in file system to create fifo +-- @treturn[1] int `0`, if successful +-- @return[2] nil +-- @treturn[2] string error message +-- @treturn[2] int errnum + +local bit = require "bit32" +local st = require "posix.sys.stat" + +local _mkfifo = st.mkfifo +local RWXALL = bit.bor (st.S_IRWXU, st.S_IRWXG, st.S_IRWXO) + +local function mkfifo (path) + return _mkfifo (path, RWXALL) +end + +if _DEBUG ~= false then + M.mkfifo = function (...) + local argt = {...} + checkstring ("mkfifo", 1, argt[1]) + if #argt > 1 then toomanyargerror ("mkfifo", 1, #argt) end + return mkfifo (...) + end +else + M.mkfifo = mkfifo +end + + +--- Get a message queue identifier +-- @function msgget +-- @int key message queue id, or `IPC_PRIVATE` for a new queue +-- @int[opt=0] flags bitwise OR of zero or more from `IPC_CREAT` and `IPC_EXCL` +-- @string[opt="rw-rw-rw-"] mode execute bits are ignored +-- @treturn[1] int message queue identifier, if successful +-- @return[2] nil +-- @treturn[2] string error message +-- @treturn[2] int errnum +-- @see msgget(2) + +local bit = require "bit32" +local msg = require "posix.sys.msg" +local st = require "posix.sys.stat" + +local _msgget = msg.msgget +local band, bor = bit.band, bit.bor +local RWXALL = bor (st.S_IRWXU, st.S_IRWXG, st.S_IRWXO) + +local function msgget (key, msgflg, modestr) + local mode, err = mode_munch (0, modestr) + if mode == nil then + argerror ("open", 3, err, 2) + end + return _msgget (key, bor (msgflg, band (mode, RWXALL))) +end + +if not _msgget then + -- Not supported by underlying system +elseif _DEBUG ~= false then + M.msgget = function (...) + local argt = {...} + checkint ("msgget", 1, argt[1]) + if argt[2] ~= nil and type (argt[2]) ~= "number" then + argtypeerror ("msgget", 2, "int or nil", argt[2]) + end + if argt[3] ~= nil and type (argt[3]) ~= "string" then + argtypeerror ("msgget", 3, "string or nil", argt[3]) + end + if #argt > 3 then toomanyargerror ("msgget", 3, #argt) end + return msgget (...) + end +else + M.msgget = msgget +end + + +--- Open a file. +-- @function open +-- @string path file to act on +-- @int oflags bitwise OR of zero or more of `O_RDONLY`, `O_WRONLY`, `O_RDWR`, +-- `O_APPEND`, `O_CREAT`, `O_DSYNC`, `O_EXCL`, `O_NOCTTY`, `O_NONBLOCK`, +-- `O_RSYNC`, `O_SYNC`, `O_TRUNC` +-- @string modestr (used with `O_CREAT`; see @{chmod} for format) +-- @treturn[1] int file descriptor for *path*, if successful +-- @return[2] nil +-- @treturn[2] string error message +-- @treturn[2] int errnum +-- @see open(2) +-- @usage +-- fd = P.open ("data", bit.bor (P.O_CREAT, P.O_RDWR), "rw-r-----") + +local bit = require "bit32" +local fcntl = require "posix.fcntl" + +local _open, O_CREAT = fcntl.open, fcntl.O_CREAT +local band = bit.band + +local function open (path, oflags, modestr) + local mode + if band (oflags, O_CREAT) ~= 0 then + mode, err = mode_munch (0, modestr) + if mode == nil then + argerror ("open", 3, err, 2) + end + mode = band (mode, RWXALL) + end + return _open (path, oflags, mode) +end + +if _DEBUG ~= false then + M.open = function (...) + local argt, maxt = {...}, 2 + checkstring ("open", 1, argt[1]) + local oflags = checkint ("open", 2, argt[2]) + if band (oflags, O_CREAT) ~= 0 then + checkstring ("open", 3, argt[3]) + maxt = 3 + end + if #argt > maxt then toomanyargerror ("open", maxt, #argt) end + return open (...) + end +else + M.creat = creat +end + + +--- Set log priority mask +-- @function setlogmask +-- @int ... zero or more of `LOG_EMERG`, `LOG_ALERT`, `LOG_CRIT`, +-- `LOG_WARNING`, `LOG_NOTICE`, `LOG_INFO` and `LOG_DEBUG` +-- @treturn[1] int `0`, if successful +-- @return[2] nil +-- @treturn[2] string error message +-- @treturn[2] int errnum + +local bit = require "bit32" +local log = require "posix.syslog" + +local bor = bit.bor +local _setlogmask, LOG_MASK = log.setlogmask, log.LOG_MASK + +local function setlogmask (...) + local mask = 0 + for _, v in ipairs {...} do + mask = bor (mask, LOG_MASK (v)) + end + return _setlogmask (mask) +end + +if _DEBUG ~= false then + M.setlogmask = function (...) + for i, v in ipairs {...} do + optint ("setlogmask", i, v, 0) -- for "int or nil" error + end + return setlogmask (...) + end +else + M.setlogmask = setlogmask +end + + +--- Set file mode creation mask. +-- @function umask +-- @string[opt] mode file creation mask string +-- @treturn string previous umask +-- @see umask(2) +-- @see posix.sys.stat.umask + +local st = require "posix.sys.stat" + +local _umask, RWXALL = st.umask, bor (st.S_IRWXU, st.S_IRWXG, st.S_IRWXO) + +local function umask (modestr) + modestr = modestr or "" + local mode = _umask (0) + _umask (mode) + mode = band (bnot (mode), RWXALL) + if #modestr > 0 then + local bits, err = mode_munch (mode, modestr) + if bits == nil then + argerror ("umask", 1, err, 2) + end + mode = band (bits, RWXALL) + _umask (bnot (mode)) + end + return pushmode (mode) +end + + +if _DEBUG ~= false then + M.umask = function (modestr, ...) + local argt = {modestr, ...} + optstring ("umask", 1, modestr, "") + if #argt > 1 then + toomanyargerror ("umask", 1, #argt) + end + return umask (modestr) + end +else + M.umask = umask +end + + +return M diff --git a/lib/posix/deprecated.lua b/lib/posix/deprecated.lua new file mode 100644 index 0000000..3e6e023 --- /dev/null +++ b/lib/posix/deprecated.lua @@ -0,0 +1,1194 @@ +--[[ + POSIX library for Lua 5.1, 5.2 & 5.3. + (c) Gary V. Vaughan , 2014-2015 +]] +--[[-- + Legacy Lua POSIX bindings. + + Undocumented Legacy APIs for compatibility with previous releases. + + @module posix.deprecated +]] + +local _argcheck = require "posix._argcheck" +local bit = require "bit32" + +-- Lua 5.3 has table.unpack but not _G.unpack +-- Lua 5.2 has table.unpack and _G.unpack +-- Lua 5.1 has _G.unpack but not table.unpack +local unpack = table.unpack or unpack + +local argerror, argtypeerror, badoption = + _argcheck.argerror, _argcheck.argtypeerror, _argcheck.badoption +local band, bnot, bor = bit.band, bit.bnot, bit.bor +local checkint, checkselection, checkstring, checktable = + _argcheck.checkint, _argcheck.checkselection, _argcheck.checkstring, _argcheck.checktable +local optint, optstring, opttable = + _argcheck.optint, _argcheck.optstring, _argcheck.opttable +local toomanyargerror = _argcheck.toomanyargerror + + +-- Convert a legacy API tm table to a posix.time.PosixTm compatible table. +local function PosixTm (legacytm) + return { + tm_sec = legacytm.sec, + tm_min = legacytm.min, + tm_hour = legacytm.hour, + -- For compatibility with Lua os.date() use "day" if "monthday" is + -- not set. + tm_mday = legacytm.monthday or legacytm.day, + tm_mon = legacytm.month - 1, + tm_year = legacytm.year - 1900, + tm_wday = legacytm.weekday, + tm_yday = legacytm.yearday, + tm_isdst = legacytm.is_dst and 1 or 0, + } +end + +-- Convert a posix.time.PosixTm into a legacy API tm table. +local function LegacyTm (posixtm) + return { + sec = posixtm.tm_sec, + min = posixtm.tm_min, + hour = posixtm.tm_hour, + monthday = posixtm.tm_mday, + day = posixtm.tm_mday, + month = posixtm.tm_mon + 1, + year = posixtm.tm_year + 1900, + weekday = posixtm.tm_wday, + yearday = posixtm.tm_yday, + is_dst = posixtm.tm_isdst ~= 0, + } +end + + +local function doselection (name, argoffset, fields, map) + if #fields == 1 and type (fields[1]) == "table" then fields = fields[1] end + + if not (next (fields)) then + return map + else + local r = {} + for i, v in ipairs (fields) do + if map[v] then + r[#r + 1] = map[v] + else + argerror (name, i + argoffset, "invalid option '" .. v .. "'", 2) + end + end + return unpack (r) + end +end + + +local st = require "posix.sys.stat" + +local S_IRUSR, S_IWUSR, S_IXUSR = st.S_IRUSR, st.S_IWUSR, st.S_IXUSR +local S_IRGRP, S_IWGRP, S_IXGRP = st.S_IRGRP, st.S_IWGRP, st.S_IXGRP +local S_IROTH, S_IWOTH, S_IXOTH = st.S_IROTH, st.S_IWOTH, st.S_IXOTH +local S_ISUID, S_ISGID, S_IRWXU, S_IRWXG, S_IRWXO = + st.S_ISUID, st.S_ISGID, st.S_IRWXU, st.S_IRWXG, st.S_IRWXO + +local mode_map = { + { c = "r", b = S_IRUSR }, { c = "w", b = S_IWUSR }, { c = "x", b = S_IXUSR }, + { c = "r", b = S_IRGRP }, { c = "w", b = S_IWGRP }, { c = "x", b = S_IXGRP }, + { c = "r", b = S_IROTH }, { c = "w", b = S_IWOTH }, { c = "x", b = S_IXOTH }, +} + +local function pushmode (mode) + local m = {} + for i = 1, 9 do + if band (mode, mode_map[i].b) ~= 0 then m[i] = mode_map[i].c else m[i] = "-" end + end + if band (mode, S_ISUID) ~= 0 then + if band (mode, S_IXUSR) ~= 0 then m[3] = "s" else m[3] = "S" end + end + if band (mode, S_ISGID) ~= 0 then + if band (mode, S_IXGRP) ~= 0 then m[6] = "s" else m[6] = "S" end + end + return table.concat (m) +end + + +local M = {} + + +--- Bind an address to a socket. +-- @function bind +-- @int fd socket descriptor to act on +-- @tparam PosixSockaddr addr socket address +-- @treturn[1] bool `true`, if successful +-- @return[2] nil +-- @treturn[2] string error messag +-- @treturn[2] int errnum +-- @see bind(2) + +local sock = require "posix.sys.socket" + +local bind = sock.bind + +function M.bind (...) + local rt = { bind (...) } + if rt[1] == 0 then return true end + return unpack (rt) +end + + +--- Find the precision of a clock. +-- @function clock_getres +-- @string[opt="realtime"] name name of clock, one of "monotonic", +-- "process\_cputime\_id", "realtime", or "thread\_cputime\_id" +-- @treturn[1] int seconds +-- @treturn[21 int nanoseconds, if successful +-- @return[2] nil +-- @treturn[2] string error message +-- @treturn[2] int errnum +-- @see clock_getres(3) + +local tm = require "posix.time" + +local _clock_getres = tm.clock_getres + +local function get_clk_id_const (name) + local map = { + monotonic = tm.CLOCK_MONOTONIC, + process_cputime_id = tm.CLOCK_PROCESS_TIME_ID, + thread_cputime_id = tm.CLOCK_THREAD_CPUTIME_ID, + } + return map[name] or tm.CLOCK_REALTIME +end + +local function clock_getres (name) + local ts = _clock_getres (get_clk_id_const (name)) + return ts.tv_sec, ts.tv_nsec +end + +if _clock_getres == nil then + -- Not supported by underlying system +elseif _DEBUG ~= false then + M.clock_getres = function (...) + local argt = {...} + optstring ("clock_getres", 1, argt[1], "realtime") + if #argt > 1 then toomanyargerror ("clock_getres", 1, #argt) end + return clock_getres (...) + end +else + M.clock_getres = clock_getres +end + + +--- Read a clock +-- @function clock_gettime +-- @string[opt="realtime"] name name of clock, one of "monotonic", +-- "process\_cputime\_id", "realtime", or "thread\_cputime\_id" +-- @treturn[1] int seconds +-- @treturn[21 int nanoseconds, if successful +-- @return[2] nil +-- @treturn[2] string error message +-- @treturn[2] int errnum +-- @see clock_gettime(3) + +local tm = require "posix.time" + +local _clock_gettime = tm.clock_gettime + +local function clock_gettime (name) + local ts = _clock_gettime (get_clk_id_const (name)) + return ts.tv_sec, ts.tv_nsec +end + +if _clock_gettime == nil then + -- Not supported by underlying system +elseif _DEBUG ~= false then + M.clock_gettime = function (...) + local argt = {...} + optstring ("clock_gettime", 1, argt[1], "realtime") + if #argt > 1 then toomanyargerror ("clock_gettime", 1, #argt) end + return clock_gettime (...) + end +else + M.clock_gettime = clock_gettime +end + + +--- Initiate a connection on a socket. +-- @function connect +-- @int fd socket descriptor to act on +-- @tparam PosixSockaddr addr socket address +-- @treturn[1] bool `true`, if successful +-- @return[2] nil +-- @treturn[2] string error message +-- @treturn[2] int errnum +-- @see connect(2) + +local sock = require "posix.sys.socket" + +local connect = sock.connect + +function M.connect (...) + local rt = { connect (...) } + if rt[1] == 0 then return true end + return unpack (rt) +end + + +--- Execute a program without using the shell. +-- @function exec +-- @string path +-- @tparam[opt] table|strings ... table or tuple of arguments (table can include index 0) +-- @return nil +-- @treturn string error message +-- @see execve(2) + +local unistd = require "posix.unistd" + +local _exec = unistd.exec + +local function exec (path, ...) + local argt = {...} + if #argt == 1 and type (argt[1]) == "table" then + argt = argt[1] + end + return _exec (path, argt) +end + +if _DEBUG ~= false then + M.exec = function (...) + local argt = {...} + checkstring ("exec", 1, argt[1]) + if type (argt[2]) ~= "table" and type (argt[2]) ~= "string" and type (argt[2]) ~= "nil" then + argtypeerror ("exec", 2, "string, table or nil", argt[2]) + end + if #argt > 2 then + if type (argt[2]) == "table" then + toomanyargerror ("exec", 2, #argt) + else + for i = 3, #argt do + checkstring ("exec", i, argt[i]) + end + end + end + return exec (...) + end +else + M.exec = exec +end + + +--- Execute a program with the shell. +-- @function execp +-- @string path +-- @tparam[opt] table|strings ... table or tuple of arguments (table can include index 0) +-- @return nil +-- @treturn string error message +-- @see execve(2) + +local unistd = require "posix.unistd" + +local _execp = unistd.execp + +local function execp (path, ...) + local argt = {...} + if #argt == 1 and type (argt[1]) == "table" then + argt = argt[1] + end + return _execp (path, argt) +end + +if _DEBUG ~= false then + M.execp = function (...) + local argt = {...} + checkstring ("execp", 1, argt[1]) + if type (argt[2]) ~= "table" and type (argt[2]) ~= "string" and type (argt[2]) ~= "nil" then + argtypeerror ("execp", 2, "string, table or nil", argt[2]) + end + if #argt > 2 then + if type (argt[2]) == "table" then + toomanyargerror ("execp", 2, #argt) + else + for i = 3, #argt do + checkstring ("execp", i, argt[i]) + end + end + end + return execp (...) + end +else + M.execp = execp +end + + +--- Instruct kernel on appropriate cache behaviour for a file or file segment. +-- @function fadvise +-- @tparam file fh Lua file object +-- @int offset start of region +-- @int len number of bytes in region +-- @int advice one of `POSIX_FADV_NORMAL, `POSIX_FADV_SEQUENTIAL, +-- `POSIX_FADV_RANDOM`, `POSIX_FADV_\NOREUSE`, `POSIX_FADV_WILLNEED` or +-- `POSIX_FADV_DONTNEED` +-- @treturn[1] int `0`, if successful +-- @return[2] nil +-- @treturn[2] string error message +-- @treturn[2] int errnum +-- @see posix_fadvise(2) + +local fc = require "posix.fcntl" +local stdio = require "posix.stdio" + +local posix_fadvise = fc.posix_fadvise +local fileno = stdio.fileno + +local function fadvise (fh, ...) + return posix_fadvise (fileno (fh), ...) +end + +if posix_fadvise == nil then + -- Not supported by underlying system +elseif _DEBUG ~= false then + M.fadvise = function (...) + argt = {...} + if io.type (argt[1]) ~= "file" then + argtypeerror ("fadvise", 1, "FILE*", argt[1]) + end + checkint ("fadvise", 2, argt[2]) + checkint ("fadvise", 3, argt[3]) + checkint ("fadvise", 4, argt[4]) + if #argt > 4 then toomanyargerror ("fadvise", 4, #argt) end + return fadvise (...) + end +else + M.fadvise = fadvise +end + + +--- Match a filename against a shell pattern. +-- @function fnmatch +-- @string pat shell pattern +-- @string name filename +-- @return true or false +-- @raise error if fnmatch failed +-- @see posix.fnmatch.fnmatch + +local fnm = require "posix.fnmatch" + +function M.fnmatch (...) + local r = fnm.fnmatch (...) + if r == 0 then + return true + elseif r == fnm.FNM_NOMATCH then + return false + end + error "fnmatch failed" +end + + +--- Group information. +-- @table group +-- @string name name of group +-- @int gid unique group id +-- @string ... list of group members + + +--- Information about a group. +-- @function getgroup +-- @tparam[opt=current group] int|string group id or group name +-- @treturn group group information +-- @usage +-- print (P.getgroup (P.getgid ()).name) + +local grp = require "posix.grp" +local unistd = require "posix.unistd" + +local getgrgid, getgrnam = grp.getgrgid, grp.getgrnam +local getegid = unistd.getegid + +local function getgroup (grp) + if grp == nil then grp = getegid () end + + local g + if type (grp) == "number" then + g = getgrgid (grp) + elseif type (grp) == "string" then + g = getgrnam (grp) + else + argtypeerror ("getgroup", 1, "string, int or nil", grp) + end + + if g ~= nil then + return {name=g.gr_name, gid=g.gr_gid, mem=g.gr_mem} + end +end + +if _DEBUG ~= false then + M.getgroup = function (...) + local argt = {...} + if #argt > 1 then toomanyargerror ("getgroup", 1, #argt) end + return getgroup (...) + end +else + M.getgroup = getgroup +end + + +--- Get the password entry for a user. +-- @function getpasswd +-- @tparam[opt=current user] int|string user name or id +-- @string ... field names, each one of "uid", "name", "gid", "passwd", +-- "dir" or "shell" +-- @return ... values, or a table of all fields if *user* is `nil` +-- @usage for a,b in pairs (P.getpasswd "root") do print (a, b) end +-- @usage print (P.getpasswd ("root", "shell")) + +local pwd = require "posix.pwd" +local unistd = require "posix.unistd" + +local getpwnam, getpwuid = pwd.getpwnam, pwd.getpwuid +local geteuid = unistd.geteuid + +local function getpasswd (user, ...) + if user == nil then user = geteuid () end + + local p + if type (user) == "number" then + p = getpwuid (user) + elseif type (user) == "string" then + p = getpwnam (user) + else + argtypeerror ("getpasswd", 1, "string, int or nil", user) + end + + if p ~= nil then + return doselection ("getpasswd", 1, {...}, { + dir = p.pw_dir, + gid = p.pw_gid, + name = p.pw_name, + passwd = p.pw_passwd, + shell = p.pw_shell, + uid = p.pw_uid, + }) + end +end + +if _DEBUG ~= false then + M.getpasswd = function (user, ...) + checkselection ("getpasswd", 2, {...}, 2) + return getpasswd (user, ...) + end +else + M.getpasswd = getpasswd +end + + +--- Get process identifiers. +-- @function getpid +-- @tparam[opt] table|string type one of "egid", "euid", "gid", "uid", +-- "pgrp", "pid" or "ppid"; or a single list of the same +-- @string[opt] ... unless *type* was a table, zero or more additional +-- type strings +-- @return ... values, or a table of all fields if no option given +-- @usage for a,b in pairs (P.getpid ()) do print (a, b) end +-- @usage print (P.getpid ("uid", "euid")) + +local unistd = require "posix.unistd" + +local getegid, geteuid, getgid, getuid = + unistd.getegid, unistd.geteuid, unistd.getgid, unistd.getuid +local _getpid, getpgrp, getppid = + unistd.getpid, unistd.getpgrp, unistd.getppid + +local function getpid (...) + return doselection ("getpid", 0, {...}, { + egid = getegid (), + euid = geteuid (), + gid = getgid (), + uid = getuid (), + pgrp = getpgrp (), + pid = _getpid (), + ppid = getppid (), + }) +end + +if _DEBUG ~= false then + M.getpid = function (...) + checkselection ("getpid", 1, {...}, 2) + return getpid (...) + end +else + M.getpid = getpid +end + + +--- Get resource limits for this process. +-- @function getrlimit +-- @string resource one of "core", "cpu", "data", "fsize", "nofile", +-- "stack" or "as" +-- @treturn[1] int soft limit +-- @treturn[1] int hard limit, if successful +-- @return[2] nil +-- @treturn[2] string error message +-- @treturn[2] int errnum + +local resource = require "posix.sys.resource" + +local _getrlimit = resource.getrlimit + +local rlimit_map = { + core = resource.RLIMIT_CORE, + cpu = resource.RLIMIT_CPU, + data = resource.RLIMIT_DATA, + fsize = resource.RLIMIT_FSIZE, + nofile = resource.RLIMIT_NOFILE, + stack = resource.RLIMIT_STACK, + as = resource.RLIMIT_AS, +} + +local function getrlimit (rcstr) + local rc = rlimit_map[string.lower (rcstr)] + if rc == nil then + argerror("getrlimit", 1, "invalid option '" .. rcstr .. "'") + end + local rlim = _getrlimit (rc) + return rlim.rlim_cur, rlim.rlim_max +end + +if _DEBUG ~= false then + M.getrlimit = function (...) + local argt = {...} + checkstring ("getrlimit", 1, argt[1]) + if #argt > 1 then toomanyargerror ("getrlimit", 1, #argt) end + return getrlimit (...) + end +else + M.getrlimit = getrlimit +end + + +--- Get time of day. +-- @function gettimeofday +-- @treturn timeval time elapsed since *epoch* +-- @see gettimeofday(2) + +local systime = require "posix.sys.time" + +local gettimeofday = systime.gettimeofday + +function M.gettimeofday (...) + local tv = gettimeofday (...) + return { sec = tv.tv_sec, usec = tv.tv_usec } +end + + +--- Convert epoch time value to a broken-down UTC time. +-- Here, broken-down time tables the month field is 1-based not +-- 0-based, and the year field is the full year, not years since +-- 1900. +-- @function gmtime +-- @int[opt=now] t seconds since epoch +-- @treturn table broken-down time + +local tm = require "posix.time" + +local _gmtime, time = tm.gmtime, tm.time + +local function gmtime (epoch) + return LegacyTm (_gmtime (epoch or time ())) +end + +if _DEBUG ~= false then + M.gmtime = function (...) + local argt = {...} + optint ("gmtime", 1, argt[1]) + if #argt > 1 then toomanyargerror ("gmtime", 1, #argt) end + return gmtime (...) + end +else + M.gmtime = gmtime +end + + +--- Get host id. +-- @function hostid +-- @treturn int unique host identifier + +local unistd = require "posix.unistd" + +M.hostid = unistd.gethostid + + +--- Check for any printable character except space. +-- @function isgraph +-- @see isgraph(3) +-- @string character to act on +-- @treturn bool non-`false` if character is in the class + +local ctype = require "posix.ctype" + +local isgraph = ctype.isgraph + +function M.isgraph (...) + return isgraph (...) ~= 0 +end + + +--- Check for any printable character including space. +-- @function isprint +-- @string character to act on +-- @treturn bool non-`false` if character is in the class +-- @see isprint(3) + +local ctype = require "posix.ctype" + +local isprint = ctype.isprint + +function M.isprint (...) + return isprint (...) ~= 0 +end + + +--- Convert epoch time value to a broken-down local time. +-- Here, broken-down time tables the month field is 1-based not +-- 0-based, and the year field is the full year, not years since +-- 1900. +-- @function localtime +-- @int[opt=now] t seconds since epoch +-- @treturn table broken-down time + +local tm = require "posix.time" + +local _localtime, time = tm.localtime, tm.time + +local function localtime (epoch) + return LegacyTm (_localtime (epoch or time ())) +end + +if _DEBUG ~= false then + M.localtime = function (...) + local argt = {...} + optint ("localtime", 1, argt[1]) + if #argt > 1 then toomanyargerror ("localtime", 1, #argt) end + return localtime (...) + end +else + M.localtime = localtime +end + + +--- Convert a broken-down localtime table into an epoch time. +-- @function mktime +-- @tparam tm broken-down localtime table +-- @treturn in seconds since epoch +-- @see mktime(3) +-- @see localtime + +local tm = require "posix.time" + +local _mktime, localtime, time = tm.mktime, tm.localtime, tm.time + +local function mktime (legacytm) + local posixtm = legacytm and PosixTm (legacytm) or localtime (time ()) + return _mktime (posixtm) +end + +if _DEBUG ~= false then + M.mktime = function (...) + local argt = {...} + opttable ("mktime", 1, argt[1]) + if #argt > 1 then toomanyargerror ("mktime", 1, #argt) end + return mktime (...) + end +else + M.mktime = mktime +end + + +--- Sleep with nanosecond precision. +-- @function nanosleep +-- @int seconds requested sleep time +-- @int nanoseconds requested sleep time +-- @treturn[1] int `0` if requested time has elapsed +-- @return[2] nil +-- @treturn[2] string error message +-- @treturn[2] int errnum +-- @treturn[2] int unslept seconds remaining, if interrupted +-- @treturn[2] int unslept nanoseconds remaining, if interrupted +-- @see nanosleep(2) +-- @see posix.unistd.sleep + +local tm = require "posix.time" + +local _nanosleep = tm.nanosleep + +local function nanosleep (sec, nsec) + local r, errmsg, errno, timespec = _nanosleep {tv_sec = sec, tv_nsec = nsec} + if r == 0 then return 0 end + return r, errmsg, errno, timespec.tv_sec, timespec.tv_nsec +end + +if _DEBUG ~= false then + M.nanosleep = function (...) + local argt = {...} + checkint ("nanosleep", 1, argt[1]) + checkint ("nanosleep", 2, argt[2]) + if #argt > 2 then toomanyargerror ("nanosleep", 2, #argt) end + return nanosleep (...) + end +else + M.nanosleep = nanosleep +end + + +--- Open the system logger. +-- @function openlog +-- @string ident all messages will start with this +-- @string[opt] option any combination of 'c' (directly to system console +-- if an error sending), 'n' (no delay) and 'p' (show PID) +-- @int [opt=`LOG_USER`] facility one of `LOG_AUTH`, `LOG_AUTHORITY`, +-- `LOG_CRON`, `LOG_DAEMON`, `LOG_FTP`, `LOG_KERN`, `LOG_LPR`, `LOG_MAIL`, +-- `LOG_NEWS`, `LOG_SECURITY`, `LOG_SYSLOG`, `LOG_USER`, `LOG_UUCP` or +-- `LOG_LOCAL0` through `LOG_LOCAL7` +-- @see syslog(3) + +local bit = require "bit32" +local log = require "posix.syslog" + +local bor = bit.bor +local _openlog = log.openlog + +local optionmap = { + [' '] = 0, + c = log.LOG_CONS, + n = log.LOG_NDELAY, + p = log.LOG_PID, +} + +local function openlog (ident, optstr, facility) + local option = 0 + if optstr then + for i = 1, #optstr do + local c = optstr:sub (i, i) + if optionmap[c] == nil then + badoption ("openlog", 2, "openlog", c) + end + option = bor (option, optionmap[c]) + end + end + return _openlog (ident, option, facility) +end + +if _DEBUG ~= false then + M.openlog = function (...) + local argt = {...} + checkstring ("openlog", 1, argt[1]) + optstring ("openlog", 2, argt[2]) + optint ("openlog", 3, argt[3]) + if #argt > 3 then toomanyargerror ("openlog", 3, #argt) end + return openlog (...) + end +else + M.openlog = openlog +end + + +--- Get configuration information at runtime. +-- @function pathconf +-- @string[opt="."] path file to act on +-- @tparam[opt] table|string key one of "CHOWN_RESTRICTED", "LINK_MAX", +-- "MAX_CANON", "MAX_INPUT", "NAME_MAX", "NO_TRUNC", "PATH_MAX", "PIPE_BUF" +-- or "VDISABLE" +-- @string[opt] ... unless *type* was a table, zero or more additional +-- type strings +-- @return ... values, or a table of all fields if no option given +-- @see sysconf(2) +-- @usage for a,b in pairs (P.pathconf "/dev/tty") do print (a, b) end + +local unistd = require "posix.unistd" + +local _pathconf = unistd.pathconf + +local Spathconf = { CHOWN_RESTRICTED = 1, LINK_MAX = 1, MAX_CANON = 1, + MAX_INPUT = 1, NAME_MAX = 1, NO_TRUNC = 1, PATH_MAX = 1, PIPE_BUF = 1, + VDISABLE = 1 } + +local function pathconf (path, ...) + local argt, map = {...}, {} + if path ~= nil and Spathconf[path] ~= nil then + path, argt = ".", {path, ...} + end + for k in pairs (Spathconf) do + map[k] = _pathconf (path or ".", unistd["_PC_" .. k]) + end + return doselection ("pathconf", 1, {...}, map) +end + +if _DEBUG ~= false then + M.pathconf = function (path, ...) + if path ~= nil and Spathconf[path] ~= nil then + checkselection ("pathconf", 1, {path, ...}, 2) + else + optstring ("pathconf", 1, path, ".", 2) + checkselection ("pathconf", 2, {...}, 2) + end + return pathconf (path, ...) + end +else + M.pathconf = pathconf +end + + +--- Set resource limits for this process. +-- @function setrlimit +-- @string resource one of "core", "cpu", "data", "fsize", "nofile", +-- "stack" or "as" +-- @int[opt] softlimit process may receive a signal when reached +-- @int[opt] hardlimit process may be terminated when reached +-- @treturn[1] int `0`, if successful +-- @return[2] nil +-- @treturn[2] string error message +-- @treturn[2] int errnum + +local resource = require "posix.sys.resource" + +local _setrlimit = resource.setrlimit + +local rlimit_map = { + core = resource.RLIMIT_CORE, + cpu = resource.RLIMIT_CPU, + data = resource.RLIMIT_DATA, + fsize = resource.RLIMIT_FSIZE, + nofile = resource.RLIMIT_NOFILE, + stack = resource.RLIMIT_STACK, + as = resource.RLIMIT_AS, +} + +local function setrlimit (rcstr, cur, max) + local rc = rlimit_map[string.lower (rcstr)] + if rc == nil then + argerror("setrlimit", 1, "invalid option '" .. rcstr .. "'") + end + local lim + if cur == nil or max == nil then + lim= _getrlimit (rc) + end + return _setrlimit (rc, { + rlim_cur = cur or lim.rlim_cur, + rlim_max = max or lim.rlim_max, + }) +end + +if _DEBUG ~= false then + M.setrlimit = function (...) + local argt = {...} + checkstring ("setrlimit", 1, argt[1]) + optint ("setrlimit", 2, argt[2]) + optint ("setrlimit", 3, argt[3]) + if #argt > 3 then toomanyargerror ("setrlimit", 3, #argt) end + return setrlimit (...) + end +else + M.getrlimit = getrlimit +end + + +--- Information about an existing file path. +-- If the file is a symbolic link, return information about the link +-- itself. +-- @function stat +-- @string path file to act on +-- @tparam[opt] table|string field one of "dev", "ino", "mode", "nlink", +-- "uid", "gid", "rdev", "size", "atime", "mtime", "ctime" or "type" +-- @string[opt] ... unless *field* was a table, zero or more additional +-- field names +-- @return values, or table of all fields if no option given +-- @see stat(2) +-- @usage for a,b in pairs (P,stat "/etc/") do print (a, b) end + +local st = require "posix.sys.stat" + +local S_ISREG, S_ISLNK, S_ISDIR, S_ISCHR, S_ISBLK, S_ISFIFO, S_ISSOCK = + st.S_ISREG, st.S_ISLNK, st.S_ISDIR, st.S_ISCHR, st.S_ISBLK, st.S_ISFIFO, st.S_ISSOCK + +local function filetype (mode) + if S_ISREG (mode) ~= 0 then + return "regular" + elseif S_ISLNK (mode) ~= 0 then + return "link" + elseif S_ISDIR (mode) ~= 0 then + return "directory" + elseif S_ISCHR (mode) ~= 0 then + return "character device" + elseif S_ISBLK (mode) ~= 0 then + return "block device" + elseif S_ISFIFO (mode) ~= 0 then + return "fifo" + elseif S_ISSOCK (mode) ~= 0 then + return "socket" + else + return "?" + end +end + + +local _stat = st.lstat -- for bugwards compatibility with v<=32 + +local function stat (path, ...) + local info = _stat (path) + if info ~= nil then + return doselection ("stat", 1, {...}, { + dev = info.st_dev, + ino = info.st_ino, + mode = pushmode (info.st_mode), + nlink = info.st_nlink, + uid = info.st_uid, + gid = info.st_gid, + size = info.st_size, + atime = info.st_atime, + mtime = info.st_mtime, + ctime = info.st_ctime, + type = filetype (info.st_mode), + }) + end +end + +if _DEBUG ~= false then + M.stat = function (path, ...) + checkstring ("stat", 1, path, 2) + checkselection ("stat", 2, {...}, 2) + return stat (path, ...) + end +else + M.stat = stat +end + + +--- Fetch file system statistics. +-- @function statvfs +-- @string path any path within the mounted file system +-- @tparam[opt] table|string field one of "bsize", "frsize", "blocks", +-- "bfree", "bavail", "files", "ffree", "favail", "fsid", "flag", +-- "namemax" +-- @string[opt] ... unless *field* was a table, zero or more additional +-- field names +-- @return values, or table of all fields if no option given +-- @see statvfs(2) +-- @usage for a,b in pairs (P,statvfs "/") do print (a, b) end + +local sv = require "posix.sys.statvfs" + +local _statvfs = sv.statvfs + +local function statvfs (path, ...) + local info = _statvfs (path) + if info ~= nil then + return doselection ("statvfs", 1, {...}, { + bsize = info.f_bsize, + frsize = info.f_frsize, + blocks = info.f_blocks, + bfree = info.f_bfree, + bavail = info.f_bavail, + files = info.f_files, + ffree = info.f_ffree, + favail = info.f_favail, + fsid = info.f_fsid, + flag = info.f_flag, + namemax = info.f_namemax, + }) + end +end + +if _DEBUG ~= false then + M.statvfs = function (path, ...) + checkstring ("statvfs", 1, path, 2) + checkselection ("statvfs", 2, {...}, 2) + return statvfs (path, ...) + end +else + M.statvfs = statvfs +end + + +--- Write a time out according to a format. +-- @function strftime +-- @string format specifier with `%` place-holders +-- @tparam PosixTm tm broken-down local time +-- @treturn string *format* with place-holders plugged with *tm* values +-- @see strftime(3) + +local tm = require "posix.time" + +local _strftime, localtime, time = tm.strftime, tm.localtime, tm.time + +local function strftime (fmt, legacytm) + local posixtm = legacytm and PosixTm (legacytm) or localtime (time ()) + return _strftime (fmt, posixtm) +end + +if _DEBUG ~= false then + M.strftime = function (...) + local argt = {...} + checkstring ("strftime", 1, argt[1]) + opttable ("strftime", 2, argt[2]) + if #argt > 2 then toomanyargerror ("strftime", 2, #argt) end + return strftime (...) + end +else + M.strftime = strftime +end + + +--- Parse a date string. +-- @function strptime +-- @string s +-- @string format same as for `strftime` +-- @usage posix.strptime('20','%d').monthday == 20 +-- @treturn[1] PosixTm broken-down local time +-- @treturn[1] int next index of first character not parsed as part of the date +-- @return[2] nil +-- @see strptime(3) + +local tm = require "posix.time" + +local _strptime = tm.strptime + +local function strptime (s, fmt) + return _strptime (s, fmt) +end + +if _DEBUG ~= false then + M.strptime = function (...) + local argt = {...} + checkstring ("strptime", 1, argt[1]) + checkstring ("strptime", 2, argt[2]) + if #argt > 2 then toomanyargerror ("strptime", 2, #argt) end + local tm, i = strptime (...) + return LegacyTm (tm), i + end +else + M.strptime = strptime +end + + +--- Get configuration information at runtime. +-- @function sysconf +-- @tparam[opt] table|string key one of "ARG_MAX", "CHILD_MAX", +-- "CLK_TCK", "JOB_CONTROL", "NGROUPS_MAX", "OPEN_MAX", "SAVED_IDS", +-- "STREAM_MAX", "TZNAME_MAX" or "VERSION" +-- @string[opt] ... unless *type* was a table, zero or more additional +-- type strings +-- @return ... values, or a table of all fields if no option given +-- @see sysconf(2) +-- @usage for a,b in pairs (P.sysconf ()) do print (a, b) end +-- @usage print (P.sysconf ("STREAM_MAX", "ARG_MAX")) + +local unistd = require "posix.unistd" + +local _sysconf = unistd.sysconf + +local function sysconf (...) + return doselection ("sysconf", 0, {...}, { + ARG_MAX = _sysconf (unistd._SC_ARG_MAX), + CHILD_MAX = _sysconf (unistd._SC_CHILD_MAX), + CLK_TCK = _sysconf (unistd._SC_CLK_TCK), + JOB_CONTROL = _sysconf (unistd._SC_JOB_CONTROL), + NGROUPS_MAX = _sysconf (unistd._SC_NGROUPS_MAX), + OPEN_MAX = _sysconf (unistd._SC_OPEN_MAX), + SAVED_IDS = _sysconf (unistd._SC_SAVED_IDS), + STREAM_MAX = _sysconf (unistd._SC_STREAM_MAX), + TZNAME_MAX = _sysconf (unistd._SC_TZNAME_MAX), + VERSION = _sysconf (unistd._SC_VERSION), + }) +end + +if _DEBUG ~= false then + M.sysconf = function (...) + checkselection ("sysconf", 1, {...}, 2) + return sysconf (...) + end +else + M.sysconf = sysconf +end + + +--- Get the current process times. +-- @function times +-- @tparam[opt] table|string key one of "utime", "stime", "cutime", +-- "cstime" or "elapsed" +-- @string[opt] ... unless *key* was a table, zero or more additional +-- key strings. +-- @return values, or a table of all fields if no keys given +-- @see times(2) +-- @usage for a,b in pairs(P.times ()) do print (a, b) end +-- @usage print (P.times ("utime", "elapsed") + +local tms = require "posix.sys.times" + +local _times = tms.times + +local function times (...) + local info = _times () + return doselection ("times", 0, {...}, { + utime = info.tms_utime, + stime = info.tms_stime, + cutime = info.tms_cutime, + cstime = info.tms_cstime, + elapsed = info.elapsed, + }) +end + +if _DEBUG ~= false then + M.times = function (...) + checkselection ("times", 1, {...}, 2) + return times (...) + end +else + M.times = times +end + + +--- Return information about this machine. +-- @function uname +-- @see uname(2) +-- @string[opt="%s %n %r %v %m"] format contains zero or more of: +-- +-- * %m machine name +-- * %n node name +-- * %r release +-- * %s sys name +-- * %v version +-- +--@treturn[1] string filled *format* string, if successful +--@return[2] nil +--@treturn string error message + +local utsname = require "posix.sys.utsname" + +local _uname = utsname.uname + +local function uname (spec) + local u = _uname () + return optstring ("uname", 1, spec, "%s %n %r %v %m"):gsub ("%%(.)", function (s) + if s == "%" then return "%" + elseif s == "m" then return u.machine + elseif s == "n" then return u.nodename + elseif s == "r" then return u.release + elseif s == "s" then return u.sysname + elseif s == "v" then return u.version + else + badoption ("uname", 1, "format", s) + end + end) +end + +if _DEBUG ~= false then + M.uname = function (s, ...) + local argt = {s, ...} + if #argt > 1 then + toomanyargerror ("uname", 1, #argt) + end + return uname (s) + end +else + M.uname = uname +end + + +return M diff --git a/lib/posix/init.lua b/lib/posix/init.lua new file mode 100644 index 0000000..39b0b15 --- /dev/null +++ b/lib/posix/init.lua @@ -0,0 +1,496 @@ +--[[ + POSIX library for Lua 5.1, 5.2 & 5.3. + (c) Gary V. Vaughan , 2013-2015 + (c) Reuben Thomas 2010-2015 + (c) Natanael Copa 2008-2010 +]] +--[[-- + Lua POSIX bindings. + + In addition to the convenience functions documented in this module, all + APIs from submodules are copied into the return table for convenience and + backwards compatibility. + + @module posix +]] + +local bit = require "bit32" +local M = {} + + +-- For backwards compatibility, copy all table entries into M namespace. +for _, sub in ipairs { + "ctype", "dirent", "errno", "fcntl", "fnmatch", "getopt", "glob", "grp", + "libgen", "poll", "pwd", "sched", "signal", "stdio", "stdlib", "sys.msg", + "sys.resource", "sys.socket", "sys.stat", "sys.statvfs", "sys.time", + "sys.times", "sys.utsname", "sys.wait", "syslog", "termio", "time", + "unistd", "utime" +} do + local t = require ("posix." .. sub) + for k, v in pairs (t) do + if k ~= "version" then + assert(M[k] == nil, "posix namespace clash: " .. sub .. "." .. k) + M[k] = v + end + end +end + + +-- Inject deprecated APIs (overwriting submodules) for backwards compatibility. +for k, v in pairs (require "posix.deprecated") do + M[k] = v +end +for k, v in pairs (require "posix.compat") do + M[k] = v +end + +M.version = "posix for " .. _VERSION .. " / luaposix 33.3.1" + + +local argerror, argtypeerror, checkstring, checktable, toomanyargerror = + M.argerror, M.argtypeerror, M.checkstring, M.checktable, M.toomanyargerror + + +-- Code extracted from lua-stdlib with minimal modifications +local list = { + sub = function (l, from, to) + local r = {} + local len = #l + from = from or 1 + to = to or len + if from < 0 then + from = from + len + 1 + end + if to < 0 then + to = to + len + 1 + end + for i = from, to do + table.insert (r, l[i]) + end + return r + end +} +-- end of stdlib code + + + +--- Check permissions like @{posix.unistd.access}, but for euid. +-- Based on the glibc function of the same name. Does not always check +-- for read-only file system, text busy, etc., and does not work with +-- ACLs &c. +-- @function euidaccess +-- @string file file to check +-- @string mode checks to perform (as for access) +-- @return 0 if access allowed; nil otherwise (and errno is set) + +local access, set_errno, stat = M.access, M.set_errno, M.stat +local getegid, geteuid, getgid, getuid = + M.getegid, M.geteuid, M.getgid, M.getuid + +local function euidaccess (file, mode) + local euid, egid = geteuid (), getegid () + + if getuid () == euid and getgid () == egid then + -- If we are not set-uid or set-gid, access does the same. + return access (file, mode) + end + + local stats = stat (file) + if not stats then + return + end + + -- The super-user can read and write any file, and execute any file + -- that anyone can execute. + if euid == 0 and ((not string.match (mode, "x")) or + string.match (stats.st_mode, "x")) then + return 0 + end + + -- Convert to simple list of modes. + mode = string.gsub (mode, "[^rwx]", "") + + if mode == "" then + return 0 -- The file exists. + end + + -- Get the modes we need. + local granted = stats.st_mode:sub (1, 3) + if euid == stats.st_uid then + granted = stats.st_mode:sub (7, 9) + elseif egid == stats.st_gid or set.new (posix.getgroups ()):member (stats.st_gid) then + granted = stats.st_mode:sub (4, 6) + end + granted = string.gsub (granted, "[^rwx]", "") + + if string.gsub ("[^" .. granted .. "]", mode) == "" then + return 0 + end + set_errno (EACCESS) +end + +if _DEBUG ~= false then + M.euidaccess = function (...) + local argt = {...} + checkstring ("euidaccess", 1, argt[1]) + checkstring ("euidaccess", 2, argt[2]) + if #argt > 2 then toomanyargerror ("euidaccess", 2, #argt) end + return euidaccess (...) + end +else + M.euidaccess = euidaccess +end + + +--- Open a pseudo-terminal. +-- Based on the glibc function of the same name. +-- @fixme add support for term and win arguments +-- @treturn[1] int master file descriptor +-- @treturn[1] int slave file descriptor +-- @treturn[1] string slave file name +-- @return[2] nil +-- @treturn[2] string error message + +local bit = require "bit32" +local fcntl = require "posix.fcntl" +local stdlib = require "posix.stdlib" +local unistd = require "posix.unistd" + +local bor = bit.bor +local open, O_RDWR, O_NOCTTY = fcntl.open, fcntl.O_RDWR, fcntl.O_NOCTTY +local grantpt, openpt, ptsname, unlockpt = + stdlib.grantpt, stdlib.openpt, stdlib.ptsname, stdlib.unlockpt +local close = unistd.close + +local function openpty (term, win) + local ok, errmsg, master, slave, slave_name + master, errmsg = openpt (bor (O_RDWR, O_NOCTTY)) + if master then + ok, errmsg = grantpt (master) + if ok then + ok, errmsg = unlockpt (master) + if ok then + slave_name, errmsg = ptsname (master) + if slave_name then + slave, errmsg = open (slave_name, bor (O_RDWR, O_NOCTTY)) + if slave then + return master, slave, slave_name + end + end + end + end + close (master) + end + return nil, errmsg +end + +if _DEBUG ~= false then + M.openpty = function (...) + local argt = {...} + if #argt > 0 then toomanyargerror ("openpty", 0, #argt) end + return openpty (...) + end +else + M.openpty = openpty +end + + +--- Exec a command or Lua function. +-- @function execx +-- @param task, a table of arguments to `P.execp` or a Lua function, which +-- should read from standard input, write to standard output, and return +-- an exit code +-- @param ... positional arguments to the function +-- @treturn nil on error (normally does not return) +-- @treturn string error message + +local unpack = table.unpack or unpack -- 5.3 compatibility + +local errno, execp, _exit = + M.errno, M.execp, M._exit + +function execx (task, ...) + if type (task) == "table" then + execp (unpack (task)) + -- Only get here if there's an error; kill the fork + local _, n = errno () + _exit (n) + else + _exit (task (...) or 0) + end +end + +if _DEBUG ~= false then + M.execx = function (task, ...) + local argt, typetask = {task, ...}, type (task) + if typetask ~= "table" and typetask ~= "function" then + argtypeerror ("execx", 1, "table or function", task) + end + return execx (task, ...) + end +else + M.execx = execx +end + + +--- Run a command or function in a sub-process using `P.execx`. +-- @function spawn +-- @param task, as for `P.execx`. +-- @tparam string ... as for `P.execx` +-- @return values as for `P.wait` + +local unpack = table.unpack or unpack -- 5.3 compatibility + +local fork, wait = + M.fork, M.wait + +local function spawn (task, ...) + local pid, err = fork () + if pid == nil then + return pid, err + elseif pid == 0 then + execx (task, ...) + else + local _, reason, status = wait (pid) + return status, reason -- If wait failed, status is nil & reason is error + end +end + +if _DEBUG ~= false then + M.spawn = function (task, ...) + local argt, typetask = {task, ...}, type (task) + if typetask ~= "table" and typetask ~= "function" then + argtypeerror ("spawn", 1, "table or function", task) + end + return spawn (task, ...) + end +else + M.spawn = spawn +end + + +local close, dup2, fork, pipe, wait, _exit = + M.close, M.dup2, M.fork, M.pipe, M.wait, M._exit +local STDIN_FILENO, STDOUT_FILENO = M.STDIN_FILENO, M.STDOUT_FILENO + +--- Close a pipeline opened with popen or popen_pipeline. +-- @function pclose +-- @tparam table pfd pipeline object +-- @return values as for `P.wait`, for the last (or only) stage of the pipeline + +local function pclose (pfd) + close (pfd.fd) + for i = 1, #pfd.pids - 1 do + wait (pfd.pids[i]) + end + local _, reason, status = wait (pfd.pids[#pfd.pids]) + return reason, status +end + +if _DEBUG ~= false then + M.pclose = function (...) + local argt = {...} + checktable ("pclose", 1, argt[1]) + if #argt > 2 then toomanyargerror ("pclose", 1, #argt) end + return pclose (...) + end +else + M.pclose = pclose +end + + +local function move_fd (from_fd, to_fd) + if from_fd ~= to_fd then + if not dup2 (from_fd, to_fd) then + error "error dup2-ing" + end + close (from_fd) + end +end + +--- Run a commands or Lua function in a sub-process. +-- @function popen +-- @tparam task, as for @{execx} +-- @tparam string mode `"r"` for read or `"w"` for write +-- @func[opt] pipe_fn function returning a paired read and +-- write file descriptor (*default* @{posix.unistd.pipe}) +-- @treturn pfd pipeline object + +local function popen (task, mode, pipe_fn) + local read_fd, write_fd = (pipe_fn or pipe) () + if not read_fd then + error "error opening pipe" + end + local parent_fd, child_fd, in_fd, out_fd + if mode == "r" then + parent_fd, child_fd, in_fd, out_fd = read_fd, write_fd, STDIN_FILENO, STDOUT_FILENO + elseif mode == "w" then + parent_fd, child_fd, in_fd, out_fd = write_fd, read_fd, STDOUT_FILENO, STDIN_FILENO + else + error "invalid mode" + end + local pid = fork () + if pid == nil then + error "error forking" + elseif pid == 0 then -- child process + move_fd (child_fd, out_fd) + close (parent_fd) + _exit (execx (task, child_fd, in_fd, out_fd)) + end -- parent process + close (child_fd) + return {pids = {pid}, fd = parent_fd} +end + +if _DEBUG ~= false then + M.popen = function (task, ...) + local argt, typetask = {task, ...}, type (task) + if typetask ~= "table" and typetask ~= "function" then + argtypeerror ("popen", 1, "table or function", task) + end + checkstring ("popen", 2, argt[2]) + if argt[3] ~= nil and type (argt[3]) ~= "function" then + argtypeerror ("popen", 3, "function or nil", argt[3]) + end + if #argt > 3 then toomanyargerror ("popen", 3, #argt) end + return popen (task, ...) + end +else + M.popen = popen +end + + +--- Perform a series of commands and Lua functions as a pipeline. +-- @function popen_pipeline +-- @tparam table t tasks for @{execx} +-- @tparam string mode `"r"` for read or `"w"` for write +-- @func[opt] pipe_fn function returning a paired read and +-- write file descriptor (*default* @{posix.unistd.pipe}) +-- @treturn pfd pipeline object + +local close, _exit = M.close, M._exit + +local function popen_pipeline (tasks, mode, pipe_fn) + local first, from, to, inc = 1, 2, #tasks, 1 + if mode == "w" then + first, from, to, inc = #tasks, #tasks - 1, 1, -1 + end + local pfd = popen (tasks[first], mode, pipe_fn) + for i = from, to, inc do + local pfd_next = popen (function (fd, in_fd, out_fd) + move_fd (pfd.fd, in_fd) + _exit (execx (tasks[i])) + end, + mode, + pipe_fn) + close (pfd.fd) + pfd.fd = pfd_next.fd + table.insert (pfd.pids, pfd_next.pids[1]) + end + return pfd +end + +if _DEBUG ~= false then + M.popen_pipeline = function (...) + local argt = {...} + checktable ("popen_pipeline", 1, argt[1]) + checkstring ("popen_pipeline", 2, argt[2]) + if argt[3] ~= nil and type (argt[3]) ~= "function" then + argtypeerror ("popen_pipeline", 3, "function or nil", argt[3]) + end + if #argt > 3 then toomanyargerror ("popen_pipeline", 3, #argt) end + return popen_pipeline (...) + end +else + M.popen_pipeline = popen_pipeline +end + + +--- Add one gettimeofday() returned timeval to another. +-- @function timeradd +-- @param x a timeval +-- @param y another timeval +-- @return x + y, adjusted for usec overflow + +local function timeradd (x, y) + local sec, usec = 0, 0 + if x.sec then sec = sec + x.sec end + if y.sec then sec = sec + y.sec end + if x.usec then usec = usec + x.usec end + if y.usec then usec = usec + y.usec end + if usec > 1000000 then + sec = sec + 1 + usec = usec - 1000000 + end + + return { sec = sec, usec = usec } +end + +if _DEBUG ~= false then + M.timeradd = function (...) + local argt = {...} + checktable ("timeradd", 1, argt[1]) + checktable ("timeradd", 2, argt[2]) + if #argt > 2 then toomanyargerror ("timeradd", 2, #argt) end + return timeradd (...) + end +end + + +--- Compare one gettimeofday() returned timeval with another +-- @function timercmp +-- @param x a timeval +-- @param y another timeval +-- @return 0 if x and y are equal, >0 if x is newer, <0 if y is newer + +local function timercmp (x, y) + local x = { sec = x.sec or 0, usec = x.usec or 0 } + local y = { sec = y.sec or 0, usec = y.usec or 0 } + if x.sec ~= y.sec then + return x.sec - y.sec + else + return x.usec - y.usec + end +end + +if _DEBUG ~= false then + M.timercmp = function (...) + local argt = {...} + checktable ("timercmp", 1, argt[1]) + checktable ("timercmp", 2, argt[2]) + if #argt > 2 then toomanyargerror ("timercmp", 2, #argt) end + return timercmp (...) + end +end + + +--- Subtract one gettimeofday() returned timeval from another. +-- @function timersub +-- @param x a timeval +-- @param y another timeval +-- @return x - y, adjusted for usec underflow + +local function timersub (x,y) + local sec, usec = 0, 0 + if x.sec then sec = x.sec end + if y.sec then sec = sec - y.sec end + if x.usec then usec = x.usec end + if y.usec then usec = usec - y.usec end + if usec < 0 then + sec = sec - 1 + usec = usec + 1000000 + end + return { sec = sec, usec = usec } +end + +if _DEBUG ~= false then + M.timersub = function (...) + local argt = {...} + checktable ("timersub", 1, argt[1]) + checktable ("timersub", 2, argt[2]) + if #argt > 2 then toomanyargerror ("timersub", 2, #argt) end + return timersub (...) + end +end + + +return M diff --git a/lib/posix/sys.lua b/lib/posix/sys.lua new file mode 100644 index 0000000..4be88b4 --- /dev/null +++ b/lib/posix/sys.lua @@ -0,0 +1,14 @@ +local posix = require "posix" + +local M = {} + +-- For backwards compatibility with release 32, copy previous +-- entries into `posix.sys` namespace. +for _, fn in ipairs { + "euidaccess", "pipeline", "pipeline_iterator", "pipeline_slurp", + "spawn", "timeradd", "timercmp", "timersub" +} do + M[fn] = posix[fn] +end + +return M diff --git a/lib/posix/util.lua b/lib/posix/util.lua new file mode 100644 index 0000000..e4fed3a --- /dev/null +++ b/lib/posix/util.lua @@ -0,0 +1,10 @@ +--[[ + POSIX library for Lua 5.1, 5.2 & 5.3. + (c) Gary V. Vaughan , 2014-2015 +]] + +-- Backwards compatibility alias. + +return { + openpty = require "posix".openpty, +} diff --git a/local.mk b/local.mk new file mode 100644 index 0000000..f64be0c --- /dev/null +++ b/local.mk @@ -0,0 +1,318 @@ +# Local Make rules. +# Written by Gary V. Vaughan, 2013 + +# Copyright (C) 2013-2015 Gary V. Vaughan + +# This file is part of luaposix. +# See README for license. + +## ------------ ## +## Environment. ## +## ------------ ## + +posix_cpath = $(abs_builddir)/ext/posix/$(objdir)/?$(shrext) + +std_cpath = $(posix_cpath);$(LUA_CPATH) +std_path = $(abs_srcdir)/lib/?.lua;$(LUA_PATH) + +LUA_ENV = LUA_PATH="$(std_path)" LUA_CPATH="$(std_cpath)" + + +## ---------- ## +## Bootstrap. ## +## ---------- ## + +AM_CPPFLAGS += -I $(srcdir)/ext/include -I $(srcdir)/ext/posix $(POSIX_EXTRA_CPPFLAGS) +AM_CFLAGS = $(WERROR_CFLAGS) $(WARN_CFLAGS) +AM_LDFLAGS = -module -avoid-version + +old_NEWS_hash = d41d8cd98f00b204e9800998ecf8427e + +update_copyright_env = \ + UPDATE_COPYRIGHT_HOLDER='(Gary V. Vaughan|Reuben Thomas|luaposix authors)' \ + UPDATE_COPYRIGHT_USE_INTERVALS=1 \ + UPDATE_COPYRIGHT_FORCE=1 + + +## ------------- ## +## Declarations. ## +## ------------- ## + +examplesdir = $(docdir)/examples +modulesdir = $(docdir)/modules +classesdir = $(docdir)/classes + +dist_data_DATA = +dist_doc_DATA = +dist_examples_DATA = +dist_modules_DATA = +dist_classes_DATA = + +include specs/specs.mk + + +## ------ ## +## Build. ## +## ------ ## + +dist_lua_DATA += \ + lib/curses.lua \ + $(NOTHING_ELSE) + +luaposixdir = $(luadir)/posix + +dist_luaposix_DATA = \ + lib/posix/init.lua \ + lib/posix/_argcheck.lua \ + lib/posix/compat.lua \ + lib/posix/deprecated.lua \ + lib/posix/sys.lua \ + lib/posix/util.lua \ + $(NOTHING_ELSE) + +luaexec_LTLIBRARIES += ext/posix/posix.la + +ext_posix_posix_la_SOURCES = \ + ext/posix/posix.c \ + $(NOTHING_ELSE) +EXTRA_ext_posix_posix_la_SOURCES = \ + ext/posix/ctype.c \ + ext/posix/curses.c \ + ext/posix/curses/chstr.c \ + ext/posix/curses/window.c \ + ext/posix/dirent.c \ + ext/posix/errno.c \ + ext/posix/fcntl.c \ + ext/posix/fnmatch.c \ + ext/posix/getopt.c \ + ext/posix/glob.c \ + ext/posix/grp.c \ + ext/posix/libgen.c \ + ext/posix/poll.c \ + ext/posix/pwd.c \ + ext/posix/sched.c \ + ext/posix/signal.c \ + ext/posix/stdio.c \ + ext/posix/stdlib.c \ + ext/posix/sys/msg.c \ + ext/posix/sys/resource.c \ + ext/posix/sys/socket.c \ + ext/posix/sys/stat.c \ + ext/posix/sys/statvfs.c \ + ext/posix/sys/time.c \ + ext/posix/sys/times.c \ + ext/posix/sys/utsname.c \ + ext/posix/sys/wait.c \ + ext/posix/syslog.c \ + ext/posix/termio.c \ + ext/posix/time.c \ + ext/posix/unistd.c \ + ext/posix/utime.c \ + $(NOTHING_ELSE) + +ext_posix_posix_la_LDFLAGS = $(AM_LDFLAGS) $(LIBCRYPT) $(LIBSOCKET) $(LIBRT) $(CURSES_LIB) + +luaexecposixdir = $(luaexecdir)/posix +luaexecposixsysdir = $(luaexecposixdir)/sys + +# EXTRA_LTLIBRARIES don't have an RPATH by default. +luaexecposix_LDFLAGS = $(AM_LDFLAGS) -rpath '$(luaexecposixdir)' +luaexecposixsys_LDFLAGS = $(AM_LDFLAGS) -rpath '$(luaexecposixsysdir)' + + +## ---------------------- ## +## Standalone Submodules. ## +## ---------------------- ## + + +# We don't install these, but we do need to make sure they compile +# for people who want to copy some of the sources into their own +# projects for custom interpreters/libraries. + +posix_submodules = \ + ext/posix/ctype.la \ + ext/posix/curses.la \ + ext/posix/curses/chstr.la \ + ext/posix/curses/window.la \ + ext/posix/dirent.la \ + ext/posix/errno.la \ + ext/posix/fcntl.la \ + ext/posix/fnmatch.la \ + ext/posix/getopt.la \ + ext/posix/glob.la \ + ext/posix/grp.la \ + ext/posix/libgen.la \ + ext/posix/poll.la \ + ext/posix/pwd.la \ + ext/posix/sched.la \ + ext/posix/signal.la \ + ext/posix/stdio.la \ + ext/posix/stdlib.la \ + ext/posix/sys/msg.la \ + ext/posix/sys/resource.la \ + ext/posix/sys/socket.la \ + ext/posix/sys/stat.la \ + ext/posix/sys/statvfs.la \ + ext/posix/sys/time.la \ + ext/posix/sys/times.la \ + ext/posix/sys/utsname.la \ + ext/posix/sys/wait.la \ + ext/posix/syslog.la \ + ext/posix/termio.la \ + ext/posix/time.la \ + ext/posix/unistd.la \ + ext/posix/utime.la \ + $(NOTHING_ELSE) + +EXTRA_LTLIBRARIES += $(posix_submodules) +check_local += $(posix_submodules) + +ext_posix_ctype_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_curses_la_LDFLAGS = $(luaexecposix_LDFLAGS) $(CURSES_LIB) +ext_posix_dirent_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_errno_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_fcntl_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_fnmatch_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_getopt_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_glob_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_grp_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_libgen_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_poll_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_pwd_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_sched_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_signal_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_stdio_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_stdlib_la_LDFLAGS = $(luaexecposix_LDFLAGS) $(LIBCRYPT) +ext_posix_syslog_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_termio_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_time_la_LDFLAGS = $(luaexecposix_LDFLAGS) $(LIBRT) +ext_posix_unistd_la_LDFLAGS = $(luaexecposix_LDFLAGS) +ext_posix_utime_la_LDFLAGS = $(luaexecposix_LDFLAGS) + +ext_posix_sys_msg_la_LDFLAGS = $(luaexecposixsys_LDFLAGS) +ext_posix_sys_resource_la_LDFLAGS = $(luaexecposixsys_LDFLAGS) +ext_posix_sys_socket_la_LDFLAGS = $(luaexecposixsys_LDFLAGS) +ext_posix_sys_stat_la_LDFLAGS = $(luaexecposixsys_LDFLAGS) +ext_posix_sys_statvfs_la_LDFLAGS = $(luaexecposixsys_LDFLAGS) +ext_posix_sys_time_la_LDFLAGS = $(luaexecposixsys_LDFLAGS) +ext_posix_sys_times_la_LDFLAGS = $(luaexecposixsys_LDFLAGS) +ext_posix_sys_utsname_la_LDFLAGS = $(luaexecposixsys_LDFLAGS) +ext_posix_sys_wait_la_LDFLAGS = $(luaexecposixsys_LDFLAGS) + + +clean-local: + rm -f $(posix_submodules) + + +## -------------- ## +## Documentation. ## +## -------------- ## + +dist_doc_DATA += \ + doc/index.html \ + doc/ldoc.css \ + $(NOTHING_ELSE) + +dist_modules_DATA += \ + doc/modules/posix.ctype.html \ + doc/modules/posix.curses.html \ + doc/modules/posix.dirent.html \ + doc/modules/posix.errno.html \ + doc/modules/posix.fcntl.html \ + doc/modules/posix.fnmatch.html \ + doc/modules/posix.getopt.html \ + doc/modules/posix.glob.html \ + doc/modules/posix.grp.html \ + doc/modules/posix.html \ + doc/modules/posix.libgen.html \ + doc/modules/posix.poll.html \ + doc/modules/posix.pwd.html \ + doc/modules/posix.sched.html \ + doc/modules/posix.signal.html \ + doc/modules/posix.stdio.html \ + doc/modules/posix.stdlib.html \ + doc/modules/posix.sys.msg.html \ + doc/modules/posix.sys.resource.html \ + doc/modules/posix.sys.socket.html \ + doc/modules/posix.sys.stat.html \ + doc/modules/posix.sys.statvfs.html \ + doc/modules/posix.sys.time.html \ + doc/modules/posix.sys.times.html \ + doc/modules/posix.sys.utsname.html \ + doc/modules/posix.sys.wait.html \ + doc/modules/posix.syslog.html \ + doc/modules/posix.termio.html \ + doc/modules/posix.time.html \ + doc/modules/posix.unistd.html \ + doc/modules/posix.utime.html \ + $(NOTHING_ELSE) + +dist_classes_DATA += \ + doc/classes/posix.curses.chstr.html \ + doc/classes/posix.curses.window.html \ + $(NOTHING_ELSE) + +dist_examples_DATA += \ + doc/examples/curses.lua.html \ + doc/examples/dir.lua.html \ + doc/examples/fork.lua.html \ + doc/examples/fork2.lua.html \ + doc/examples/getopt.lua.html \ + doc/examples/glob.lua.html \ + doc/examples/limit.lua.html \ + doc/examples/lock.lua.html \ + doc/examples/netlink-uevent.lua.html \ + doc/examples/ping.lua.html \ + doc/examples/poll.lua.html \ + doc/examples/signal.lua.html \ + doc/examples/socket.lua.html \ + doc/examples/termios.lua.html \ + doc/examples/tree.lua.html \ + $(NOTHING_ELSE) + +allhtml = $(dist_doc_DATA) $(dist_examples_DATA) $(dist_modules_DATA) $(dist_classes_DATA) + +$(allhtml): $(EXTRA_ext_posix_posix_la_SOURCES) $(ext_posix_posix_la_SOURCES) + test -d $(builddir)/doc || mkdir $(builddir)/doc +if HAVE_LDOC + $(LDOC) -c build-aux/config.ld -d $(abs_srcdir)/doc . +else + $(MKDIR_P) doc + touch doc/index.html doc/ldoc.css +endif + +doc: $(allhtml) + + +## ------------- ## +## Distribution. ## +## ------------- ## + +EXTRA_DIST += \ + build-aux/config.ld.in \ + examples/dir.lua \ + examples/fork.lua \ + examples/fork2.lua \ + examples/getopt.lua \ + examples/glob.lua \ + examples/limit.lua \ + examples/lock.lua \ + examples/netlink-uevent.lua \ + examples/ping.lua \ + examples/poll.lua \ + examples/signal.lua \ + examples/socket.lua \ + examples/termios.lua \ + examples/tree.lua \ + ext/include/_helpers.c \ + ext/include/compat-5.2.c \ + ext/include/compat-5.2.h \ + ext/include/strlcpy.c \ + $(NOTHING_ELSE) + +MAINTAINERCLEANFILES += \ + doc/index.html \ + doc/ldoc.css \ + $(dist_examples_DATA) \ + $(dist_modules_DATA) \ + $(NOTHING_ELSE) diff --git a/luaposix-33.3.1-1.rockspec b/luaposix-33.3.1-1.rockspec new file mode 100644 index 0000000..aa2efca --- /dev/null +++ b/luaposix-33.3.1-1.rockspec @@ -0,0 +1,23 @@ +package = "luaposix" +version = "33.3.1-1" +description = { + detailed = "A library binding various POSIX APIs, including curses. POSIX is the IEEE Portable Operating System Interface standard. luaposix is based on lposix and lcurses.", + homepage = "http://github.com/luaposix/luaposix/", + license = "MIT/X11", + summary = "Lua bindings for POSIX (including curses)", +} +source = { + dir = "luaposix-release-v33.3.1", + url = "http://github.com/luaposix/luaposix/archive/release-v33.3.1.zip", +} +dependencies = { + "lua >= 5.1, < 5.4", + "bit32", +} +external_dependencies = nil +build = { + build_command = "./configure LUA='$(LUA)' LUA_INCLUDE='-I$(LUA_INCDIR)' --prefix='$(PREFIX)' --libdir='$(LIBDIR)' --datadir='$(LUADIR)' --datarootdir='$(PREFIX)' && make clean all", + copy_directories = {}, + install_command = "make install luadir='$(LUADIR)' luaexecdir='$(LIBDIR)'", + type = "command", +} diff --git a/m4/00gnulib.m4 b/m4/00gnulib.m4 new file mode 100644 index 0000000..c7103ed --- /dev/null +++ b/m4/00gnulib.m4 @@ -0,0 +1,46 @@ +# 00gnulib.m4 serial 3 +dnl Copyright (C) 2009-2015 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl This file must be named something that sorts before all other +dnl gnulib-provided .m4 files. It is needed until such time as we can +dnl assume Autoconf 2.64, with its improved AC_DEFUN_ONCE and +dnl m4_divert semantics. + +# Until autoconf 2.63, handling of the diversion stack required m4_init +# to be called first; but this does not happen with aclocal. Wrapping +# the entire execution in another layer of the diversion stack fixes this. +# Worse, prior to autoconf 2.62, m4_wrap depended on the underlying m4 +# for whether it was FIFO or LIFO; in order to properly balance with +# m4_init, we need to undo our push just before anything wrapped within +# the m4_init body. The way to ensure this is to wrap both sides of +# m4_init with a one-shot macro that does the pop at the right time. +m4_ifndef([_m4_divert_diversion], +[m4_divert_push([KILL]) +m4_define([gl_divert_fixup], [m4_divert_pop()m4_define([$0])]) +m4_define([m4_init], + [gl_divert_fixup()]m4_defn([m4_init])[gl_divert_fixup()])]) + + +# AC_DEFUN_ONCE([NAME], VALUE) +# ---------------------------- +# Define NAME to expand to VALUE on the first use (whether by direct +# expansion, or by AC_REQUIRE), and to nothing on all subsequent uses. +# Avoid bugs in AC_REQUIRE in Autoconf 2.63 and earlier. This +# definition is slower than the version in Autoconf 2.64, because it +# can only use interfaces that existed since 2.59; but it achieves the +# same effect. Quoting is necessary to avoid confusing Automake. +m4_version_prereq([2.63.263], [], +[m4_define([AC][_DEFUN_ONCE], + [AC][_DEFUN([$1], + [AC_REQUIRE([_gl_DEFUN_ONCE([$1])], + [m4_indir([_gl_DEFUN_ONCE([$1])])])])]dnl +[AC][_DEFUN([_gl_DEFUN_ONCE([$1])], [$2])])]) + +# gl_00GNULIB +# ----------- +# Witness macro that this file has been included. Needed to force +# Automake to include this file prior to all other gnulib .m4 files. +AC_DEFUN([gl_00GNULIB]) diff --git a/m4/ax_lua.m4 b/m4/ax_lua.m4 new file mode 100644 index 0000000..8da0a07 --- /dev/null +++ b/m4/ax_lua.m4 @@ -0,0 +1,664 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_lua.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PROG_LUA[([MINIMUM-VERSION], [TOO-BIG-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])] +# AX_LUA_HEADERS[([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])] +# AX_LUA_LIBS[([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])] +# AX_LUA_READLINE[([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])] +# +# DESCRIPTION +# +# Detect a Lua interpreter, optionally specifying a minimum and maximum +# version number. Set up important Lua paths, such as the directories in +# which to install scripts and modules (shared libraries). +# +# Also detect Lua headers and libraries. The Lua version contained in the +# header is checked to match the Lua interpreter version exactly. When +# searching for Lua libraries, the version number is used as a suffix. +# This is done with the goal of supporting multiple Lua installs (5.1 and +# 5.2 side-by-side). +# +# A note on compatibility with previous versions: This file has been +# mostly rewritten for serial 18. Most developers should be able to use +# these macros without needing to modify configure.ac. Care has been taken +# to preserve each macro's behavior, but there are some differences: +# +# 1) AX_WITH_LUA is deprecated; it now expands to the exact same thing as +# AX_PROG_LUA with no arguments. +# +# 2) AX_LUA_HEADERS now checks that the version number defined in lua.h +# matches the interpreter version. AX_LUA_HEADERS_VERSION is therefore +# unnecessary, so it is deprecated and does not expand to anything. +# +# 3) The configure flag --with-lua-suffix no longer exists; the user +# should instead specify the LUA precious variable on the command line. +# See the AX_PROG_LUA description for details. +# +# Please read the macro descriptions below for more information. +# +# This file was inspired by Andrew Dalke's and James Henstridge's +# python.m4 and Tom Payne's, Matthieu Moy's, and Reuben Thomas's ax_lua.m4 +# (serial 17). Basically, this file is a mash-up of those two files. I +# like to think it combines the best of the two! +# +# AX_PROG_LUA: Search for the Lua interpreter, and set up important Lua +# paths. Adds precious variable LUA, which may contain the path of the Lua +# interpreter. If LUA is blank, the user's path is searched for an +# suitable interpreter. +# +# If MINIMUM-VERSION is supplied, then only Lua interpreters with a +# version number greater or equal to MINIMUM-VERSION will be accepted. If +# TOO-BIG-VERSION is also supplied, then only Lua interpreters with a +# version number greater or equal to MINIMUM-VERSION and less than +# TOO-BIG-VERSION will be accepted. +# +# The Lua version number, LUA_VERSION, is found from the interpreter, and +# substituted. LUA_PLATFORM is also found, but not currently supported (no +# standard representation). +# +# Finally, the macro finds four paths: +# +# luadir Directory to install Lua scripts. +# pkgluadir $luadir/$PACKAGE +# luaexecdir Directory to install Lua modules. +# pkgluaexecdir $luaexecdir/$PACKAGE +# +# These paths are found based on $prefix, $exec_prefix, Lua's +# package.path, and package.cpath. The first path of package.path +# beginning with $prefix is selected as luadir. The first path of +# package.cpath beginning with $exec_prefix is used as luaexecdir. This +# should work on all reasonable Lua installations. If a path cannot be +# determined, a default path is used. Of course, the user can override +# these later when invoking make. +# +# luadir Default: $prefix/share/lua/$LUA_VERSION +# luaexecdir Default: $exec_prefix/lib/lua/$LUA_VERSION +# +# These directories can be used by Automake as install destinations. The +# variable name minus 'dir' needs to be used as a prefix to the +# appropriate Automake primary, e.g. lua_SCRIPS or luaexec_LIBRARIES. +# +# If an acceptable Lua interpreter is found, then ACTION-IF-FOUND is +# performed, otherwise ACTION-IF-NOT-FOUND is preformed. If ACTION-IF-NOT- +# FOUND is blank, then it will default to printing an error. To prevent +# the default behavior, give ':' as an action. +# +# AX_LUA_HEADERS: Search for Lua headers. Requires that AX_PROG_LUA be +# expanded before this macro. Adds precious variable LUA_INCLUDE, which +# may contain Lua specific include flags, e.g. -I/usr/include/lua5.1. If +# LUA_INCLUDE is blank, then this macro will attempt to find suitable +# flags. +# +# LUA_INCLUDE can be used by Automake to compile Lua modules or +# executables with embedded interpreters. The *_CPPFLAGS variables should +# be used for this purpose, e.g. myprog_CPPFLAGS = $(LUA_INCLUDE). +# +# This macro searches for the header lua.h (and others). The search is +# performed with a combination of CPPFLAGS, CPATH, etc, and LUA_INCLUDE. +# If the search is unsuccessful, then some common directories are tried. +# If the headers are then found, then LUA_INCLUDE is set accordingly. +# +# The paths automatically searched are: +# +# * /usr/include/luaX.Y +# * /usr/include/lua/X.Y +# * /usr/include/luaXY +# * /usr/local/include/luaX.Y +# * /usr/local/include/lua-X.Y +# * /usr/local/include/lua/X.Y +# * /usr/local/include/luaXY +# +# (Where X.Y is the Lua version number, e.g. 5.1.) +# +# The Lua version number found in the headers is always checked to match +# the Lua interpreter's version number. Lua headers with mismatched +# version numbers are not accepted. +# +# If headers are found, then ACTION-IF-FOUND is performed, otherwise +# ACTION-IF-NOT-FOUND is performed. If ACTION-IF-NOT-FOUND is blank, then +# it will default to printing an error. To prevent the default behavior, +# set the action to ':'. +# +# AX_LUA_LIBS: Search for Lua libraries. Requires that AX_PROG_LUA be +# expanded before this macro. Adds precious variable LUA_LIB, which may +# contain Lua specific linker flags, e.g. -llua5.1. If LUA_LIB is blank, +# then this macro will attempt to find suitable flags. +# +# LUA_LIB can be used by Automake to link Lua modules or executables with +# embedded interpreters. The *_LIBADD and *_LDADD variables should be used +# for this purpose, e.g. mymod_LIBADD = $(LUA_LIB). +# +# This macro searches for the Lua library. More technically, it searches +# for a library containing the function lua_load. The search is performed +# with a combination of LIBS, LIBRARY_PATH, and LUA_LIB. +# +# If the search determines that some linker flags are missing, then those +# flags will be added to LUA_LIB. +# +# If libraries are found, then ACTION-IF-FOUND is performed, otherwise +# ACTION-IF-NOT-FOUND is performed. If ACTION-IF-NOT-FOUND is blank, then +# it will default to printing an error. To prevent the default behavior, +# set the action to ':'. +# +# AX_LUA_READLINE: Search for readline headers and libraries. Requires the +# AX_LIB_READLINE macro, which is provided by ax_lib_readline.m4 from the +# Autoconf Archive. +# +# If a readline compatible library is found, then ACTION-IF-FOUND is +# performed, otherwise ACTION-IF-NOT-FOUND is performed. +# +# LICENSE +# +# Copyright (c) 2015 Reuben Thomas +# Copyright (c) 2014 Tim Perkins +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 38 + +dnl ========================================================================= +dnl AX_PROG_LUA([MINIMUM-VERSION], [TOO-BIG-VERSION], +dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ========================================================================= +AC_DEFUN([AX_PROG_LUA], +[ + dnl Check for required tools. + AC_REQUIRE([AC_PROG_GREP]) + AC_REQUIRE([AC_PROG_SED]) + + dnl Make LUA a precious variable. + AC_ARG_VAR([LUA], [The Lua interpreter, e.g. /usr/bin/lua5.1]) + + dnl Find a Lua interpreter. + m4_define_default([_AX_LUA_INTERPRETER_LIST], + [lua lua5.2 lua52 lua5.1 lua51 lua50]) + + m4_if([$1], [], + [ dnl No version check is needed. Find any Lua interpreter. + AS_IF([test "x$LUA" = 'x'], + [AC_PATH_PROGS([LUA], [_AX_LUA_INTERPRETER_LIST], [:])]) + ax_display_LUA='lua' + + AS_IF([test "x$LUA" != 'x:'], + [ dnl At least check if this is a Lua interpreter. + AC_MSG_CHECKING([if $LUA is a Lua interpreter]) + _AX_LUA_CHK_IS_INTRP([$LUA], + [AC_MSG_RESULT([yes])], + [ AC_MSG_RESULT([no]) + AC_MSG_ERROR([not a Lua interpreter]) + ]) + ]) + ], + [ dnl A version check is needed. + AS_IF([test "x$LUA" != 'x'], + [ dnl Check if this is a Lua interpreter. + AC_MSG_CHECKING([if $LUA is a Lua interpreter]) + _AX_LUA_CHK_IS_INTRP([$LUA], + [AC_MSG_RESULT([yes])], + [ AC_MSG_RESULT([no]) + AC_MSG_ERROR([not a Lua interpreter]) + ]) + dnl Check the version. + m4_if([$2], [], + [_ax_check_text="whether $LUA version >= $1"], + [_ax_check_text="whether $LUA version >= $1, < $2"]) + AC_MSG_CHECKING([$_ax_check_text]) + _AX_LUA_CHK_VER([$LUA], [$1], [$2], + [AC_MSG_RESULT([yes])], + [ AC_MSG_RESULT([no]) + AC_MSG_ERROR([version is out of range for specified LUA])]) + ax_display_LUA=$LUA + ], + [ dnl Try each interpreter until we find one that satisfies VERSION. + m4_if([$2], [], + [_ax_check_text="for a Lua interpreter with version >= $1"], + [_ax_check_text="for a Lua interpreter with version >= $1, < $2"]) + AC_CACHE_CHECK([$_ax_check_text], + [ax_cv_pathless_LUA], + [ for ax_cv_pathless_LUA in _AX_LUA_INTERPRETER_LIST none; do + test "x$ax_cv_pathless_LUA" = 'xnone' && break + _AX_LUA_CHK_IS_INTRP([$ax_cv_pathless_LUA], [], [continue]) + _AX_LUA_CHK_VER([$ax_cv_pathless_LUA], [$1], [$2], [break]) + done + ]) + dnl Set $LUA to the absolute path of $ax_cv_pathless_LUA. + AS_IF([test "x$ax_cv_pathless_LUA" = 'xnone'], + [LUA=':'], + [AC_PATH_PROG([LUA], [$ax_cv_pathless_LUA])]) + ax_display_LUA=$ax_cv_pathless_LUA + ]) + ]) + + AS_IF([test "x$LUA" = 'x:'], + [ dnl Run any user-specified action, or abort. + m4_default([$4], [AC_MSG_ERROR([cannot find suitable Lua interpreter])]) + ], + [ dnl Query Lua for its version number. + AC_CACHE_CHECK([for $ax_display_LUA version], + [ax_cv_lua_version], + [ dnl Get the interpreter version in X.Y format. This should work for + dnl interpreters version 5.0 and beyond. + ax_cv_lua_version=[`$LUA -e ' + -- return a version number in X.Y format + local _, _, ver = string.find(_VERSION, "^Lua (%d+%.%d+)") + print(ver)'`] + ]) + AS_IF([test "x$ax_cv_lua_version" = 'x'], + [AC_MSG_ERROR([invalid Lua version number])]) + AC_SUBST([LUA_VERSION], [$ax_cv_lua_version]) + AC_SUBST([LUA_SHORT_VERSION], [`echo "$LUA_VERSION" | $SED 's|\.||'`]) + + dnl The following check is not supported: + dnl At times (like when building shared libraries) you may want to know + dnl which OS platform Lua thinks this is. + AC_CACHE_CHECK([for $ax_display_LUA platform], + [ax_cv_lua_platform], + [ax_cv_lua_platform=[`$LUA -e 'print("unknown")'`]]) + AC_SUBST([LUA_PLATFORM], [$ax_cv_lua_platform]) + + dnl Use the values of $prefix and $exec_prefix for the corresponding + dnl values of LUA_PREFIX and LUA_EXEC_PREFIX. These are made distinct + dnl variables so they can be overridden if need be. However, the general + dnl consensus is that you shouldn't need this ability. + AC_SUBST([LUA_PREFIX], ['${prefix}']) + AC_SUBST([LUA_EXEC_PREFIX], ['${exec_prefix}']) + + dnl Lua provides no way to query the script directory, and instead + dnl provides LUA_PATH. However, we should be able to make a safe educated + dnl guess. If the built-in search path contains a directory which is + dnl prefixed by $prefix, then we can store scripts there. The first + dnl matching path will be used. + AC_CACHE_CHECK([for $ax_display_LUA script directory], + [ax_cv_lua_luadir], + [ AS_IF([test "x$prefix" = 'xNONE'], + [ax_lua_prefix=$ac_default_prefix], + [ax_lua_prefix=$prefix]) + + dnl Initialize to the default path. + ax_cv_lua_luadir="$LUA_PREFIX/share/lua/$LUA_VERSION" + + dnl Try to find a path with the prefix. + _AX_LUA_FND_PRFX_PTH([$LUA], [$ax_lua_prefix], [script]) + AS_IF([test "x$ax_lua_prefixed_path" != 'x'], + [ dnl Fix the prefix. + _ax_strip_prefix=`echo "$ax_lua_prefix" | $SED 's|.|.|g'` + ax_cv_lua_luadir=`echo "$ax_lua_prefixed_path" | \ + $SED "s|^$_ax_strip_prefix|$LUA_PREFIX|"` + ]) + ]) + AC_SUBST([luadir], [$ax_cv_lua_luadir]) + AC_SUBST([pkgluadir], [\${luadir}/$PACKAGE]) + + dnl Lua provides no way to query the module directory, and instead + dnl provides LUA_PATH. However, we should be able to make a safe educated + dnl guess. If the built-in search path contains a directory which is + dnl prefixed by $exec_prefix, then we can store modules there. The first + dnl matching path will be used. + AC_CACHE_CHECK([for $ax_display_LUA module directory], + [ax_cv_lua_luaexecdir], + [ AS_IF([test "x$exec_prefix" = 'xNONE'], + [ax_lua_exec_prefix=$ax_lua_prefix], + [ax_lua_exec_prefix=$exec_prefix]) + + dnl Initialize to the default path. + ax_cv_lua_luaexecdir="$LUA_EXEC_PREFIX/lib/lua/$LUA_VERSION" + + dnl Try to find a path with the prefix. + _AX_LUA_FND_PRFX_PTH([$LUA], + [$ax_lua_exec_prefix], [module]) + AS_IF([test "x$ax_lua_prefixed_path" != 'x'], + [ dnl Fix the prefix. + _ax_strip_prefix=`echo "$ax_lua_exec_prefix" | $SED 's|.|.|g'` + ax_cv_lua_luaexecdir=`echo "$ax_lua_prefixed_path" | \ + $SED "s|^$_ax_strip_prefix|$LUA_EXEC_PREFIX|"` + ]) + ]) + AC_SUBST([luaexecdir], [$ax_cv_lua_luaexecdir]) + AC_SUBST([pkgluaexecdir], [\${luaexecdir}/$PACKAGE]) + + dnl Run any user specified action. + $3 + ]) +]) + +dnl AX_WITH_LUA is now the same thing as AX_PROG_LUA. +AC_DEFUN([AX_WITH_LUA], +[ + AC_MSG_WARN([[$0 is deprecated, please use AX_PROG_LUA instead]]) + AX_PROG_LUA +]) + + +dnl ========================================================================= +dnl _AX_LUA_CHK_IS_INTRP(PROG, [ACTION-IF-TRUE], [ACTION-IF-FALSE]) +dnl ========================================================================= +AC_DEFUN([_AX_LUA_CHK_IS_INTRP], +[ + dnl A minimal Lua factorial to prove this is an interpreter. This should work + dnl for Lua interpreters version 5.0 and beyond. + _ax_lua_factorial=[`$1 2>/dev/null -e ' + -- a simple factorial + function fact (n) + if n == 0 then + return 1 + else + return n * fact(n-1) + end + end + print("fact(5) is " .. fact(5))'`] + AS_IF([test "$_ax_lua_factorial" = 'fact(5) is 120'], + [$2], [$3]) +]) + + +dnl ========================================================================= +dnl _AX_LUA_CHK_VER(PROG, MINIMUM-VERSION, [TOO-BIG-VERSION], +dnl [ACTION-IF-TRUE], [ACTION-IF-FALSE]) +dnl ========================================================================= +AC_DEFUN([_AX_LUA_CHK_VER], +[ + dnl Check that the Lua version is within the bounds. Only the major and minor + dnl version numbers are considered. This should work for Lua interpreters + dnl version 5.0 and beyond. + _ax_lua_good_version=[`$1 -e ' + -- a script to compare versions + function verstr2num(verstr) + local _, _, majorver, minorver = string.find(verstr, "^(%d+)%.(%d+)") + if majorver and minorver then + return tonumber(majorver) * 100 + tonumber(minorver) + end + end + local minver = verstr2num("$2") + local _, _, trimver = string.find(_VERSION, "^Lua (.*)") + local ver = verstr2num(trimver) + local maxver = verstr2num("$3") or 1e9 + if minver <= ver and ver < maxver then + print("yes") + else + print("no") + end'`] + AS_IF([test "x$_ax_lua_good_version" = "xyes"], + [$4], [$5]) +]) + + +dnl ========================================================================= +dnl _AX_LUA_FND_PRFX_PTH(PROG, PREFIX, SCRIPT-OR-MODULE-DIR) +dnl ========================================================================= +AC_DEFUN([_AX_LUA_FND_PRFX_PTH], +[ + dnl Get the script or module directory by querying the Lua interpreter, + dnl filtering on the given prefix, and selecting the shallowest path. If no + dnl path is found matching the prefix, the result will be an empty string. + dnl The third argument determines the type of search, it can be 'script' or + dnl 'module'. Supplying 'script' will perform the search with package.path + dnl and LUA_PATH, and supplying 'module' will search with package.cpath and + dnl LUA_CPATH. This is done for compatibility with Lua 5.0. + + ax_lua_prefixed_path=[`$1 -e ' + -- get the path based on search type + local searchtype = "$3" + local paths = "" + if searchtype == "script" then + paths = (package and package.path) or LUA_PATH + elseif searchtype == "module" then + paths = (package and package.cpath) or LUA_CPATH + end + -- search for the prefix + local prefix = "'$2'" + local minpath = "" + local mindepth = 1e9 + string.gsub(paths, "(@<:@^;@:>@+)", + function (path) + path = string.gsub(path, "%?.*$", "") + path = string.gsub(path, "/@<:@^/@:>@*$", "") + if string.find(path, prefix) then + local depth = string.len(string.gsub(path, "@<:@^/@:>@", "")) + if depth < mindepth then + minpath = path + mindepth = depth + end + end + end) + print(minpath)'`] +]) + + +dnl ========================================================================= +dnl AX_LUA_HEADERS([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ========================================================================= +AC_DEFUN([AX_LUA_HEADERS], +[ + dnl Check for LUA_VERSION. + AC_MSG_CHECKING([if LUA_VERSION is defined]) + AS_IF([test "x$LUA_VERSION" != 'x'], + [AC_MSG_RESULT([yes])], + [ AC_MSG_RESULT([no]) + AC_MSG_ERROR([cannot check Lua headers without knowing LUA_VERSION]) + ]) + + dnl Make LUA_INCLUDE a precious variable. + AC_ARG_VAR([LUA_INCLUDE], [The Lua includes, e.g. -I/usr/include/lua5.1]) + + dnl Some default directories to search. + LUA_SHORT_VERSION=`echo "$LUA_VERSION" | $SED 's|\.||'` + m4_define_default([_AX_LUA_INCLUDE_LIST], + [ /usr/include/lua$LUA_VERSION \ + /usr/include/lua-$LUA_VERSION \ + /usr/include/lua/$LUA_VERSION \ + /usr/include/lua$LUA_SHORT_VERSION \ + /usr/local/include/lua$LUA_VERSION \ + /usr/local/include/lua-$LUA_VERSION \ + /usr/local/include/lua/$LUA_VERSION \ + /usr/local/include/lua$LUA_SHORT_VERSION \ + ]) + + dnl Try to find the headers. + _ax_lua_saved_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $LUA_INCLUDE" + AC_CHECK_HEADERS([lua.h lualib.h lauxlib.h luaconf.h]) + CPPFLAGS=$_ax_lua_saved_cppflags + + dnl Try some other directories if LUA_INCLUDE was not set. + AS_IF([test "x$LUA_INCLUDE" = 'x' && + test "x$ac_cv_header_lua_h" != 'xyes'], + [ dnl Try some common include paths. + for _ax_include_path in _AX_LUA_INCLUDE_LIST; do + test ! -d "$_ax_include_path" && continue + + AC_MSG_CHECKING([for Lua headers in]) + AC_MSG_RESULT([$_ax_include_path]) + + AS_UNSET([ac_cv_header_lua_h]) + AS_UNSET([ac_cv_header_lualib_h]) + AS_UNSET([ac_cv_header_lauxlib_h]) + AS_UNSET([ac_cv_header_luaconf_h]) + + _ax_lua_saved_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS -I$_ax_include_path" + AC_CHECK_HEADERS([lua.h lualib.h lauxlib.h luaconf.h]) + CPPFLAGS=$_ax_lua_saved_cppflags + + AS_IF([test "x$ac_cv_header_lua_h" = 'xyes'], + [ LUA_INCLUDE="-I$_ax_include_path" + break + ]) + done + ]) + + AS_IF([test "x$ac_cv_header_lua_h" = 'xyes'], + [ dnl Make a program to print LUA_VERSION defined in the header. + dnl TODO It would be really nice if we could do this without compiling a + dnl program, then it would work when cross compiling. But I'm not sure how + dnl to do this reliably. For now, assume versions match when cross compiling. + + AS_IF([test "x$cross_compiling" != 'xyes'], + [ AC_CACHE_CHECK([for Lua header version], + [ax_cv_lua_header_version], + [ _ax_lua_saved_cppflags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $LUA_INCLUDE" + AC_RUN_IFELSE( + [ AC_LANG_SOURCE([[ +#include +#include +#include +int main(int argc, char ** argv) +{ + if(argc > 1) printf("%s", LUA_VERSION); + exit(EXIT_SUCCESS); +} +]]) + ], + [ ax_cv_lua_header_version=`./conftest$EXEEXT p | \ + $SED -n "s|^Lua \(@<:@0-9@:>@\{1,\}\.@<:@0-9@:>@\{1,\}\).\{0,\}|\1|p"` + ], + [ax_cv_lua_header_version='unknown']) + CPPFLAGS=$_ax_lua_saved_cppflags + ]) + + dnl Compare this to the previously found LUA_VERSION. + AC_MSG_CHECKING([if Lua header version matches $LUA_VERSION]) + AS_IF([test "x$ax_cv_lua_header_version" = "x$LUA_VERSION"], + [ AC_MSG_RESULT([yes]) + ax_header_version_match='yes' + ], + [ AC_MSG_RESULT([no]) + ax_header_version_match='no' + ]) + ], + [ AC_MSG_WARN([cross compiling so assuming header version number matches]) + ax_header_version_match='yes' + ]) + ]) + + dnl Was LUA_INCLUDE specified? + AS_IF([test "x$ax_header_version_match" != 'xyes' && + test "x$LUA_INCLUDE" != 'x'], + [AC_MSG_ERROR([cannot find headers for specified LUA_INCLUDE])]) + + dnl Test the final result and run user code. + AS_IF([test "x$ax_header_version_match" = 'xyes'], [$1], + [m4_default([$2], [AC_MSG_ERROR([cannot find Lua includes])])]) +]) + +dnl AX_LUA_HEADERS_VERSION no longer exists, use AX_LUA_HEADERS. +AC_DEFUN([AX_LUA_HEADERS_VERSION], +[ + AC_MSG_WARN([[$0 is deprecated, please use AX_LUA_HEADERS instead]]) +]) + + +dnl ========================================================================= +dnl AX_LUA_LIBS([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ========================================================================= +AC_DEFUN([AX_LUA_LIBS], +[ + dnl TODO Should this macro also check various -L flags? + + dnl Check for LUA_VERSION. + AC_MSG_CHECKING([if LUA_VERSION is defined]) + AS_IF([test "x$LUA_VERSION" != 'x'], + [AC_MSG_RESULT([yes])], + [ AC_MSG_RESULT([no]) + AC_MSG_ERROR([cannot check Lua libs without knowing LUA_VERSION]) + ]) + + dnl Make LUA_LIB a precious variable. + AC_ARG_VAR([LUA_LIB], [The Lua library, e.g. -llua5.1]) + + AS_IF([test "x$LUA_LIB" != 'x'], + [ dnl Check that LUA_LIBS works. + _ax_lua_saved_libs=$LIBS + LIBS="$LIBS $LUA_LIB" + AC_SEARCH_LIBS([lua_load], [], + [_ax_found_lua_libs='yes'], + [_ax_found_lua_libs='no']) + LIBS=$_ax_lua_saved_libs + + dnl Check the result. + AS_IF([test "x$_ax_found_lua_libs" != 'xyes'], + [AC_MSG_ERROR([cannot find libs for specified LUA_LIB])]) + ], + [ dnl First search for extra libs. + _ax_lua_extra_libs='' + + _ax_lua_saved_libs=$LIBS + LIBS="$LIBS $LUA_LIB" + AC_SEARCH_LIBS([exp], [m]) + AC_SEARCH_LIBS([dlopen], [dl]) + LIBS=$_ax_lua_saved_libs + + AS_IF([test "x$ac_cv_search_exp" != 'xno' && + test "x$ac_cv_search_exp" != 'xnone required'], + [_ax_lua_extra_libs="$_ax_lua_extra_libs $ac_cv_search_exp"]) + + AS_IF([test "x$ac_cv_search_dlopen" != 'xno' && + test "x$ac_cv_search_dlopen" != 'xnone required'], + [_ax_lua_extra_libs="$_ax_lua_extra_libs $ac_cv_search_dlopen"]) + + dnl Try to find the Lua libs. + _ax_lua_saved_libs=$LIBS + LIBS="$LIBS $LUA_LIB" + AC_SEARCH_LIBS([lua_load], + [ lua$LUA_VERSION \ + lua$LUA_SHORT_VERSION \ + lua-$LUA_VERSION \ + lua-$LUA_SHORT_VERSION \ + lua \ + ], + [_ax_found_lua_libs='yes'], + [_ax_found_lua_libs='no'], + [$_ax_lua_extra_libs]) + LIBS=$_ax_lua_saved_libs + + AS_IF([test "x$ac_cv_search_lua_load" != 'xno' && + test "x$ac_cv_search_lua_load" != 'xnone required'], + [LUA_LIB="$ac_cv_search_lua_load $_ax_lua_extra_libs"]) + ]) + + dnl Test the result and run user code. + AS_IF([test "x$_ax_found_lua_libs" = 'xyes'], [$1], + [m4_default([$2], [AC_MSG_ERROR([cannot find Lua libs])])]) +]) + + +dnl ========================================================================= +dnl AX_LUA_READLINE([ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl ========================================================================= +AC_DEFUN([AX_LUA_READLINE], +[ + AX_LIB_READLINE + AS_IF([test "x$ac_cv_header_readline_readline_h" != 'x' && + test "x$ac_cv_header_readline_history_h" != 'x'], + [ LUA_LIBS_CFLAGS="-DLUA_USE_READLINE $LUA_LIBS_CFLAGS" + $1 + ], + [$2]) +]) diff --git a/m4/ax_with_curses.m4 b/m4/ax_with_curses.m4 new file mode 100644 index 0000000..33a37ac --- /dev/null +++ b/m4/ax_with_curses.m4 @@ -0,0 +1,518 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_with_curses.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_WITH_CURSES +# +# DESCRIPTION +# +# This macro checks whether a SysV or X/Open-compatible Curses library is +# present, along with the associated header file. The NcursesW +# (wide-character) library is searched for first, followed by Ncurses, +# then the system-default plain Curses. The first library found is the +# one returned. +# +# The following options are understood: --with-ncursesw, --with-ncurses, +# --without-ncursesw, --without-ncurses. The "--with" options force the +# macro to use that particular library, terminating with an error if not +# found. The "--without" options simply skip the check for that library. +# The effect on the search pattern is: +# +# (no options) - NcursesW, Ncurses, Curses +# --with-ncurses --with-ncursesw - NcursesW only [*] +# --without-ncurses --with-ncursesw - NcursesW only [*] +# --with-ncursesw - NcursesW only [*] +# --with-ncurses --without-ncursesw - Ncurses only [*] +# --with-ncurses - NcursesW, Ncurses [**] +# --without-ncurses --without-ncursesw - Curses only +# --without-ncursesw - Ncurses, Curses +# --without-ncurses - NcursesW, Curses +# +# [*] If the library is not found, abort the configure script. +# +# [**] If the second library (Ncurses) is not found, abort configure. +# +# The following preprocessor symbols may be defined by this macro if the +# appropriate conditions are met: +# +# HAVE_CURSES - if any SysV or X/Open Curses library found +# HAVE_CURSES_ENHANCED - if library supports X/Open Enhanced functions +# HAVE_CURSES_COLOR - if library supports color (enhanced functions) +# HAVE_CURSES_OBSOLETE - if library supports certain obsolete features +# HAVE_NCURSESW - if NcursesW (wide char) library is to be used +# HAVE_NCURSES - if the Ncurses library is to be used +# +# HAVE_CURSES_H - if is present and should be used +# HAVE_NCURSESW_H - if should be used +# HAVE_NCURSES_H - if should be used +# HAVE_NCURSESW_CURSES_H - if should be used +# HAVE_NCURSES_CURSES_H - if should be used +# +# (These preprocessor symbols are discussed later in this document.) +# +# The following output variable is defined by this macro; it is precious +# and may be overridden on the ./configure command line: +# +# CURSES_LIB - library to add to xxx_LDADD +# +# The library listed in CURSES_LIB is NOT added to LIBS by default. You +# need to add CURSES_LIB to the appropriate xxx_LDADD line in your +# Makefile.am. For example: +# +# prog_LDADD = @CURSES_LIB@ +# +# If CURSES_LIB is set on the configure command line (such as by running +# "./configure CURSES_LIB=-lmycurses"), then the only header searched for +# is . The user may use the CPPFLAGS precious variable to +# override the standard #include search path. If the user needs to +# specify an alternative path for a library (such as for a non-standard +# NcurseW), the user should use the LDFLAGS variable. +# +# The following shell variables may be defined by this macro: +# +# ax_cv_curses - set to "yes" if any Curses library found +# ax_cv_curses_enhanced - set to "yes" if Enhanced functions present +# ax_cv_curses_color - set to "yes" if color functions present +# ax_cv_curses_obsolete - set to "yes" if obsolete features present +# +# ax_cv_ncursesw - set to "yes" if NcursesW library found +# ax_cv_ncurses - set to "yes" if Ncurses library found +# ax_cv_plaincurses - set to "yes" if plain Curses library found +# ax_cv_curses_which - set to "ncursesw", "ncurses", "plaincurses" or "no" +# +# These variables can be used in your configure.ac to determine the level +# of support you need from the Curses library. For example, if you must +# have either Ncurses or NcursesW, you could include: +# +# AX_WITH_CURSES +# if test "x$ax_cv_ncursesw" != xyes && test "x$ax_cv_ncurses" != xyes; then +# AX_MSG_ERROR([requires either NcursesW or Ncurses library]) +# fi +# +# If any Curses library will do (but one must be present and must support +# color), you could use: +# +# AX_WITH_CURSES +# if test "x$ax_cv_curses" != xyes || test "x$ax_cv_curses_color" != xyes; then +# AC_MSG_ERROR([requires an X/Open-compatible Curses library with color]) +# fi +# +# Certain preprocessor symbols and shell variables defined by this macro +# can be used to determine various features of the Curses library. In +# particular, HAVE_CURSES and ax_cv_curses are defined if the Curses +# library found conforms to the traditional SysV and/or X/Open Base Curses +# definition. Any working Curses library conforms to this level. +# +# HAVE_CURSES_ENHANCED and ax_cv_curses_enhanced are defined if the +# library supports the X/Open Enhanced Curses definition. In particular, +# the wide-character types attr_t, cchar_t and wint_t, the functions +# wattr_set() and wget_wch() and the macros WA_NORMAL and _XOPEN_CURSES +# are checked. The Ncurses library does NOT conform to this definition, +# although NcursesW does. +# +# HAVE_CURSES_COLOR and ax_cv_curses_color are defined if the library +# supports color functions and macros such as COLOR_PAIR, A_COLOR, +# COLOR_WHITE, COLOR_RED and init_pair(). These are NOT part of the +# X/Open Base Curses definition, but are part of the Enhanced set of +# functions. The Ncurses library DOES support these functions, as does +# NcursesW. +# +# HAVE_CURSES_OBSOLETE and ax_cv_curses_obsolete are defined if the +# library supports certain features present in SysV and BSD Curses but not +# defined in the X/Open definition. In particular, the functions +# getattrs(), getcurx() and getmaxx() are checked. +# +# To use the HAVE_xxx_H preprocessor symbols, insert the following into +# your system.h (or equivalent) header file: +# +# #if defined HAVE_NCURSESW_CURSES_H +# # include +# #elif defined HAVE_NCURSESW_H +# # include +# #elif defined HAVE_NCURSES_CURSES_H +# # include +# #elif defined HAVE_NCURSES_H +# # include +# #elif defined HAVE_CURSES_H +# # include +# #else +# # error "SysV or X/Open-compatible Curses header file required" +# #endif +# +# For previous users of this macro: you should not need to change anything +# in your configure.ac or Makefile.am, as the previous (serial 10) +# semantics are still valid. However, you should update your system.h (or +# equivalent) header file to the fragment shown above. You are encouraged +# also to make use of the extended functionality provided by this version +# of AX_WITH_CURSES, as well as in the additional macros +# AX_WITH_CURSES_PANEL, AX_WITH_CURSES_MENU and AX_WITH_CURSES_FORM. +# +# LICENSE +# +# Copyright (c) 2009 Mark Pulford +# Copyright (c) 2009 Damian Pietras +# Copyright (c) 2012 Reuben Thomas +# Copyright (c) 2011 John Zaitseff +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 13 + +AU_ALIAS([MP_WITH_CURSES], [AX_WITH_CURSES]) +AC_DEFUN([AX_WITH_CURSES], [ + AC_ARG_VAR([CURSES_LIB], [linker library for Curses, e.g. -lcurses]) + AC_ARG_WITH([ncurses], [AS_HELP_STRING([--with-ncurses], + [force the use of Ncurses or NcursesW])], + [], [with_ncurses=check]) + AC_ARG_WITH([ncursesw], [AS_HELP_STRING([--without-ncursesw], + [do not use NcursesW (wide character support)])], + [], [with_ncursesw=check]) + + ax_saved_LIBS=$LIBS + AS_IF([test "x$with_ncurses" = xyes || test "x$with_ncursesw" = xyes], + [ax_with_plaincurses=no], [ax_with_plaincurses=check]) + + ax_cv_curses_which=no + + # Test for NcursesW + + AS_IF([test "x$CURSES_LIB" = x && test "x$with_ncursesw" != xno], [ + LIBS="$ax_saved_LIBS -lncursesw" + + AC_CACHE_CHECK([for NcursesW wide-character library], [ax_cv_ncursesw], [ + AC_LINK_IFELSE([AC_LANG_CALL([], [initscr])], + [ax_cv_ncursesw=yes], [ax_cv_ncursesw=no]) + ]) + AS_IF([test "x$ax_cv_ncursesw" = xno && test "x$with_ncursesw" = xyes], [ + AC_MSG_ERROR([--with-ncursesw specified but could not find NcursesW library]) + ]) + + AS_IF([test "x$ax_cv_ncursesw" = xyes], [ + ax_cv_curses=yes + ax_cv_curses_which=ncursesw + CURSES_LIB="-lncursesw" + AC_DEFINE([HAVE_NCURSESW], [1], [Define to 1 if the NcursesW library is present]) + AC_DEFINE([HAVE_CURSES], [1], [Define to 1 if a SysV or X/Open compatible Curses library is present]) + + AC_CACHE_CHECK([for working ncursesw/curses.h], [ax_cv_header_ncursesw_curses_h], [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ + @%:@define _XOPEN_SOURCE_EXTENDED 1 + @%:@include + ]], [[ + chtype a = A_BOLD; + int b = KEY_LEFT; + chtype c = COLOR_PAIR(1) & A_COLOR; + attr_t d = WA_NORMAL; + cchar_t e; + wint_t f; + int g = getattrs(stdscr); + int h = getcurx(stdscr) + getmaxx(stdscr); + initscr(); + init_pair(1, COLOR_WHITE, COLOR_RED); + wattr_set(stdscr, d, 0, NULL); + wget_wch(stdscr, &f); + ]])], + [ax_cv_header_ncursesw_curses_h=yes], + [ax_cv_header_ncursesw_curses_h=no]) + ]) + AS_IF([test "x$ax_cv_header_ncursesw_curses_h" = xyes], [ + ax_cv_curses_enhanced=yes + ax_cv_curses_color=yes + ax_cv_curses_obsolete=yes + AC_DEFINE([HAVE_CURSES_ENHANCED], [1], [Define to 1 if library supports X/Open Enhanced functions]) + AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)]) + AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features]) + AC_DEFINE([HAVE_NCURSESW_CURSES_H], [1], [Define to 1 if is present]) + ]) + + AC_CACHE_CHECK([for working ncursesw.h], [ax_cv_header_ncursesw_h], [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ + @%:@define _XOPEN_SOURCE_EXTENDED 1 + @%:@include + ]], [[ + chtype a = A_BOLD; + int b = KEY_LEFT; + chtype c = COLOR_PAIR(1) & A_COLOR; + attr_t d = WA_NORMAL; + cchar_t e; + wint_t f; + int g = getattrs(stdscr); + int h = getcurx(stdscr) + getmaxx(stdscr); + initscr(); + init_pair(1, COLOR_WHITE, COLOR_RED); + wattr_set(stdscr, d, 0, NULL); + wget_wch(stdscr, &f); + ]])], + [ax_cv_header_ncursesw_h=yes], + [ax_cv_header_ncursesw_h=no]) + ]) + AS_IF([test "x$ax_cv_header_ncursesw_h" = xyes], [ + ax_cv_curses_enhanced=yes + ax_cv_curses_color=yes + ax_cv_curses_obsolete=yes + AC_DEFINE([HAVE_CURSES_ENHANCED], [1], [Define to 1 if library supports X/Open Enhanced functions]) + AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)]) + AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features]) + AC_DEFINE([HAVE_NCURSESW_H], [1], [Define to 1 if is present]) + ]) + + AC_CACHE_CHECK([for working ncurses.h], [ax_cv_header_ncurses_h_with_ncursesw], [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ + @%:@define _XOPEN_SOURCE_EXTENDED 1 + @%:@include + ]], [[ + chtype a = A_BOLD; + int b = KEY_LEFT; + chtype c = COLOR_PAIR(1) & A_COLOR; + attr_t d = WA_NORMAL; + cchar_t e; + wint_t f; + int g = getattrs(stdscr); + int h = getcurx(stdscr) + getmaxx(stdscr); + initscr(); + init_pair(1, COLOR_WHITE, COLOR_RED); + wattr_set(stdscr, d, 0, NULL); + wget_wch(stdscr, &f); + ]])], + [ax_cv_header_ncurses_h_with_ncursesw=yes], + [ax_cv_header_ncurses_h_with_ncursesw=no]) + ]) + AS_IF([test "x$ax_cv_header_ncurses_h_with_ncursesw" = xyes], [ + ax_cv_curses_enhanced=yes + ax_cv_curses_color=yes + ax_cv_curses_obsolete=yes + AC_DEFINE([HAVE_CURSES_ENHANCED], [1], [Define to 1 if library supports X/Open Enhanced functions]) + AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)]) + AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features]) + AC_DEFINE([HAVE_NCURSES_H], [1], [Define to 1 if is present]) + ]) + + AS_IF([test "x$ax_cv_header_ncursesw_curses_h" = xno && test "x$ax_cv_header_ncursesw_h" = xno && test "x$ax_cv_header_ncurses_h_with_ncursesw" = xno], [ + AC_MSG_WARN([could not find a working ncursesw/curses.h, ncursesw.h or ncurses.h]) + ]) + ]) + ]) + + # Test for Ncurses + + AS_IF([test "x$CURSES_LIB" = x && test "x$with_ncurses" != xno && test "x$ax_cv_curses_which" = xno], [ + LIBS="$ax_saved_LIBS -lncurses" + + AC_CACHE_CHECK([for Ncurses library], [ax_cv_ncurses], [ + AC_LINK_IFELSE([AC_LANG_CALL([], [initscr])], + [ax_cv_ncurses=yes], [ax_cv_ncurses=no]) + ]) + AS_IF([test "x$ax_cv_ncurses" = xno && test "x$with_ncurses" = xyes], [ + AC_MSG_ERROR([--with-ncurses specified but could not find Ncurses library]) + ]) + + AS_IF([test "x$ax_cv_ncurses" = xyes], [ + ax_cv_curses=yes + ax_cv_curses_which=ncurses + CURSES_LIB="-lncurses" + AC_DEFINE([HAVE_NCURSES], [1], [Define to 1 if the Ncurses library is present]) + AC_DEFINE([HAVE_CURSES], [1], [Define to 1 if a SysV or X/Open compatible Curses library is present]) + + AC_CACHE_CHECK([for working ncurses/curses.h], [ax_cv_header_ncurses_curses_h], [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ + @%:@include + ]], [[ + chtype a = A_BOLD; + int b = KEY_LEFT; + chtype c = COLOR_PAIR(1) & A_COLOR; + int g = getattrs(stdscr); + int h = getcurx(stdscr) + getmaxx(stdscr); + initscr(); + init_pair(1, COLOR_WHITE, COLOR_RED); + ]])], + [ax_cv_header_ncurses_curses_h=yes], + [ax_cv_header_ncurses_curses_h=no]) + ]) + AS_IF([test "x$ax_cv_header_ncurses_curses_h" = xyes], [ + ax_cv_curses_color=yes + ax_cv_curses_obsolete=yes + AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)]) + AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features]) + AC_DEFINE([HAVE_NCURSES_CURSES_H], [1], [Define to 1 if is present]) + ]) + + AC_CACHE_CHECK([for working ncurses.h], [ax_cv_header_ncurses_h], [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ + @%:@include + ]], [[ + chtype a = A_BOLD; + int b = KEY_LEFT; + chtype c = COLOR_PAIR(1) & A_COLOR; + int g = getattrs(stdscr); + int h = getcurx(stdscr) + getmaxx(stdscr); + initscr(); + init_pair(1, COLOR_WHITE, COLOR_RED); + ]])], + [ax_cv_header_ncurses_h=yes], + [ax_cv_header_ncurses_h=no]) + ]) + AS_IF([test "x$ax_cv_header_ncurses_h" = xyes], [ + ax_cv_curses_color=yes + ax_cv_curses_obsolete=yes + AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)]) + AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features]) + AC_DEFINE([HAVE_NCURSES_H], [1], [Define to 1 if is present]) + ]) + + AS_IF([test "x$ax_cv_header_ncurses_curses_h" = xno && test "x$ax_cv_header_ncurses_h" = xno], [ + AC_MSG_WARN([could not find a working ncurses/curses.h or ncurses.h]) + ]) + ]) + ]) + + # Test for plain Curses (or if CURSES_LIB was set by user) + + AS_IF([test "x$with_plaincurses" != xno && test "x$ax_cv_curses_which" = xno], [ + AS_IF([test "x$CURSES_LIB" != x], [ + LIBS="$ax_saved_LIBS $CURSES_LIB" + ], [ + LIBS="$ax_saved_LIBS -lcurses" + ]) + + AC_CACHE_CHECK([for Curses library], [ax_cv_plaincurses], [ + AC_LINK_IFELSE([AC_LANG_CALL([], [initscr])], + [ax_cv_plaincurses=yes], [ax_cv_plaincurses=no]) + ]) + + AS_IF([test "x$ax_cv_plaincurses" = xyes], [ + ax_cv_curses=yes + ax_cv_curses_which=plaincurses + AS_IF([test "x$CURSES_LIB" = x], [ + CURSES_LIB="-lcurses" + ]) + AC_DEFINE([HAVE_CURSES], [1], [Define to 1 if a SysV or X/Open compatible Curses library is present]) + + # Check for base conformance (and header file) + + AC_CACHE_CHECK([for working curses.h], [ax_cv_header_curses_h], [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ + @%:@include + ]], [[ + chtype a = A_BOLD; + int b = KEY_LEFT; + initscr(); + ]])], + [ax_cv_header_curses_h=yes], + [ax_cv_header_curses_h=no]) + ]) + AS_IF([test "x$ax_cv_header_curses_h" = xyes], [ + AC_DEFINE([HAVE_CURSES_H], [1], [Define to 1 if is present]) + + # Check for X/Open Enhanced conformance + + AC_CACHE_CHECK([for X/Open Enhanced Curses conformance], [ax_cv_plaincurses_enhanced], [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ + @%:@define _XOPEN_SOURCE_EXTENDED 1 + @%:@include + @%:@ifndef _XOPEN_CURSES + @%:@error "this Curses library is not enhanced" + "this Curses library is not enhanced" + @%:@endif + ]], [[ + chtype a = A_BOLD; + int b = KEY_LEFT; + chtype c = COLOR_PAIR(1) & A_COLOR; + attr_t d = WA_NORMAL; + cchar_t e; + wint_t f; + initscr(); + init_pair(1, COLOR_WHITE, COLOR_RED); + wattr_set(stdscr, d, 0, NULL); + wget_wch(stdscr, &f); + ]])], + [ax_cv_plaincurses_enhanced=yes], + [ax_cv_plaincurses_enhanced=no]) + ]) + AS_IF([test "x$ax_cv_plaincurses_enhanced" = xyes], [ + ax_cv_curses_enhanced=yes + ax_cv_curses_color=yes + AC_DEFINE([HAVE_CURSES_ENHANCED], [1], [Define to 1 if library supports X/Open Enhanced functions]) + AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)]) + ]) + + # Check for color functions + + AC_CACHE_CHECK([for Curses color functions], [ax_cv_plaincurses_color], [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ + @%:@define _XOPEN_SOURCE_EXTENDED 1 + @%:@include + ]], [[ + chtype a = A_BOLD; + int b = KEY_LEFT; + chtype c = COLOR_PAIR(1) & A_COLOR; + initscr(); + init_pair(1, COLOR_WHITE, COLOR_RED); + ]])], + [ax_cv_plaincurses_color=yes], + [ax_cv_plaincurses_color=no]) + ]) + AS_IF([test "x$ax_cv_plaincurses_color" = xyes], [ + ax_cv_curses_color=yes + AC_DEFINE([HAVE_CURSES_COLOR], [1], [Define to 1 if library supports color (enhanced functions)]) + ]) + + # Check for obsolete functions + + AC_CACHE_CHECK([for obsolete Curses functions], [ax_cv_plaincurses_obsolete], [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ + @%:@include + ]], [[ + chtype a = A_BOLD; + int b = KEY_LEFT; + int g = getattrs(stdscr); + int h = getcurx(stdscr) + getmaxx(stdscr); + initscr(); + ]])], + [ax_cv_plaincurses_obsolete=yes], + [ax_cv_plaincurses_obsolete=no]) + ]) + AS_IF([test "x$ax_cv_plaincurses_obsolete" = xyes], [ + ax_cv_curses_obsolete=yes + AC_DEFINE([HAVE_CURSES_OBSOLETE], [1], [Define to 1 if library supports certain obsolete features]) + ]) + ]) + + AS_IF([test "x$ax_cv_header_curses_h" = xno], [ + AC_MSG_WARN([could not find a working curses.h]) + ]) + ]) + ]) + + AS_IF([test "x$ax_cv_curses" != xyes], [ax_cv_curses=no]) + AS_IF([test "x$ax_cv_curses_enhanced" != xyes], [ax_cv_curses_enhanced=no]) + AS_IF([test "x$ax_cv_curses_color" != xyes], [ax_cv_curses_color=no]) + AS_IF([test "x$ax_cv_curses_obsolete" != xyes], [ax_cv_curses_obsolete=no]) + + LIBS=$ax_saved_LIBS +])dnl diff --git a/m4/gnulib-common.m4 b/m4/gnulib-common.m4 new file mode 100644 index 0000000..b301abe --- /dev/null +++ b/m4/gnulib-common.m4 @@ -0,0 +1,449 @@ +# gnulib-common.m4 serial 36 +dnl Copyright (C) 2007-2015 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +# gl_COMMON +# is expanded unconditionally through gnulib-tool magic. +AC_DEFUN([gl_COMMON], [ + dnl Use AC_REQUIRE here, so that the code is expanded once only. + AC_REQUIRE([gl_00GNULIB]) + AC_REQUIRE([gl_COMMON_BODY]) +]) +AC_DEFUN([gl_COMMON_BODY], [ + AH_VERBATIM([_Noreturn], +[/* The _Noreturn keyword of C11. */ +#if ! (defined _Noreturn \ + || (defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__)) +# if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \ + || 0x5110 <= __SUNPRO_C) +# define _Noreturn __attribute__ ((__noreturn__)) +# elif defined _MSC_VER && 1200 <= _MSC_VER +# define _Noreturn __declspec (noreturn) +# else +# define _Noreturn +# endif +#endif +]) + AH_VERBATIM([isoc99_inline], +[/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports + the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of + earlier versions), but does not display it by setting __GNUC_STDC_INLINE__. + __APPLE__ && __MACH__ test for Mac OS X. + __APPLE_CC__ tests for the Apple compiler and its version. + __STDC_VERSION__ tests for the C99 mode. */ +#if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__ +# define __GNUC_STDC_INLINE__ 1 +#endif]) + AH_VERBATIM([unused_parameter], +[/* Define as a marker that can be attached to declarations that might not + be used. This helps to reduce warnings, such as from + GCC -Wunused-parameter. */ +#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) +# define _GL_UNUSED __attribute__ ((__unused__)) +#else +# define _GL_UNUSED +#endif +/* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name + is a misnomer outside of parameter lists. */ +#define _UNUSED_PARAMETER_ _GL_UNUSED + +/* gcc supports the "unused" attribute on possibly unused labels, and + g++ has since version 4.5. Note to support C++ as well as C, + _GL_UNUSED_LABEL should be used with a trailing ; */ +#if !defined __cplusplus || __GNUC__ > 4 \ + || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) +# define _GL_UNUSED_LABEL _GL_UNUSED +#else +# define _GL_UNUSED_LABEL +#endif + +/* The __pure__ attribute was added in gcc 2.96. */ +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96) +# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__)) +#else +# define _GL_ATTRIBUTE_PURE /* empty */ +#endif + +/* The __const__ attribute was added in gcc 2.95. */ +#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) +# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__)) +#else +# define _GL_ATTRIBUTE_CONST /* empty */ +#endif +]) + dnl Preparation for running test programs: + dnl Tell glibc to write diagnostics from -D_FORTIFY_SOURCE=2 to stderr, not + dnl to /dev/tty, so they can be redirected to log files. Such diagnostics + dnl arise e.g., in the macros gl_PRINTF_DIRECTIVE_N, gl_SNPRINTF_DIRECTIVE_N. + LIBC_FATAL_STDERR_=1 + export LIBC_FATAL_STDERR_ +]) + +# gl_MODULE_INDICATOR_CONDITION +# expands to a C preprocessor expression that evaluates to 1 or 0, depending +# whether a gnulib module that has been requested shall be considered present +# or not. +m4_define([gl_MODULE_INDICATOR_CONDITION], [1]) + +# gl_MODULE_INDICATOR_SET_VARIABLE([modulename]) +# sets the shell variable that indicates the presence of the given module to +# a C preprocessor expression that will evaluate to 1. +AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE], +[ + gl_MODULE_INDICATOR_SET_VARIABLE_AUX( + [GNULIB_[]m4_translit([[$1]], + [abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])], + [gl_MODULE_INDICATOR_CONDITION]) +]) + +# gl_MODULE_INDICATOR_SET_VARIABLE_AUX([variable]) +# modifies the shell variable to include the gl_MODULE_INDICATOR_CONDITION. +# The shell variable's value is a C preprocessor expression that evaluates +# to 0 or 1. +AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX], +[ + m4_if(m4_defn([gl_MODULE_INDICATOR_CONDITION]), [1], + [ + dnl Simplify the expression VALUE || 1 to 1. + $1=1 + ], + [gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([$1], + [gl_MODULE_INDICATOR_CONDITION])]) +]) + +# gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR([variable], [condition]) +# modifies the shell variable to include the given condition. The shell +# variable's value is a C preprocessor expression that evaluates to 0 or 1. +AC_DEFUN([gl_MODULE_INDICATOR_SET_VARIABLE_AUX_OR], +[ + dnl Simplify the expression 1 || CONDITION to 1. + if test "$[]$1" != 1; then + dnl Simplify the expression 0 || CONDITION to CONDITION. + if test "$[]$1" = 0; then + $1=$2 + else + $1="($[]$1 || $2)" + fi + fi +]) + +# gl_MODULE_INDICATOR([modulename]) +# defines a C macro indicating the presence of the given module +# in a location where it can be used. +# | Value | Value | +# | in lib/ | in tests/ | +# --------------------------------------------+---------+-----------+ +# Module present among main modules: | 1 | 1 | +# --------------------------------------------+---------+-----------+ +# Module present among tests-related modules: | 0 | 1 | +# --------------------------------------------+---------+-----------+ +# Module not present at all: | 0 | 0 | +# --------------------------------------------+---------+-----------+ +AC_DEFUN([gl_MODULE_INDICATOR], +[ + AC_DEFINE_UNQUOTED([GNULIB_]m4_translit([[$1]], + [abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), + [gl_MODULE_INDICATOR_CONDITION], + [Define to a C preprocessor expression that evaluates to 1 or 0, + depending whether the gnulib module $1 shall be considered present.]) +]) + +# gl_MODULE_INDICATOR_FOR_TESTS([modulename]) +# defines a C macro indicating the presence of the given module +# in lib or tests. This is useful to determine whether the module +# should be tested. +# | Value | Value | +# | in lib/ | in tests/ | +# --------------------------------------------+---------+-----------+ +# Module present among main modules: | 1 | 1 | +# --------------------------------------------+---------+-----------+ +# Module present among tests-related modules: | 1 | 1 | +# --------------------------------------------+---------+-----------+ +# Module not present at all: | 0 | 0 | +# --------------------------------------------+---------+-----------+ +AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS], +[ + AC_DEFINE([GNULIB_TEST_]m4_translit([[$1]], + [abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___]), [1], + [Define to 1 when the gnulib module $1 should be tested.]) +]) + +# gl_ASSERT_NO_GNULIB_POSIXCHECK +# asserts that there will never be a need to #define GNULIB_POSIXCHECK. +# and thereby enables an optimization of configure and config.h. +# Used by Emacs. +AC_DEFUN([gl_ASSERT_NO_GNULIB_POSIXCHECK], +[ + dnl Override gl_WARN_ON_USE_PREPARE. + dnl But hide this definition from 'aclocal'. + AC_DEFUN([gl_W][ARN_ON_USE_PREPARE], []) +]) + +# gl_ASSERT_NO_GNULIB_TESTS +# asserts that there will be no gnulib tests in the scope of the configure.ac +# and thereby enables an optimization of config.h. +# Used by Emacs. +AC_DEFUN([gl_ASSERT_NO_GNULIB_TESTS], +[ + dnl Override gl_MODULE_INDICATOR_FOR_TESTS. + AC_DEFUN([gl_MODULE_INDICATOR_FOR_TESTS], []) +]) + +# Test whether exists. +# Set HAVE_FEATURES_H. +AC_DEFUN([gl_FEATURES_H], +[ + AC_CHECK_HEADERS_ONCE([features.h]) + if test $ac_cv_header_features_h = yes; then + HAVE_FEATURES_H=1 + else + HAVE_FEATURES_H=0 + fi + AC_SUBST([HAVE_FEATURES_H]) +]) + +# m4_foreach_w +# is a backport of autoconf-2.59c's m4_foreach_w. +# Remove this macro when we can assume autoconf >= 2.60. +m4_ifndef([m4_foreach_w], + [m4_define([m4_foreach_w], + [m4_foreach([$1], m4_split(m4_normalize([$2]), [ ]), [$3])])]) + +# AS_VAR_IF(VAR, VALUE, [IF-MATCH], [IF-NOT-MATCH]) +# ---------------------------------------------------- +# Backport of autoconf-2.63b's macro. +# Remove this macro when we can assume autoconf >= 2.64. +m4_ifndef([AS_VAR_IF], +[m4_define([AS_VAR_IF], +[AS_IF([test x"AS_VAR_GET([$1])" = x""$2], [$3], [$4])])]) + +# gl_PROG_CC_C99 +# Modifies the value of the shell variable CC in an attempt to make $CC +# understand ISO C99 source code. +# This is like AC_PROG_CC_C99, except that +# - AC_PROG_CC_C99 did not exist in Autoconf versions < 2.60, +# - AC_PROG_CC_C99 does not mix well with AC_PROG_CC_STDC +# , +# but many more packages use AC_PROG_CC_STDC than AC_PROG_CC_C99 +# . +# Remaining problems: +# - When AC_PROG_CC_STDC is invoked twice, it adds the C99 enabling options +# to CC twice +# . +# - AC_PROG_CC_STDC is likely to change now that C11 is an ISO standard. +AC_DEFUN([gl_PROG_CC_C99], +[ + dnl Change that version number to the minimum Autoconf version that supports + dnl mixing AC_PROG_CC_C99 calls with AC_PROG_CC_STDC calls. + m4_version_prereq([9.0], + [AC_REQUIRE([AC_PROG_CC_C99])], + [AC_REQUIRE([AC_PROG_CC_STDC])]) +]) + +# gl_PROG_AR_RANLIB +# Determines the values for AR, ARFLAGS, RANLIB that fit with the compiler. +# The user can set the variables AR, ARFLAGS, RANLIB if he wants to override +# the values. +AC_DEFUN([gl_PROG_AR_RANLIB], +[ + dnl Minix 3 comes with two toolchains: The Amsterdam Compiler Kit compiler + dnl as "cc", and GCC as "gcc". They have different object file formats and + dnl library formats. In particular, the GNU binutils programs ar, ranlib + dnl produce libraries that work only with gcc, not with cc. + AC_REQUIRE([AC_PROG_CC]) + AC_CACHE_CHECK([for Minix Amsterdam compiler], [gl_cv_c_amsterdam_compiler], + [ + AC_EGREP_CPP([Amsterdam], + [ +#ifdef __ACK__ +Amsterdam +#endif + ], + [gl_cv_c_amsterdam_compiler=yes], + [gl_cv_c_amsterdam_compiler=no]) + ]) + if test -z "$AR"; then + if test $gl_cv_c_amsterdam_compiler = yes; then + AR='cc -c.a' + if test -z "$ARFLAGS"; then + ARFLAGS='-o' + fi + else + dnl Use the Automake-documented default values for AR and ARFLAGS, + dnl but prefer ${host}-ar over ar (useful for cross-compiling). + AC_CHECK_TOOL([AR], [ar], [ar]) + if test -z "$ARFLAGS"; then + ARFLAGS='cru' + fi + fi + else + if test -z "$ARFLAGS"; then + ARFLAGS='cru' + fi + fi + AC_SUBST([AR]) + AC_SUBST([ARFLAGS]) + if test -z "$RANLIB"; then + if test $gl_cv_c_amsterdam_compiler = yes; then + RANLIB=':' + else + dnl Use the ranlib program if it is available. + AC_PROG_RANLIB + fi + fi + AC_SUBST([RANLIB]) +]) + +# AC_PROG_MKDIR_P +# is a backport of autoconf-2.60's AC_PROG_MKDIR_P, with a fix +# for interoperability with automake-1.9.6 from autoconf-2.62. +# Remove this macro when we can assume autoconf >= 2.62 or +# autoconf >= 2.60 && automake >= 1.10. +# AC_AUTOCONF_VERSION was introduced in 2.62, so use that as the witness. +m4_ifndef([AC_AUTOCONF_VERSION],[ +m4_ifdef([AC_PROG_MKDIR_P], [ + dnl For automake-1.9.6 && autoconf < 2.62: Ensure MKDIR_P is AC_SUBSTed. + m4_define([AC_PROG_MKDIR_P], + m4_defn([AC_PROG_MKDIR_P])[ + AC_SUBST([MKDIR_P])])], [ + dnl For autoconf < 2.60: Backport of AC_PROG_MKDIR_P. + AC_DEFUN_ONCE([AC_PROG_MKDIR_P], + [AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake + MKDIR_P='$(mkdir_p)' + AC_SUBST([MKDIR_P])])]) +]) + +# AC_C_RESTRICT +# This definition is copied from post-2.69 Autoconf and overrides the +# AC_C_RESTRICT macro from autoconf 2.60..2.69. It can be removed +# once autoconf >= 2.70 can be assumed. It's painful to check version +# numbers, and in practice this macro is more up-to-date than Autoconf +# is, so override Autoconf unconditionally. +AC_DEFUN([AC_C_RESTRICT], +[AC_CACHE_CHECK([for C/C++ restrict keyword], [ac_cv_c_restrict], + [ac_cv_c_restrict=no + # The order here caters to the fact that C++ does not require restrict. + for ac_kw in __restrict __restrict__ _Restrict restrict; do + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[typedef int *int_ptr; + int foo (int_ptr $ac_kw ip) { return ip[0]; } + int bar (int [$ac_kw]); /* Catch GCC bug 14050. */ + int bar (int ip[$ac_kw]) { return ip[0]; } + ]], + [[int s[1]; + int *$ac_kw t = s; + t[0] = 0; + return foo (t) + bar (t); + ]])], + [ac_cv_c_restrict=$ac_kw]) + test "$ac_cv_c_restrict" != no && break + done + ]) + AH_VERBATIM([restrict], +[/* Define to the equivalent of the C99 'restrict' keyword, or to + nothing if this is not supported. Do not define if restrict is + supported directly. */ +#undef restrict +/* Work around a bug in Sun C++: it does not support _Restrict or + __restrict__, even though the corresponding Sun C compiler ends up with + "#define restrict _Restrict" or "#define restrict __restrict__" in the + previous line. Perhaps some future version of Sun C++ will work with + restrict; if so, hopefully it defines __RESTRICT like Sun C does. */ +#if defined __SUNPRO_CC && !defined __RESTRICT +# define _Restrict +# define __restrict__ +#endif]) + case $ac_cv_c_restrict in + restrict) ;; + no) AC_DEFINE([restrict], []) ;; + *) AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;; + esac +])# AC_C_RESTRICT + +# gl_BIGENDIAN +# is like AC_C_BIGENDIAN, except that it can be AC_REQUIREd. +# Note that AC_REQUIRE([AC_C_BIGENDIAN]) does not work reliably because some +# macros invoke AC_C_BIGENDIAN with arguments. +AC_DEFUN([gl_BIGENDIAN], +[ + AC_C_BIGENDIAN +]) + +# gl_CACHE_VAL_SILENT(cache-id, command-to-set-it) +# is like AC_CACHE_VAL(cache-id, command-to-set-it), except that it does not +# output a spurious "(cached)" mark in the midst of other configure output. +# This macro should be used instead of AC_CACHE_VAL when it is not surrounded +# by an AC_MSG_CHECKING/AC_MSG_RESULT pair. +AC_DEFUN([gl_CACHE_VAL_SILENT], +[ + saved_as_echo_n="$as_echo_n" + as_echo_n=':' + AC_CACHE_VAL([$1], [$2]) + as_echo_n="$saved_as_echo_n" +]) + +# AS_VAR_COPY was added in autoconf 2.63b +m4_define_default([AS_VAR_COPY], +[AS_LITERAL_IF([$1[]$2], [$1=$$2], [eval $1=\$$2])]) + +# AC_PROG_SED was added in autoconf 2.59b +m4_ifndef([AC_PROG_SED], +[AC_DEFUN([AC_PROG_SED], +[AC_CACHE_CHECK([for a sed that does not truncate output], ac_cv_path_SED, + [dnl ac_script should not contain more than 99 commands (for HP-UX sed), + dnl but more than about 7000 bytes, to catch a limit in Solaris 8 /usr/ucb/sed. + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + AS_UNSET([ac_script]) + if test -z "$SED"; then + ac_path_SED_found=false + _AS_PATH_WALK([], [ + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + AS_EXECUTABLE_P(["$ac_path_SED"]) || continue + case `"$ac_path_SED" --version 2>&1` in + *GNU*) ac_cv_path_SED=$ac_path_SED ac_path_SED_found=:;; + *) + ac_count=0 + _AS_ECHO_N([0123456789]) >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >> conftest.nl + "$ac_path_SED" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best so far, but keep looking for better + ac_cv_path_SED=$ac_path_SED + ac_path_SED_max=$ac_count + fi + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; + esac + $ac_path_SED_found && break 3 + done + done]) + if test -z "$ac_cv_path_SED"; then + AC_ERROR([no acceptable sed could be found in \$PATH]) + fi + else + ac_cv_path_SED=$SED + fi + SED="$ac_cv_path_SED" + AC_SUBST([SED])dnl + rm -f conftest.sed +])])]) diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4 new file mode 100644 index 0000000..35a237f --- /dev/null +++ b/m4/gnulib-comp.m4 @@ -0,0 +1,200 @@ +# DO NOT EDIT! GENERATED AUTOMATICALLY! +# Copyright (C) 2002-2015 Free Software Foundation, Inc. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This file is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this file. If not, see . +# +# As a special exception to the GNU General Public License, +# this file may be distributed as part of a program that +# contains a configuration script generated by Autoconf, under +# the same distribution terms as the rest of that program. +# +# Generated by gnulib-tool. +# +# This file represents the compiled summary of the specification in +# gnulib-cache.m4. It lists the computed macro invocations that need +# to be invoked from configure.ac. +# In projects that use version control, this file can be treated like +# other built files. + + +# This macro should be invoked from ./configure.ac, in the section +# "Checks for programs", right after AC_PROG_CC, and certainly before +# any checks for libraries, header files, types and library functions. +AC_DEFUN([gl_EARLY], +[ + m4_pattern_forbid([^gl_[A-Z]])dnl the gnulib macro namespace + m4_pattern_allow([^gl_ES$])dnl a valid locale name + m4_pattern_allow([^gl_LIBOBJS$])dnl a variable + m4_pattern_allow([^gl_LTLIBOBJS$])dnl a variable + AC_REQUIRE([gl_PROG_AR_RANLIB]) + # Code from module manywarnings: + # Code from module warnings: +]) + +# This macro should be invoked from ./configure.ac, in the section +# "Check for header files, types and library functions". +AC_DEFUN([gl_INIT], +[ + AM_CONDITIONAL([GL_COND_LIBTOOL], [true]) + gl_cond_libtool=true + gl_m4_base='m4' + m4_pushdef([AC_LIBOBJ], m4_defn([gl_LIBOBJ])) + m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gl_REPLACE_FUNCS])) + m4_pushdef([AC_LIBSOURCES], m4_defn([gl_LIBSOURCES])) + m4_pushdef([gl_LIBSOURCES_LIST], []) + m4_pushdef([gl_LIBSOURCES_DIR], []) + gl_COMMON + gl_source_base='unused' + # End of code from modules + m4_ifval(gl_LIBSOURCES_LIST, [ + m4_syscmd([test ! -d ]m4_defn([gl_LIBSOURCES_DIR])[ || + for gl_file in ]gl_LIBSOURCES_LIST[ ; do + if test ! -r ]m4_defn([gl_LIBSOURCES_DIR])[/$gl_file ; then + echo "missing file ]m4_defn([gl_LIBSOURCES_DIR])[/$gl_file" >&2 + exit 1 + fi + done])dnl + m4_if(m4_sysval, [0], [], + [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])]) + ]) + m4_popdef([gl_LIBSOURCES_DIR]) + m4_popdef([gl_LIBSOURCES_LIST]) + m4_popdef([AC_LIBSOURCES]) + m4_popdef([AC_REPLACE_FUNCS]) + m4_popdef([AC_LIBOBJ]) + AC_CONFIG_COMMANDS_PRE([ + gl_libobjs= + gl_ltlibobjs= + if test -n "$gl_LIBOBJS"; then + # Remove the extension. + sed_drop_objext='s/\.o$//;s/\.obj$//' + for i in `for i in $gl_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do + gl_libobjs="$gl_libobjs $i.$ac_objext" + gl_ltlibobjs="$gl_ltlibobjs $i.lo" + done + fi + AC_SUBST([gl_LIBOBJS], [$gl_libobjs]) + AC_SUBST([gl_LTLIBOBJS], [$gl_ltlibobjs]) + ]) + gltests_libdeps= + gltests_ltlibdeps= + m4_pushdef([AC_LIBOBJ], m4_defn([gltests_LIBOBJ])) + m4_pushdef([AC_REPLACE_FUNCS], m4_defn([gltests_REPLACE_FUNCS])) + m4_pushdef([AC_LIBSOURCES], m4_defn([gltests_LIBSOURCES])) + m4_pushdef([gltests_LIBSOURCES_LIST], []) + m4_pushdef([gltests_LIBSOURCES_DIR], []) + gl_COMMON + gl_source_base='tests' +changequote(,)dnl + gltests_WITNESS=IN_`echo "${PACKAGE-$PACKAGE_TARNAME}" | LC_ALL=C tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ | LC_ALL=C sed -e 's/[^A-Z0-9_]/_/g'`_GNULIB_TESTS +changequote([, ])dnl + AC_SUBST([gltests_WITNESS]) + gl_module_indicator_condition=$gltests_WITNESS + m4_pushdef([gl_MODULE_INDICATOR_CONDITION], [$gl_module_indicator_condition]) + m4_popdef([gl_MODULE_INDICATOR_CONDITION]) + m4_ifval(gltests_LIBSOURCES_LIST, [ + m4_syscmd([test ! -d ]m4_defn([gltests_LIBSOURCES_DIR])[ || + for gl_file in ]gltests_LIBSOURCES_LIST[ ; do + if test ! -r ]m4_defn([gltests_LIBSOURCES_DIR])[/$gl_file ; then + echo "missing file ]m4_defn([gltests_LIBSOURCES_DIR])[/$gl_file" >&2 + exit 1 + fi + done])dnl + m4_if(m4_sysval, [0], [], + [AC_FATAL([expected source file, required through AC_LIBSOURCES, not found])]) + ]) + m4_popdef([gltests_LIBSOURCES_DIR]) + m4_popdef([gltests_LIBSOURCES_LIST]) + m4_popdef([AC_LIBSOURCES]) + m4_popdef([AC_REPLACE_FUNCS]) + m4_popdef([AC_LIBOBJ]) + AC_CONFIG_COMMANDS_PRE([ + gltests_libobjs= + gltests_ltlibobjs= + if test -n "$gltests_LIBOBJS"; then + # Remove the extension. + sed_drop_objext='s/\.o$//;s/\.obj$//' + for i in `for i in $gltests_LIBOBJS; do echo "$i"; done | sed -e "$sed_drop_objext" | sort | uniq`; do + gltests_libobjs="$gltests_libobjs $i.$ac_objext" + gltests_ltlibobjs="$gltests_ltlibobjs $i.lo" + done + fi + AC_SUBST([gltests_LIBOBJS], [$gltests_libobjs]) + AC_SUBST([gltests_LTLIBOBJS], [$gltests_ltlibobjs]) + ]) +]) + +# Like AC_LIBOBJ, except that the module name goes +# into gl_LIBOBJS instead of into LIBOBJS. +AC_DEFUN([gl_LIBOBJ], [ + AS_LITERAL_IF([$1], [gl_LIBSOURCES([$1.c])])dnl + gl_LIBOBJS="$gl_LIBOBJS $1.$ac_objext" +]) + +# Like AC_REPLACE_FUNCS, except that the module name goes +# into gl_LIBOBJS instead of into LIBOBJS. +AC_DEFUN([gl_REPLACE_FUNCS], [ + m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl + AC_CHECK_FUNCS([$1], , [gl_LIBOBJ($ac_func)]) +]) + +# Like AC_LIBSOURCES, except the directory where the source file is +# expected is derived from the gnulib-tool parameterization, +# and alloca is special cased (for the alloca-opt module). +# We could also entirely rely on EXTRA_lib..._SOURCES. +AC_DEFUN([gl_LIBSOURCES], [ + m4_foreach([_gl_NAME], [$1], [ + m4_if(_gl_NAME, [alloca.c], [], [ + m4_define([gl_LIBSOURCES_DIR], [unused]) + m4_append([gl_LIBSOURCES_LIST], _gl_NAME, [ ]) + ]) + ]) +]) + +# Like AC_LIBOBJ, except that the module name goes +# into gltests_LIBOBJS instead of into LIBOBJS. +AC_DEFUN([gltests_LIBOBJ], [ + AS_LITERAL_IF([$1], [gltests_LIBSOURCES([$1.c])])dnl + gltests_LIBOBJS="$gltests_LIBOBJS $1.$ac_objext" +]) + +# Like AC_REPLACE_FUNCS, except that the module name goes +# into gltests_LIBOBJS instead of into LIBOBJS. +AC_DEFUN([gltests_REPLACE_FUNCS], [ + m4_foreach_w([gl_NAME], [$1], [AC_LIBSOURCES(gl_NAME[.c])])dnl + AC_CHECK_FUNCS([$1], , [gltests_LIBOBJ($ac_func)]) +]) + +# Like AC_LIBSOURCES, except the directory where the source file is +# expected is derived from the gnulib-tool parameterization, +# and alloca is special cased (for the alloca-opt module). +# We could also entirely rely on EXTRA_lib..._SOURCES. +AC_DEFUN([gltests_LIBSOURCES], [ + m4_foreach([_gl_NAME], [$1], [ + m4_if(_gl_NAME, [alloca.c], [], [ + m4_define([gltests_LIBSOURCES_DIR], [tests]) + m4_append([gltests_LIBSOURCES_LIST], _gl_NAME, [ ]) + ]) + ]) +]) + +# This macro records the list of files which have been installed by +# gnulib-tool and may be removed by future gnulib-tool invocations. +AC_DEFUN([gl_FILE_LIST], [ + m4/00gnulib.m4 + m4/gnulib-common.m4 + m4/manywarnings.m4 + m4/onceonly.m4 + m4/warnings.m4 +]) diff --git a/m4/libtool.m4 b/m4/libtool.m4 new file mode 100644 index 0000000..a3bc337 --- /dev/null +++ b/m4/libtool.m4 @@ -0,0 +1,8369 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +]) + +# serial 58 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + +# _LT_CC_BASENAME(CC) +# ------------------- +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. +m4_defun([_LT_CC_BASENAME], +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl +m4_require([_LT_CMD_TRUNCATE])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from 'configure', and 'config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# 'config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain=$ac_aux_dir/ltmain.sh +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the 'libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to 'config.status' so that its +# declaration there will have the same value as in 'configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags='_LT_TAGS'dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into 'config.status', and then the shell code to quote escape them in +# for loops in 'config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# '#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test 0 = "$lt_write_fail" && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +'$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test 0 != $[#] +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try '$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try '$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test yes = "$silent" && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +_LT_COPYING +_LT_LIBTOOL_TAGS + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS=$save_LDFLAGS + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + 10.[[012]][[,.]]*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test yes = "$lt_cv_ld_force_load"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + m4_if([$1], [CXX], +[ if test yes != "$lt_cv_apple_cc_single_mod"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script that will find a shell with a builtin +# printf (that we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case $ECHO in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([$with_sysroot]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and where our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test yes = "[$]$2"; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS +]) + +if test yes = "[$]$2"; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n "$lt_cv_sys_max_cmd_len"; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes = "$cross_compiling"; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen=shl_load], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen=dlopen], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links=nottested +if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test no = "$hard_links"; then + AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", + [Define to the sub-directory where libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then + + # We can hardcode non-existent directories. + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program that can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$1"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac]) +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program that can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test no = "$withval" || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[[4-9]]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[[45]]*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi]) +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM=-lm) + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test yes = "$GCC"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS=$save_LDFLAGS]) + if test yes = "$lt_cv_irix_exported_symbol"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + osf3*) + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting $shlibpath_var if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC=$CC +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report what library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC=$lt_save_CC +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + + _LT_TAGVAR(GCC, $1)=$GXX + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)=$prev$p + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)=$p + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)=$p + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test no = "$F77"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_F77"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$G77 + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test no = "$FC"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_FC"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_FC" + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code=$lt_simple_compile_test_code + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f "$lt_ac_sed" && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test 10 -lt "$lt_ac_count" && break + lt_ac_count=`expr $lt_ac_count + 1` + if test "$lt_ac_count" -gt "$lt_ac_max"; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine what file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/m4/ltoptions.m4 b/m4/ltoptions.m4 new file mode 100644 index 0000000..94b0829 --- /dev/null +++ b/m4/ltoptions.m4 @@ -0,0 +1,437 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 8 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option '$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl 'shared' nor 'disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the 'shared' and +# 'disable-shared' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the 'static' and +# 'disable-static' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the 'fast-install' +# and 'disable-fast-install' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' +# LT_INIT options. +# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [pic_mode=m4_default([$1], [default])]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4 new file mode 100644 index 0000000..48bc934 --- /dev/null +++ b/m4/ltsugar.m4 @@ -0,0 +1,124 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59, which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/m4/ltversion.m4 b/m4/ltversion.m4 new file mode 100644 index 0000000..fa04b52 --- /dev/null +++ b/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 4179 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.6]) +m4_define([LT_PACKAGE_REVISION], [2.4.6]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.6' +macro_revision='2.4.6' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/m4/lt~obsolete.m4 b/m4/lt~obsolete.m4 new file mode 100644 index 0000000..c6b26f8 --- /dev/null +++ b/m4/lt~obsolete.m4 @@ -0,0 +1,99 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/m4/manywarnings.m4 b/m4/manywarnings.m4 new file mode 100644 index 0000000..44da98e --- /dev/null +++ b/m4/manywarnings.m4 @@ -0,0 +1,245 @@ +# manywarnings.m4 serial 7 +dnl Copyright (C) 2008-2015 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Simon Josefsson + +# gl_MANYWARN_COMPLEMENT(OUTVAR, LISTVAR, REMOVEVAR) +# -------------------------------------------------- +# Copy LISTVAR to OUTVAR except for the entries in REMOVEVAR. +# Elements separated by whitespace. In set logic terms, the function +# does OUTVAR = LISTVAR \ REMOVEVAR. +AC_DEFUN([gl_MANYWARN_COMPLEMENT], +[ + gl_warn_set= + set x $2; shift + for gl_warn_item + do + case " $3 " in + *" $gl_warn_item "*) + ;; + *) + gl_warn_set="$gl_warn_set $gl_warn_item" + ;; + esac + done + $1=$gl_warn_set +]) + +# gl_MANYWARN_ALL_GCC(VARIABLE) +# ----------------------------- +# Add all documented GCC warning parameters to variable VARIABLE. +# Note that you need to test them using gl_WARN_ADD if you want to +# make sure your gcc understands it. +AC_DEFUN([gl_MANYWARN_ALL_GCC], +[ + dnl First, check for some issues that only occur when combining multiple + dnl gcc warning categories. + AC_REQUIRE([AC_PROG_CC]) + if test -n "$GCC"; then + + dnl Check if -W -Werror -Wno-missing-field-initializers is supported + dnl with the current $CC $CFLAGS $CPPFLAGS. + AC_MSG_CHECKING([whether -Wno-missing-field-initializers is supported]) + AC_CACHE_VAL([gl_cv_cc_nomfi_supported], [ + gl_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -W -Werror -Wno-missing-field-initializers" + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[]], [[]])], + [gl_cv_cc_nomfi_supported=yes], + [gl_cv_cc_nomfi_supported=no]) + CFLAGS="$gl_save_CFLAGS"]) + AC_MSG_RESULT([$gl_cv_cc_nomfi_supported]) + + if test "$gl_cv_cc_nomfi_supported" = yes; then + dnl Now check whether -Wno-missing-field-initializers is needed + dnl for the { 0, } construct. + AC_MSG_CHECKING([whether -Wno-missing-field-initializers is needed]) + AC_CACHE_VAL([gl_cv_cc_nomfi_needed], [ + gl_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -W -Werror" + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[void f (void) + { + typedef struct { int a; int b; } s_t; + s_t s1 = { 0, }; + } + ]], + [[]])], + [gl_cv_cc_nomfi_needed=no], + [gl_cv_cc_nomfi_needed=yes]) + CFLAGS="$gl_save_CFLAGS" + ]) + AC_MSG_RESULT([$gl_cv_cc_nomfi_needed]) + fi + + dnl Next, check if -Werror -Wuninitialized is useful with the + dnl user's choice of $CFLAGS; some versions of gcc warn that it + dnl has no effect if -O is not also used + AC_MSG_CHECKING([whether -Wuninitialized is supported]) + AC_CACHE_VAL([gl_cv_cc_uninitialized_supported], [ + gl_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Werror -Wuninitialized" + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[]], [[]])], + [gl_cv_cc_uninitialized_supported=yes], + [gl_cv_cc_uninitialized_supported=no]) + CFLAGS="$gl_save_CFLAGS"]) + AC_MSG_RESULT([$gl_cv_cc_uninitialized_supported]) + + fi + + # List all gcc warning categories. + # To compare this list to your installed GCC's, run this Bash command: + # + # comm -3 \ + # <(sed -n 's/^ *\(-[^ ]*\) .*/\1/p' manywarnings.m4 | sort) \ + # <(gcc --help=warnings | sed -n 's/^ \(-[^ ]*\) .*/\1/p' | sort | + # grep -v -x -f <( + # awk '/^[^#]/ {print $1}' ../build-aux/gcc-warning.spec)) + + gl_manywarn_set= + for gl_manywarn_item in \ + -W \ + -Wabi \ + -Waddress \ + -Waggressive-loop-optimizations \ + -Wall \ + -Warray-bounds \ + -Wattributes \ + -Wbad-function-cast \ + -Wbuiltin-macro-redefined \ + -Wcast-align \ + -Wchar-subscripts \ + -Wclobbered \ + -Wcomment \ + -Wcomments \ + -Wcoverage-mismatch \ + -Wcpp \ + -Wdate-time \ + -Wdeprecated \ + -Wdeprecated-declarations \ + -Wdisabled-optimization \ + -Wdiv-by-zero \ + -Wdouble-promotion \ + -Wempty-body \ + -Wendif-labels \ + -Wenum-compare \ + -Wextra \ + -Wformat-contains-nul \ + -Wformat-extra-args \ + -Wformat-nonliteral \ + -Wformat-security \ + -Wformat-y2k \ + -Wformat-zero-length \ + -Wfree-nonheap-object \ + -Wignored-qualifiers \ + -Wimplicit \ + -Wimplicit-function-declaration \ + -Wimplicit-int \ + -Winit-self \ + -Winline \ + -Wint-to-pointer-cast \ + -Winvalid-memory-model \ + -Winvalid-pch \ + -Wjump-misses-init \ + -Wlogical-op \ + -Wmain \ + -Wmaybe-uninitialized \ + -Wmissing-braces \ + -Wmissing-declarations \ + -Wmissing-field-initializers \ + -Wmissing-include-dirs \ + -Wmissing-parameter-type \ + -Wmissing-prototypes \ + -Wmultichar \ + -Wnarrowing \ + -Wnested-externs \ + -Wnonnull \ + -Wold-style-declaration \ + -Wold-style-definition \ + -Wopenmp-simd \ + -Woverflow \ + -Woverlength-strings \ + -Woverride-init \ + -Wpacked \ + -Wpacked-bitfield-compat \ + -Wparentheses \ + -Wpointer-arith \ + -Wpointer-sign \ + -Wpointer-to-int-cast \ + -Wpragmas \ + -Wreturn-local-addr \ + -Wreturn-type \ + -Wsequence-point \ + -Wshadow \ + -Wsizeof-pointer-memaccess \ + -Wstack-protector \ + -Wstrict-aliasing \ + -Wstrict-overflow \ + -Wstrict-prototypes \ + -Wsuggest-attribute=const \ + -Wsuggest-attribute=format \ + -Wsuggest-attribute=noreturn \ + -Wsuggest-attribute=pure \ + -Wswitch \ + -Wswitch-default \ + -Wsync-nand \ + -Wsystem-headers \ + -Wtrampolines \ + -Wtrigraphs \ + -Wtype-limits \ + -Wuninitialized \ + -Wunknown-pragmas \ + -Wunsafe-loop-optimizations \ + -Wunused \ + -Wunused-but-set-parameter \ + -Wunused-but-set-variable \ + -Wunused-function \ + -Wunused-label \ + -Wunused-local-typedefs \ + -Wunused-macros \ + -Wunused-parameter \ + -Wunused-result \ + -Wunused-value \ + -Wunused-variable \ + -Wvarargs \ + -Wvariadic-macros \ + -Wvector-operation-performance \ + -Wvla \ + -Wvolatile-register-var \ + -Wwrite-strings \ + \ + ; do + gl_manywarn_set="$gl_manywarn_set $gl_manywarn_item" + done + + # gcc --help=warnings outputs an unusual form for this option; list + # it here so that the above 'comm' command doesn't report a false match. + gl_manywarn_set="$gl_manywarn_set -Wnormalized=nfc" + + # These are needed for older GCC versions. + if test -n "$GCC"; then + case `($CC --version) 2>/dev/null` in + 'gcc (GCC) '[[0-3]].* | \ + 'gcc (GCC) '4.[[0-7]].*) + gl_manywarn_set="$gl_manywarn_set -fdiagnostics-show-option" + gl_manywarn_set="$gl_manywarn_set -funit-at-a-time" + ;; + esac + fi + + # Disable specific options as needed. + if test "$gl_cv_cc_nomfi_needed" = yes; then + gl_manywarn_set="$gl_manywarn_set -Wno-missing-field-initializers" + fi + + if test "$gl_cv_cc_uninitialized_supported" = no; then + gl_manywarn_set="$gl_manywarn_set -Wno-uninitialized" + fi + + $1=$gl_manywarn_set +]) diff --git a/m4/onceonly.m4 b/m4/onceonly.m4 new file mode 100644 index 0000000..cb5872c --- /dev/null +++ b/m4/onceonly.m4 @@ -0,0 +1,104 @@ +# onceonly.m4 serial 9 +dnl Copyright (C) 2002-2003, 2005-2006, 2008-2015 Free Software Foundation, +dnl Inc. +dnl +dnl This file is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 3 of the License, or +dnl (at your option) any later version. +dnl +dnl This file is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this file. If not, see . +dnl +dnl As a special exception to the GNU General Public License, +dnl this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl This file defines some "once only" variants of standard autoconf macros. +dnl AC_CHECK_HEADERS_ONCE like AC_CHECK_HEADERS +dnl AC_CHECK_FUNCS_ONCE like AC_CHECK_FUNCS +dnl AC_CHECK_DECLS_ONCE like AC_CHECK_DECLS +dnl AC_REQUIRE([AC_FUNC_STRCOLL]) like AC_FUNC_STRCOLL +dnl The advantage is that the check for each of the headers/functions/decls +dnl will be put only once into the 'configure' file. It keeps the size of +dnl the 'configure' file down, and avoids redundant output when 'configure' +dnl is run. +dnl The drawback is that the checks cannot be conditionalized. If you write +dnl if some_condition; then gl_CHECK_HEADERS(stdlib.h); fi +dnl inside an AC_DEFUNed function, the gl_CHECK_HEADERS macro call expands to +dnl empty, and the check will be inserted before the body of the AC_DEFUNed +dnl function. + +dnl The original code implemented AC_CHECK_HEADERS_ONCE and AC_CHECK_FUNCS_ONCE +dnl in terms of AC_DEFUN and AC_REQUIRE. This implementation uses diversions to +dnl named sections DEFAULTS and INIT_PREPARE in order to check all requested +dnl headers at once, thus reducing the size of 'configure'. It is known to work +dnl with autoconf 2.57..2.62 at least . The size reduction is ca. 9%. + +dnl Autoconf version 2.59 plus gnulib is required; this file is not needed +dnl with Autoconf 2.60 or greater. But note that autoconf's implementation of +dnl AC_CHECK_DECLS_ONCE expects a comma-separated list of symbols as first +dnl argument! +AC_PREREQ([2.59]) + +# AC_CHECK_HEADERS_ONCE(HEADER1 HEADER2 ...) is a once-only variant of +# AC_CHECK_HEADERS(HEADER1 HEADER2 ...). +AC_DEFUN([AC_CHECK_HEADERS_ONCE], [ + : + m4_foreach_w([gl_HEADER_NAME], [$1], [ + AC_DEFUN([gl_CHECK_HEADER_]m4_quote(m4_translit(gl_HEADER_NAME, + [./-], [___])), [ + m4_divert_text([INIT_PREPARE], + [gl_header_list="$gl_header_list gl_HEADER_NAME"]) + gl_HEADERS_EXPANSION + AH_TEMPLATE(AS_TR_CPP([HAVE_]m4_defn([gl_HEADER_NAME])), + [Define to 1 if you have the <]m4_defn([gl_HEADER_NAME])[> header file.]) + ]) + AC_REQUIRE([gl_CHECK_HEADER_]m4_quote(m4_translit(gl_HEADER_NAME, + [./-], [___]))) + ]) +]) +m4_define([gl_HEADERS_EXPANSION], [ + m4_divert_text([DEFAULTS], [gl_header_list=]) + AC_CHECK_HEADERS([$gl_header_list]) + m4_define([gl_HEADERS_EXPANSION], []) +]) + +# AC_CHECK_FUNCS_ONCE(FUNC1 FUNC2 ...) is a once-only variant of +# AC_CHECK_FUNCS(FUNC1 FUNC2 ...). +AC_DEFUN([AC_CHECK_FUNCS_ONCE], [ + : + m4_foreach_w([gl_FUNC_NAME], [$1], [ + AC_DEFUN([gl_CHECK_FUNC_]m4_defn([gl_FUNC_NAME]), [ + m4_divert_text([INIT_PREPARE], + [gl_func_list="$gl_func_list gl_FUNC_NAME"]) + gl_FUNCS_EXPANSION + AH_TEMPLATE(AS_TR_CPP([HAVE_]m4_defn([gl_FUNC_NAME])), + [Define to 1 if you have the ']m4_defn([gl_FUNC_NAME])[' function.]) + ]) + AC_REQUIRE([gl_CHECK_FUNC_]m4_defn([gl_FUNC_NAME])) + ]) +]) +m4_define([gl_FUNCS_EXPANSION], [ + m4_divert_text([DEFAULTS], [gl_func_list=]) + AC_CHECK_FUNCS([$gl_func_list]) + m4_define([gl_FUNCS_EXPANSION], []) +]) + +# AC_CHECK_DECLS_ONCE(DECL1 DECL2 ...) is a once-only variant of +# AC_CHECK_DECLS(DECL1, DECL2, ...). +AC_DEFUN([AC_CHECK_DECLS_ONCE], [ + : + m4_foreach_w([gl_DECL_NAME], [$1], [ + AC_DEFUN([gl_CHECK_DECL_]m4_defn([gl_DECL_NAME]), [ + AC_CHECK_DECLS(m4_defn([gl_DECL_NAME])) + ]) + AC_REQUIRE([gl_CHECK_DECL_]m4_defn([gl_DECL_NAME])) + ]) +]) diff --git a/m4/warnings.m4 b/m4/warnings.m4 new file mode 100644 index 0000000..5ae01de --- /dev/null +++ b/m4/warnings.m4 @@ -0,0 +1,79 @@ +# warnings.m4 serial 11 +dnl Copyright (C) 2008-2015 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +dnl From Simon Josefsson + +# gl_AS_VAR_APPEND(VAR, VALUE) +# ---------------------------- +# Provide the functionality of AS_VAR_APPEND if Autoconf does not have it. +m4_ifdef([AS_VAR_APPEND], +[m4_copy([AS_VAR_APPEND], [gl_AS_VAR_APPEND])], +[m4_define([gl_AS_VAR_APPEND], +[AS_VAR_SET([$1], [AS_VAR_GET([$1])$2])])]) + + +# gl_COMPILER_OPTION_IF(OPTION, [IF-SUPPORTED], [IF-NOT-SUPPORTED], +# [PROGRAM = AC_LANG_PROGRAM()]) +# ----------------------------------------------------------------- +# Check if the compiler supports OPTION when compiling PROGRAM. +# +# FIXME: gl_Warn must be used unquoted until we can assume Autoconf +# 2.64 or newer. +AC_DEFUN([gl_COMPILER_OPTION_IF], +[AS_VAR_PUSHDEF([gl_Warn], [gl_cv_warn_[]_AC_LANG_ABBREV[]_$1])dnl +AS_VAR_PUSHDEF([gl_Flags], [_AC_LANG_PREFIX[]FLAGS])dnl +AS_LITERAL_IF([$1], + [m4_pushdef([gl_Positive], m4_bpatsubst([$1], [^-Wno-], [-W]))], + [gl_positive="$1" +case $gl_positive in + -Wno-*) gl_positive=-W`expr "X$gl_positive" : 'X-Wno-\(.*\)'` ;; +esac +m4_pushdef([gl_Positive], [$gl_positive])])dnl +AC_CACHE_CHECK([whether _AC_LANG compiler handles $1], m4_defn([gl_Warn]), [ + gl_save_compiler_FLAGS="$gl_Flags" + gl_AS_VAR_APPEND(m4_defn([gl_Flags]), + [" $gl_unknown_warnings_are_errors ]m4_defn([gl_Positive])["]) + AC_LINK_IFELSE([m4_default([$4], [AC_LANG_PROGRAM([])])], + [AS_VAR_SET(gl_Warn, [yes])], + [AS_VAR_SET(gl_Warn, [no])]) + gl_Flags="$gl_save_compiler_FLAGS" +]) +AS_VAR_IF(gl_Warn, [yes], [$2], [$3]) +m4_popdef([gl_Positive])dnl +AS_VAR_POPDEF([gl_Flags])dnl +AS_VAR_POPDEF([gl_Warn])dnl +]) + +# gl_UNKNOWN_WARNINGS_ARE_ERRORS +# ------------------------------ +# Clang doesn't complain about unknown warning options unless one also +# specifies -Wunknown-warning-option -Werror. Detect this. +AC_DEFUN([gl_UNKNOWN_WARNINGS_ARE_ERRORS], +[gl_COMPILER_OPTION_IF([-Werror -Wunknown-warning-option], + [gl_unknown_warnings_are_errors='-Wunknown-warning-option -Werror'], + [gl_unknown_warnings_are_errors=])]) + +# gl_WARN_ADD(OPTION, [VARIABLE = WARN_CFLAGS], +# [PROGRAM = AC_LANG_PROGRAM()]) +# --------------------------------------------- +# Adds parameter to WARN_CFLAGS if the compiler supports it when +# compiling PROGRAM. For example, gl_WARN_ADD([-Wparentheses]). +# +# If VARIABLE is a variable name, AC_SUBST it. +AC_DEFUN([gl_WARN_ADD], +[AC_REQUIRE([gl_UNKNOWN_WARNINGS_ARE_ERRORS]) +gl_COMPILER_OPTION_IF([$1], + [gl_AS_VAR_APPEND(m4_if([$2], [], [[WARN_CFLAGS]], [[$2]]), [" $1"])], + [], + [$3]) +m4_ifval([$2], + [AS_LITERAL_IF([$2], [AC_SUBST([$2])])], + [AC_SUBST([WARN_CFLAGS])])dnl +]) + +# Local Variables: +# mode: autoconf +# End: diff --git a/rockspec.conf b/rockspec.conf new file mode 100644 index 0000000..9800d06 --- /dev/null +++ b/rockspec.conf @@ -0,0 +1,17 @@ +# luaposix rockspec configuration. + +description: + homepage: http://github.com/luaposix/luaposix/ + license: MIT/X11 + summary: Lua bindings for POSIX (including curses) + detailed: + A library binding various POSIX APIs, including curses. + POSIX is the IEEE Portable Operating System Interface standard. + luaposix is based on lposix and lcurses. + +dependencies: +- lua >= 5.1, < 5.4 +- bit32 + +source: + url: git://github.com/luaposix/luaposix.git diff --git a/specs/curses_spec.yaml b/specs/curses_spec.yaml new file mode 100644 index 0000000..96dfe18 --- /dev/null +++ b/specs/curses_spec.yaml @@ -0,0 +1,3 @@ +describe posix.curses: +- it can be loaded with require: + curses = require "curses" diff --git a/specs/lposix_spec.yaml b/specs/lposix_spec.yaml new file mode 100644 index 0000000..c57933b --- /dev/null +++ b/specs/lposix_spec.yaml @@ -0,0 +1,34 @@ +describe lposix: +- before: + fcntl, fileno = posix.fcntl, posix.fileno + O_NONBLOCK = posix.O_NONBLOCK + +- context with fcntl F_GETFL: + - before: + F_GETFL, F_SETFL = posix.F_GETFL, posix.F_SETFL + + fdin = fileno (io.stdin) + flags = fcntl (fdin, F_GETFL) + restore = flags + - after: + fcntl (fdin, F_SETFL, restore) + + - it returns flags as a non-negative number: + expect (type (flags)).should_be "number" + expect (flags >= 0).should_be (true) + - it resets O_NONBLOCK bit, if any: + fcntl (fdin, F_SETFL, band (flags, bnot (O_NONBLOCK))) + flags = fcntl (fdin, F_GETFL) + expect (band (flags, O_NONBLOCK)).should_be (0) + - it sets O_NONBLOCK bit: + fcntl (fdin, F_SETFL, bor (flags, O_NONBLOCK)) + flags = fcntl (fdin, F_GETFL) + expect (band (flags, O_NONBLOCK)).should_not_be (0) + - it returns nil for negative fd argument: + ret, msg, errno = fcntl (-7, F_GETFL) + expect (ret).should_be (nil) + - it returns nil for unopened fd argument: + ret, msg, errno = fcntl (666, F_GETFL) + expect (ret).should_be (nil) + - it diagnoses incorrect userdata argument: + expect (fcntl ("foobar", F_GETFL)).should_error "int expected" diff --git a/specs/posix_compat_spec.yaml b/specs/posix_compat_spec.yaml new file mode 100644 index 0000000..99c1ac1 --- /dev/null +++ b/specs/posix_compat_spec.yaml @@ -0,0 +1,949 @@ +specify posix.compat: +- describe chmod: + - before: + chmod, stat = posix.chmod, posix.stat + touch "xxx" + chmod ("xxx", "rwxr-x---") + - after: + os.remove "xxx" + + - context with bad arguments: | + examples { + ["it diagnoses argument #2 invalid mode"] = function () + expect (chmod (".", "g+vv")).to_raise.any_of { + "bad argument #2 to '?' (bad mode)", + "bad argument #2 to 'chmod' (bad mode)", + } + end + } + + badargs.diagnose (chmod, "chmod (string, string)") + + - it sets file mode with longhand mode string: + mode = "rw---xr--" + expect (Emsg (chmod ("xxx", mode))).to_be "" + expect (stat ("xxx", "mode")).to_be (mode) + - "it sets attributes with '='": + expect (Emsg (chmod ("xxx", "o=w"))).to_be "" + expect (stat ("xxx", "mode")).to_be "rwxr-x-w-" + - "it adds attributes with '+'": + expect (Emsg (chmod ("xxx", "g+w"))).to_be "" + expect (stat ("xxx", "mode")).to_be "rwxrwx---" + - "it removes attributes with '-'": + expect (Emsg (chmod ("xxx", "u-r"))).to_be "" + expect (stat ("xxx", "mode")).to_be "-wxr-x---" + - it accepts comma separated attribute specifications: + expect (Emsg (chmod ("xxx", "a+x,g+w,u-w"))).to_be "" + expect (stat ("xxx", "mode")).to_be "r-xrwx--x" + - it diagnoses missing files: + os.remove "xxx" + expect (Emsg (chmod ("xxx", "a=rwx"))).to_contain "No such file or directory" + + +- describe clock_getres: + - before: + clock_getres = posix.clock_getres + + - context with bad arguments: + if clock_getres then + badargs.diagnose (clock_getres, "clock_getres (?string)") + end + + +- describe clock_gettime: + - before: + clock_gettime = posix.clock_gettime + + - context with bad arguments: + if clock_gettime then + badargs.diagnose (clock_gettime, "clock_gettime (?string)") + end + + +- describe creat: + - before: + creat = posix.creat + + - context with bad arguments: | + badargs.diagnose (creat, "creat (string, string)") + + examples { + ["it diagnoses argument #2 invalid mode"] = function () + expect (creat ("not/existing", "g+vv")).to_raise.any_of { + "bad argument #2 to '?' (bad mode)", + "bad argument #2 to 'creat' (bad mode)", + } + end + } + + +- describe fadvise: + - context with bad arguments: + if posix.fadvise then + badargs.diagnose (posix.fadvise, "fadvise (file, int, int, int)") + end + + +- describe fnmatch: + - before: + fnmatch, FNM_PATHNAME, FNM_PERIOD = + posix.fnmatch, posix.FNM_PATHNAME, posix.FNM_PERIOD + + - context with bad arguments: + badargs.diagnose (fnmatch, "fnmatch (string, string, ?int)") + + - it matches a file path against itself: + expect (fnmatch ("test", "test")).to_be (true) + - "it matches * against any filename characters": + expect (fnmatch ("tes*", "test")).to_be (true) + expect (fnmatch ("tes*", "test2")).to_be (true) + expect (fnmatch ("*t*", "test")).to_be (true) + - "it matches ? against a single filename character": + expect (fnmatch ("tes?", "test")).to_be (true) + expect (fnmatch ("t???", "test")).to_be (true) + expect (fnmatch ("tes?", "tes")).to_be (false) + expect (fnmatch ("tes?", "test2")).to_be (false) + - "it doesn't match path separators with FNM_PATHNAME": + expect (fnmatch ("*test", "/test")).to_be (true) + expect (fnmatch ("*test", "/test", FNM_PATHNAME)).to_be (false) + - "it doesn't match periods with FNM_PERIOD": + expect (fnmatch ("*test", ".test")).to_be (true) + expect (fnmatch ("*test", ".test", FNM_PERIOD)).to_be (false) + + +- describe getgroup: + - before: + getgrgid, getgroup, getegid = + posix.getgrgid, posix.getgroup, posix.getegid + groot = getgrgid (0).gr_name + + - context with bad arguments: + badargs.diagnose (posix.getgroup, "getgroup (?string|int)") + + - it returns a table for an existing group: + expect (type (getgroup (groot))).to_be "table" + - it fetches current group by default: + expect (getgroup ()).to_equal (getgroup (getegid ())) + - it fetches a group by gid: + expect (getgroup (0).name).to_be (groot) + expect (getgroup (0).gid).to_be (0) + expect (type (getgroup (0).mem)).to_be "table" + - it fetches a group by name: + expect (getgroup (groot).name).to_be (groot) + expect (getgroup (groot).gid).to_be (0) + expect (type (getgroup (groot).mem)).to_be "table" + + +- describe getpasswd: + - before: + getenv, getgid, getpasswd, getuid = + posix.getenv, posix.getgid, posix.getpasswd, posix.getuid + user = getpasswd ((getenv "USER"), "name") + root = getpasswd (0, "name") + + - context with bad arguments: + - before: + getpasswd, typeerrors = init (posix, "getpasswd") + + - 'it diagnoses argument #1 type not string, int or nil': + expect (getpasswd (false)). + to_raise.any_of (typeerrors (1, "?string|int", "boolean")) + + - it fetches the user uid: + expect (getpasswd (user).uid).to_be (getuid ()) + expect (getpasswd (root, "uid")).to_be (0) + - it fetches the user name: + expect (getpasswd (user).name).to_be (user) + expect (getpasswd (0, "name")).to_be (root) + expect (getpasswd (root, "name")).to_be (root) + - it fetches the user gid: + expect (getpasswd (user).gid).to_be (getgid ()) + expect (getpasswd (0, "gid")).to_be (0) + expect (getpasswd (root, "gid")).to_be (0) + - it fetches the user password: + expect (getpasswd (user).passwd).to_match.any_of {"x", "%*+"} + expect (getpasswd (0, "passwd")).to_match.any_of {"x", "%*+"} + expect (getpasswd (root, "passwd")).to_match.any_of {"x", "%*+"} + - it fetches the user home directory: + expect (getpasswd (user, "dir")).to_be (getenv "HOME") + - it fetches the user shell: + expect (getpasswd (user, "shell")).to_be (getenv "SHELL") + - it fetches a subtable of named fields: + expect ({getpasswd (user, "name", "shell", "dir")}). + to_equal {user, getenv "SHELL", getenv "HOME"} + - it fetches everything without an argument: + t = getpasswd (user) + for k, v in pairs (t) do + expect (t[k]).to_be (getpasswd (user, k)) + end + + +- describe getpid: + - before: + getpid, typeerrors = init (posix, "getpid") + + # posix.getpid takes an optional string or table as its first + # argument, followed by zero or more strings only if the first + # argument was a string; since we can't express that with + # `badargs.diagnose` do it all manually again... + - context with bad arguments: + - 'it diagnoses argument #1 type not table, string or nil': + expect (getpid (false)).to_raise. + any_of (typeerrors (1, "?table|string", "boolean")) + - 'it diagnoses argument #1 string invalid': | + expect (getpid ("fubar")).to_raise.any_of { + "bad argument #1 to '?' (invalid option 'fubar')", + "bad argument #1 to 'getpid' (invalid option 'fubar')", + } + - 'it diagnoses argument #2 type not string': + expect (getpid ("ppid", false)). + to_raise.any_of (typeerrors (2, "string", "boolean")) + - it diagnoses too many arguments: + expect (getpid ({}, false)).to_raise.any_of (typeerrors (2)) + + +- describe getrlimit: + - before: + getrlimit = posix.getrlimit + + - context with bad arguments: | + examples { + ["it diagnoses argument #1 invalid option"] = function () + expect (getrlimit ("fubar")).to_raise.any_of { + "bad argument #1 to '?' (invalid option 'fubar')", + "bad argument #1 to 'getrlimit' (invalid option 'fubar')", + } + end + } + + badargs.diagnose (getrlimit, "getrlimit (string)") + + - it fetches resource limits for a process: + for _, rc in pairs {"core", "cpu", "data", "fsize", "nofile", "stack", "as"} + do + cur, max = getrlimit (rc) + expect (type (cur)).to_be "number" + expect (type (max)).to_be "number" + end + + +- describe gettimeofday: + - before: + gettimeofday = posix.gettimeofday + + - context with bad arguments: + badargs.diagnose (gettimeofday, "gettimeofday ()") + + - it fetches the current epoch time: + t, epoch = gettimeofday (), posix.time () + expect (t.sec).to_be (epoch) + expect (type (t.usec)).to_be "number" + expect (t.usec >= 0).to_be (true) + + +- describe gmtime: + - before: + gmtime = posix.gmtime + + - context with bad arguments: + badargs.diagnose (gmtime, "gmtime (?int)") + + - it returns a table: + expect (prototype (gmtime (now))).to_be "table" + - it fetches broken-down time values: + t = gmtime (now) + fields = {"sec", "min", "hour", "day", "monthday", "month", "year", + "weekday", "yearday", "is_dst"} + expect (t).to_contain.a_permutation_of (fields) + for _, field in pairs (fields) do + if field == "is_dst" then + expect (type (t.is_dst)).to_be "boolean" + else + expect (type (t[field])).to_be "number" + expect (t[field] >= 0).to_be (true) + end + end + - it returns a month in the range 1-12: + # A recent December afternoon in epoch seconds... + expect (gmtime (1418734089).month).to_be (12) + t = gmtime (now) + expect (t.month >= 1 and t.month <= 12).to_be (true) + - it returns full year: + expect (gmtime (now).year > 2000).to_be (true) + + +- describe hostid: + - context with bad arguments: + badargs.diagnose (posix.hostid, "()") + + +- describe isgraph: + - before: + isgraph = posix.isgraph + + - context with bad arguments: + badargs.diagnose (isgraph, "isgraph (string)") + + - it returns true for successful tests: + expect (isgraph 'a').to_be (true) + - it returns false for failed tests: + expect (isgraph ' ').to_be (false) + + +- describe isprint: + - before: + isprint = posix.isprint + + - context with bad arguments: + badargs.diagnose (isprint, "isprint (string)") + + - it returns true for successful tests: + expect (isprint 'a').to_be (true) + - it returns false for failed tests: + expect (isprint (string.char (0))).to_be (false) + + +- describe localtime: + - before: + localtime = posix.localtime + + - context with bad arguments: + badargs.diagnose (localtime, "localtime (?int)") + + - it returns a table: + expect (prototype (localtime (now))).to_be "table" + - it fetches broken-down time values: + t = localtime (now) + fields = {"sec", "min", "hour", "day", "monthday", "month", "year", + "weekday", "yearday", "is_dst"} + expect (t).to_contain.a_permutation_of (fields) + for _, field in pairs (fields) do + if field == "is_dst" then + expect (type (t.is_dst)).to_be "boolean" + else + expect (type (t[field])).to_be "number" + expect (t[field] >= 0).to_be (true) + end + end + - it returns a month in the range 1-12: + # A recent December afternoon in epoch seconds... + expect (localtime (1418734089).month).to_be (12) + t = localtime (now) + expect (t.month >= 1 and t.month <= 12).to_be (true) + - it returns years since 1900: + expect (localtime (now).year > 2000).to_be (true) + + +- describe mkdir: + - before: + dir = posix.mkdtemp (template) + chdir, mkdir = posix.chdir, posix.mkdir + cwd = posix.getcwd () + + - after: + chdir (cwd) + rmtmp (dir) + + - context with bad arguments: + badargs.diagnose (mkdir, "mkdir (string)") + + - it creates the named directory: + expect (Emsg (mkdir (dir .. "/subdir"))).not_to_contain "exists" + expect (Emsg (chdir (dir .. "/subdir"))).not_to_contain "No such flle or directory" + - it diagnoses already existing directory: + expect (Emsg (mkdir (dir))).to_contain "exists" + + +- describe mkfifo: + - before: + dir = posix.mkdtemp (template) + mkfifo = posix.mkfifo + + - after: + rmtmp (dir) + + - context with bad arguments: + badargs.diagnose (mkfifo, "mkfifo (string)") + + - it creates the named fifo: + expect (Emsg (mkfifo (dir .. "/fifo"))).not_to_contain "exists" + expect (posix.stat (dir .. "/fifo").type).to_be "fifo" + - it diagnoses already existing fifo: + expect (Emsg (mkfifo (dir))).to_contain "exists" + + +- describe mktime: + - before: + localtime, mktime, time = posix.localtime, posix.mktime, posix.time + epoch = time () + t = localtime (epoch) + + - context with bad arguments: + badargs.diagnose (mktime, "mktime (?table)") + + - it returns an epoch time: + expect (prototype (mktime (t))).to_be "number" + - it is the inverse of localtime: + expect (mktime (t)).to_be (epoch) + - it defaults to current time: | + -- avoid a race by discarding the unit seconds + expect (mktime () / 10).to_be (epoch / 10) + + +- describe msgget: + - before: + msgget = posix.msgget + EEXIST, IPC_CREAT, IPC_EXCL = posix.EEXIST, posix.IPC_CREAT, posix.IPC_EXCL + + - context with bad arguments: + badargs.diagnose (msgget, "msgget (int, ?int, ?string)") + + - it creates a queue: + if msgget then + modestr = "rwxrwxrwx" + mq, err, errnum = msgget (100, bor (IPC_CREAT, IPC_EXCL), modestr) + if errnum == EEXIST then + mq, err = msgget (100, 0, modestr) + end + expect (mq).not_to_be (nil) + expect (err).to_be (nil) + end + + + - describe nanosleep: + - context with bad arguments: + badargs.diagnose (posix.nanosleep, "nanosleep (int, int)") + + - it returns an integer: + expect (posix.nanosleep (0, 10)).to_be (0) + + +- describe open: + # posix.open ignores the mode argument if flags does not include + # O_CREAT, which `badargs.diagnose` can't express; ergo manual + # checks here... + - before: + O_CREAT = posix.O_CREAT + open, typeerrors = init (posix, "open") + + - 'it diagnoses missing argument #1': + expect (open ()).to_raise.any_of (typeerrors (1, "string")) + - 'it diagnoses argument #1 type not string': + expect (open (false)).to_raise.any_of (typeerrors (1, "string", "boolean")) + - 'it diagnoses missing argument #2': + expect (open ("not/existing")).to_raise.any_of (typeerrors (2, "int")) + - 'it diagnoses argument #2 type not int': + expect (open ("not/existing", false)). + to_raise.any_of (typeerrors (2, "int", "boolean")) + - 'it diagnoses missing argument #3': + expect (open ("not/existing", O_CREAT)). + to_raise.any_of (typeerrors (3, "string")) + - 'it diagnoses argument #3 type not string': + expect (open ("not/existing", O_CREAT, false)). + to_raise.any_of (typeerrors (3, "string", "boolean")) + - 'it diagnoses argument #3 invalid mode': | + expect (open ("not/existing", O_CREAT, "g+vv")).to_raise.any_of { + "bad argument #3 to '?' (bad mode)", + "bad argument #3 to 'open' (bad mode)", + } + - 'it diagnoses too many arguments': + expect (open ("not/existing", -1, "o-s", false)).to_raise.any_of (typeerrors (4)) + + +- describe pathconf: + - before: + pathconf, typeerrors = init (posix, "pathconf") + + # posix.pathconf takes an optional string or table as its second + # argument, followed by zero or more strings only if the second + # argument was a string; since we can't express that with + # `badargs.diagnose` do it all manually again... + - context with bad arguments: + - 'it diagnoses argument #1 type not string': + expect (pathconf (false)). + to_raise.any_of (typeerrors (1, "?string", "boolean")) + - 'it diagnoses argument #2 type not table, string or nil': + expect (pathconf (".", false)). + to_raise.any_of (typeerrors (2, "?table|string", "boolean")) + - 'it diagnoses argument #2 string invalid': | + expect (pathconf (".", "fubar")).to_raise.any_of { + "bad argument #2 to '?' (invalid option 'fubar')", + "bad argument #2 to 'pathconf' (invalid option 'fubar')", + } + - 'it diagnoses argument #3 type not string': + expect (pathconf (".", "NAME_MAX", false)). + to_raise.any_of (typeerrors (3, "string", "boolean")) + - it diagnoses too many arguments: + expect (pathconf (".", {}, false)).to_raise.any_of (typeerrors (3)) + + - it returns whether chown can be used on the given file: + expect (type (pathconf ().CHOWN_RESTRICTED)).to_be "number" + expect (pathconf (".", "CHOWN_RESTRICTED") >= 0).to_be (true) + - it fetches the maximum number of links to the given file: + expect (type (pathconf ().LINK_MAX)).to_be "number" + expect (pathconf (".", "LINK_MAX") >= 0).to_be (true) + - it fetches the maximum formatted line input length for a tty: | + -- not passing a tty, so should return -1 + expect (type (pathconf ().MAX_CANON)).to_be "number" + pending "issue #102" + expect (pathconf (".", "MAX_CANON")).to_be (-1) + - it fetches the maximum raw line input length for a tty: | + -- not passing a tty, so should return -1 + expect (type (pathconf ().MAX_INPUT)).to_be "number" + pending "issue #102" + expect (pathconf (".", "MAX_INPUT")).to_be (-1) + - it fetches the maximum filename length in this directory: + expect (type (pathconf ().NAME_MAX)).to_be "number" + expect (pathconf (".", "NAME_MAX") >= 0).to_be (true) + - it fetches whether accessing overlong filenames is an error: + expect (type (pathconf ().NO_TRUNC)).to_be "number" + expect (pathconf (".", "NO_TRUNC") >= 0).to_be (true) + - it fetches the maximum relative path length from this directory: + expect (type (pathconf ().PATH_MAX)).to_be "number" + expect (pathconf (".", "PATH_MAX") >= 0).to_be (true) + - it fetches the size of the pipe buffer: + expect (type (pathconf ().PIPE_BUF)).to_be "number" + expect (pathconf (".", "PIPE_BUF") >= 0).to_be (true) + - it fetches whether special character processing can be disabled: | + -- not passing a tty, so should return -1 + expect (type (pathconf ().VDISABLE)).to_be "number" + pending "issue #102" + expect (pathconf (".", "VDISABLE")).to_be (-1) + - it fetches a subtable of named fields: + expect ({pathconf (".", "VDISABLE", "NAME_MAX")}). + to_equal {pathconf (".", "VDISABLE"), pathconf (".", "NAME_MAX")} + - it fetches everything without an argument: + t = pathconf () + for k, v in pairs (t) do + expect (t[k]).to_be (pathconf (".", k)) + end + + +- describe setrlimit: + - before: + setrlimit = posix.setrlimit + + - context with bad arguments: | + examples { + ["it diagnoses argument #1 invalid option"] = function () + expect (setrlimit ("fubar")).to_raise.any_of { + "bad argument #1 to '?' (invalid option 'fubar')", + "bad argument #1 to 'setrlimit' (invalid option 'fubar')", + } + end + } + + badargs.diagnose (setrlimit, "setrlimit (string, ?int, ?int)") + + +- describe stat: + - before: + # choose a format without seconds, that won't cause a race condition + fmt = "%b %d %H:%M" + getegid, geteuid = posix.getegid, posix.geteuid + stat, typeerrors = init (posix, "stat") + + dir = posix.mkdtemp (template) + posix.mkdir (dir .. "/subdir") + posix.link ("subdir", dir .. "/soft", true) + touch (dir .. "/file") + posix.link (dir .. "/file", dir .. "/hard") + posix.link ("no such destination", dir .. "/dangling", true) + posix.mkfifo (dir .. "/fifo") + + - after: + rmtmp (dir) + + # posix.stat takes an optional string or table as its second + # argument, followed by zero or more strings only if the second + # argument was a string; since we can't express that with + # `badargs.diagnose` do it all manually again... + - context with bad arguments: + - 'it diagnoses missing argument #1': + expect (stat ()).to_raise.any_of (typeerrors (1, "string")) + - 'it diagnoses argument #1 type not string': + expect (stat (false)). + to_raise.any_of (typeerrors (1, "string", "boolean")) + - 'it diagnoses argument #2 type not table, string or nil': + expect (stat (".", false)). + to_raise.any_of (typeerrors (2, "?table|string", "boolean")) + - 'it diagnoses argument #2 string invalid': | + expect (stat (".", "fubar")).to_raise.any_of { + "bad argument #2 to '?' (invalid option 'fubar')", + "bad argument #2 to 'stat' (invalid option 'fubar')", + } + - 'it diagnoses argument #3 type not string': + expect (stat (".", "type", false)). + to_raise.any_of (typeerrors (3, "string", "boolean")) + - it diagnoses too many arguments: + expect (stat (".", {}, false)). + to_raise.any_of (typeerrors (3)) + + - it fetches the file inode: + expect (stat (dir .. "/hard").ino).to_be (stat (dir .. "/file").ino) + - it fetches the file type: + expect (stat (dir).type).to_be "directory" + expect (stat (dir .. "/file", "type")).to_be "regular" + expect (stat (dir .. "/soft", "type")).to_be "link" + expect (stat (dir .. "/hard", "type")).to_be "regular" + - it fetches the file size: + # skip directory size, which is system dependent + expect (stat (dir .. "/file").size).to_be (0) + expect (stat (dir .. "/soft", "size")).to_be (string.len ("subdir")) + expect (stat (dir .. "/hard", "size")). + to_be (stat (dir .. "/file", "size")) + - it fetches the file access time: + expect (os.date (fmt, stat (dir .. "/file", "atime"))). + to_be (os.date (fmt)) + - it fetches the file modification time: + expect (os.date (fmt, stat (dir .. "/file", "mtime"))). + to_be (os.date (fmt)) + - it fetches the file creation time: + expect (os.date (fmt, stat (dir .. "/file", "ctime"))). + to_be (os.date (fmt)) + - it fetches the file access mode: + expect (stat (dir .. "/file").mode).to_match ("^[-rwx]+$") + expect (stat (dir .. "/subdir", "mode")).to_match ("^[-rwx]+$") + - it fetches the number of links: + expect (stat (dir .. "/file").nlink).to_be (2) + expect (stat (dir .. "/soft", "nlink")).to_be (1) + expect (stat (dir .. "/hard", "nlink")). + to_be (stat (dir .. "/file", "nlink")) + expect (stat (dir .. "/subdir", "nlink")).to_be (2) + - it fetches the owner id: + expect (stat (dir .. "/file").uid).to_be (geteuid ()) + expect (stat (dir .. "/subdir", "uid")).to_be (geteuid ()) + - it fetches the owner group id: + expect (stat (dir .. "/file").gid).to_be (getegid ()) + expect (stat (dir .. "/subdir", "gid")).to_be (getegid ()) + - it fetches a subtable of named fields: + expect ({stat (dir .. "/file", "type", "size", "nlink")}). + to_equal {"regular", 0, 2} + - it fetches everything without an argument: + t = stat (dir .. "/file") + for k, v in pairs (t) do + expect (t[k]).to_be (stat (dir .. "/file", k)) + end + + +- describe statvfs: + - before: + statvfs, typeerrors = init (posix, "statvfs") + + # posix.statvfs takes an optional string or table as its second + # argument, followed by zero or more strings only if the second + # argument was a string; since we can't express that with + # `badargs.diagnose` do it all manually again... + - context with bad arguments: | + if statvfs then + examples { + ["it diagnoses missing argument #1"] = function () + expect (statvfs ()).to_raise.any_of (typeerrors (1, "string")) + end + } + examples { + ["it diagnoses argument #1 type not string"] = function () + expect (statvfs (false)). + to_raise.any_of (typeerrors (1, "string", "boolean")) + end + } + examples { + ["it diagnoses argument #2 type not table, string or nil"] = function () + expect (statvfs (".", false)). + to_raise.any_of (typeerrors (2, "?table|string", "boolean")) + end + } + examples { + ["it diagnoses argument #2 string invalid"] = function () + expect (statvfs (".", "fubar")).to_raise.any_of { + "bad argument #2 to '?' (invalid option 'fubar')", + "bad argument #2 to 'statvfs' (invalid option 'fubar')", + } + end + } + examples { + ["it diagnoses argument #3 type not string"] = function () + expect (statvfs (".", "files", false)). + to_raise.any_of (typeerrors (3, "string", "boolean")) + end + } + examples { + ["it diagnoses too many arguments"] = function () + expect (statvfs (".", {}, false)).to_raise.any_of (typeerrors (3)) + end + } + end + + - it fetches statistics for a mounted file system: + if statvfs then + sv = statvfs "/" + expect (type (sv)).to_be "table" + expect (sv.bsize).to_be (statvfs ("/", "bsize")) + for _, field in pairs {"bsize", "frsize", "blocks", "bfree", "bavail", + "files", "ffree", "favail", "flag", "namemax"} + do + expect (type (sv[field])).to_be "number" + expect (sv[field] >= 0).to_be (true) + end + end + - it returns a non-negative value from fsid: | + -- Merge this back into the previous example when #102 is fixed + if statvfs then + sv = statvfs "/" + pending "issue #102" + expect (sv[field] >= 0).to_be (true) + end + + +- describe strftime: + - before: + strftime = posix.strftime + + t = { + is_dst = true, weekday = 0, sec = 2, min = 3, hour = 4, + monthday = 5, month = 6, year = 7, yearday = 8 + } + + - context with bad arguments: + badargs.diagnose (strftime, "strftime (string, ?table)") + + - context with place-holders: + - it plugs weekday: + expect (strftime ("%w", t)).to_be "0" + - it plugs sec: + expect (strftime ("%S", t)).to_be "02" + - it plugs min: + expect (strftime ("%M", t)).to_be "03" + - it plugs hour: + expect (strftime ("%H", t)).to_be "04" + - it plugs monthday: + expect (strftime ("%d", t)).to_be "05" + - it plugs month: + expect (strftime ("%m", t)).to_be "06" + - it plugs year: + expect (strftime ("%y", t)).to_be "07" + - it plugs yearday: + expect (strftime ("%j", t)).to_be "009" + - it defaults to current time: + expect (strftime "%Y-%m-%d\n"). + to_be (io.popen ("date +'%Y-%m-%d'", "r"):read "*a") + + +- describe strptime: + - before: + strptime = posix.strptime + + - context with bad arguments: + badargs.diagnose (strptime, "strptime (string, string)") + + - context with place-holders: + - before: + t, i = strptime ("Mon Jun 4 03:02:01 BST 1906 garbage", + "%a %b %d %H:%M:%S BST %Y") + - it returns the first unconsumed character: + expect (i).to_be (29) + # tm_yday and tm_isdst are not set by strptime + - it scans into weekday: + expect (t.weekday).to_be (1) + - it scans into sec: + expect (t.sec).to_be (1) + - it scans into min: + expect (t.min).to_be (2) + - it scans into hour: + expect (t.hour).to_be (3) + - it scans into monthday: + expect (t.monthday).to_be (4) + - it scans into month: + expect (t.month).to_be (6) + - it scans into year: + expect (t.year).to_be (1906) + + +- describe setlogmask: + - context with bad arguments: + if posix.setlogmask then + badargs.diagnose (posix.setlogmask, "setlogmask (?int*)") + end + + +- describe sysconf: + - before: + sysconf, typeerrors = init (posix, "sysconf") + + # posix.sysconf takes an optional string or table as its first + # argument, followed by zero or more strings only if the first + # argument was a string; since we can't express that with + # `badargs.diagnose` do it all manually again... + - context with bad arguments: + - 'it diagnoses argument #1 type not table, string or nil': + expect (sysconf (false)). + to_raise.any_of (typeerrors (1, "?table|string", "boolean")) + - 'it diagnoses argument #1 string invalid': | + expect (sysconf ("fubar")).to_raise.any_of { + "bad argument #1 to '?' (invalid option 'fubar')", + "bad argument #1 to 'sysconf' (invalid option 'fubar')", + } + - 'it diagnoses argument #2 type not string': + expect (sysconf ("ARG_MAX", false)). + to_raise.any_of (typeerrors (2, "string", "boolean")) + - it diagnoses too many arguments: + expect (sysconf ({}, false)).to_raise.any_of (typeerrors (2)) + + - it fetches the maximum number of exec arguments: + expect (type (sysconf ().ARG_MAX)).to_be "number" + expect (sysconf "ARG_MAX" >= 0).to_be (true) + - it fetches the number processes per user: + expect (type (sysconf ().CHILD_MAX)).to_be "number" + expect (sysconf "CHILD_MAX" >= 0).to_be (true) + - it fetches the number of clock ticks per second: + expect (type (sysconf ().CLK_TCK)).to_be "number" + expect (sysconf "CLK_TCK" >= 0).to_be (true) + - it fetches the job control version: + expect (type (sysconf ().JOB_CONTROL)).to_be "number" + expect (sysconf "JOB_CONTROL" >= 0).to_be (true) + - it fetches the maximum number of groups: + expect (type (sysconf ().NGROUPS_MAX)).to_be "number" + expect (sysconf "NGROUPS_MAX" >= 0).to_be (true) + - it fetches the maximum number of open descriptors: + expect (type (sysconf ().OPEN_MAX)).to_be "number" + expect (sysconf "OPEN_MAX" >= 0).to_be (true) + - it fetches the number of saved ids: + expect (type (sysconf ().SAVED_IDS)).to_be "number" + expect (sysconf "SAVED_IDS" >= 0).to_be (true) + - it fetches the maximum number of open streams: + expect (type (sysconf ().STREAM_MAX)).to_be "number" + expect (sysconf "STREAM_MAX" >= 0).to_be (true) + - it fetches the maximum length of a timezone name: + expect (type (sysconf ().TZNAME_MAX)).to_be "number" + expect (sysconf "TZNAME_MAX" >= 0).to_be (true) + - "it fetches the POSIX.1 version": + expect (type (sysconf ().VERSION)).to_be "number" + expect (sysconf "VERSION" >= 0).to_be (true) + - it fetches a subtable of named fields: + expect ({sysconf ("VERSION", "ARG_MAX", "OPEN_MAX")}). + to_equal {sysconf "VERSION", sysconf "ARG_MAX", sysconf "OPEN_MAX"} + - it fetches everything without an argument: + t = sysconf () + for k, v in pairs (t) do + expect (t[k]).to_be (sysconf (k)) + end + + +- describe times: + - before: + table.unpack = table.unpack or unpack + times, typeerrors = init (posix, "times") + + # posix.times takes an optional string or table as its first + # argument, followed by zero or more strings only if the first + # argument was a string; since we can't express that with + # `badargs.diagnose` do it all manually again... + - context with bad arguments: + - 'it diagnoses argument #1 type not table, string or nil': + expect (times (false)). + to_raise.any_of (typeerrors (1, "?table|string", "boolean")) + - 'it diagnoses argument #1 string invalid': | + expect (times ("fubar")).to_raise.any_of { + "bad argument #1 to '?' (invalid option 'fubar')", + "bad argument #1 to 'times' (invalid option 'fubar')", + } + - 'it diagnoses argument #2 type not string': + expect (times ("utime", false)). + to_raise.any_of (typeerrors (2, "string", "boolean")) + - it diagnoses too many arguments: + expect (times ({}, false)).to_raise.any_of (typeerrors (2)) + + - it fetches the user time: + expect (type (times ().utime)).to_be "number" + expect (times ("utime") >= 0).to_be (true) + - it fetches the system time: + expect (type (times ().stime)).to_be "number" + expect (times ("stime") >= 0).to_be (true) + - it fetches the children user time: + expect (type (times ().cutime)).to_be "number" + expect (times ("cutime") >= 0).to_be (true) + - it fetches the children system time: + expect (type (times ().cstime)).to_be "number" + expect (times ("cstime") >= 0).to_be (true) + - it fetches the elapsed time: + expect (type (times ().elapsed)).to_be "number" + expect (times ("elapsed") >= 0).to_be (true) + - it fetches a subtable of named fields: | + keys = {"utime", "cutime"} + t = {times (table.unpack (keys))} + for _, v in ipairs (t) do + expect (type (v)).to_be "number" + end + - it fetches everything without an argument: + keys = {"utime", "stime", "cutime", "cstime", "elapsed"} + t = times () + expect (t).to_contain.all_of (keys) + for _, v in ipairs (keys) do + expect (type (t[v])).to_be "number" + end + + +- describe umask: + - before: + stat, umask = posix.stat, posix.umask + saved = umask () + umask "rwxr-x---" + + dir = posix.mkdtemp (template) + + - after: + rmtmp (dir) + umask (saved) + + - context with bad arguments: | + examples { + ["it diagnoses argument #1 invalid mode"] = function () + expect (umask ("g+vv")).to_raise.any_of { + "bad argument #1 to '?' (bad mode)", + "bad argument #1 to 'umask' (bad mode)", + } + end + } + + badargs.diagnose (umask, "umask (?string)") + + - it returns current umask: + expect (umask ()).to_be "rwxr-x---" + - "it sets attributes with '='": + expect (umask "a=r").to_be "r--r--r--" + - "it adds attributes with '+'": + expect (umask "g+w").to_be "rwxrwx---" + - "it removes attributes with '-'": + expect (umask "u-r").to_be "-wxr-x---" + - it accepts comma separated attribute specifications: + expect (umask "a+r,g+w,u-x").to_be "rw-rwxr--" + - it controls the mode of newly created files: + xxx, mode = dir .. "/xxx", "rw--w-r--" + umask (mode) + touch (xxx) + expect (stat (xxx, "mode")).to_be (mode) + os.remove (xxx) + + +- describe uname: + - before: + uname = posix.uname + + - context with bad arguments: | + badargs.diagnose (uname, "uname (?string)") + + examples { + ['it diagnoses bad specifier format options'] = function () + expect (uname ("foo %_")). + to_error "bad argument #1 to 'uname' (invalid format option '_')" + end + } + + - it substitutes %n: + expect (uname "%n").to_be (cmd_output "uname -n") + - it substitutes %m: + expect (uname "%m").to_be (cmd_output "uname -m") + - it substitutes %r: + expect (uname "%r").to_be (cmd_output "uname -r") + - it outputs everything with no arguments: + expect (uname ()).to_be (cmd_output "uname -s -n -r -v -m") diff --git a/specs/posix_ctype_spec.yaml b/specs/posix_ctype_spec.yaml new file mode 100644 index 0000000..41337a4 --- /dev/null +++ b/specs/posix_ctype_spec.yaml @@ -0,0 +1,31 @@ +specify posix.ctype: +- before: + ctype = require "posix.ctype" + + +- describe isgraph: + - before: + isgraph = ctype.isgraph + + - context with bad arguments: + badargs.diagnose (isgraph, "(string)") + + - it returns non-zero for successful tests: + expect (type (isgraph 'a')).to_be "number" + expect (isgraph 'a').not_to_be (0) + - it returns zero for failed tests: + expect (isgraph ' ').to_be (0) + + +- describe isprint: + - before: + isprint = ctype.isprint + + - context with bad arguments: + badargs.diagnose (isprint, "(string)") + + - it returns non-zero for successful tests: + expect (type (isprint 'a')).to_be "number" + expect (isprint 'a').not_to_be (0) + - it returns zero for failed tests: + expect (isprint (string.char (0))).to_be (0) diff --git a/specs/posix_deprecated_spec.yaml b/specs/posix_deprecated_spec.yaml new file mode 100644 index 0000000..82afa94 --- /dev/null +++ b/specs/posix_deprecated_spec.yaml @@ -0,0 +1,262 @@ +specify posix.deprecated: +- before: + socket, getaddrinfo, close = posix.socket, posix.getaddrinfo, posix.close + AF_INET, AF_INET6, AF_UNIX, AF_NETLINK = + posix.AF_INET, posix.AF_INET6, posix.AF_UNIX, posix.AF_NETLINK + SOCK_STREAM = posix.SOCK_STREAM + +- describe connect: + - before: + connect, typeerrors = init (posix, "connect") + + - context with bad arguments: | + badargs.diagnose (connect, "connect (int, table)") + + examples { + ["it diagnoses wrong family types"] = function () + expect (connect (42, {family=false})). + to_raise.any_of (typeerrors (2, "int", "family", "boolean")) + expect (connect (42, {family=-1})).to_raise.any_of { + "bad argument #2 to '?' (unsupported family type -1)", + "bad argument #2 to 'connect' (unsupported family type -1)", + } + end + } + examples { + ["it diagnoses wrong AF_INET field types"] = function () + expect (connect (42, {family=AF_INET, port=false})). + to_raise.any_of (typeerrors (2, "int", "port", "boolean")) + expect (connect (42, {family=AF_INET, port=9999, addr=false})). + to_raise.any_of (typeerrors (2, "string", "addr", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_INET fields"] = function () + expect (connect (42, { + family=AF_INET, port=9999, addr="127.0.0.1", flags=false + })).to_raise.any_of (typeerrors (2, nil, "flags")) + end + } + examples { + ["it diagnoses wrong AF_INET6 field types"] = function () + expect (connect (42, {family = AF_INET6, port = false})). + to_raise.any_of (typeerrors (2, "int", "port", "boolean")) + expect (connect (42, {family = AF_INET6, port = 9999, addr = false})). + to_raise.any_of (typeerrors (2, "string", "addr", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_INET6 fields"] = function () + expect (connect (42, { + family=AF_INET6, port=9999, addr="::", flags=false + })).to_raise.any_of (typeerrors (2, nil, "flags")) + end + } + examples { + ["it diagnoses wrong AF_UNIX field types"] = function () + expect (connect (42, {family = AF_UNIX, path = false})). + to_raise.any_of (typeerrors (2, "string", "path", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_UNIX fields"] = function () + expect (connect (42, {family=AF_UNIX, path="/tmp/afunix", port=9999})). + to_raise.any_of (typeerrors (2, nil, "port")) + end + } + if AF_NETLINK then + examples { + ["it diagnoses wrong AF_NETLINK field types"] = function () + expect (connect (42, {family = AF_NETLINK, pid = false})). + to_raise.any_of (typeerrors (2, "int", "pid", "boolean")) + expect (connect (42, {family = AF_NETLINK, pid = 9999, groups = false})). + to_raise.any_of (typeerrors (2, "int", "groups", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_NETLINK fields"] = function () + expect (connect (42, {family=AF_NETLINK, pid=9999, groups=9999, port=9999})). + to_raise.any_of (typeerrors (2, nil, "port")) + end + } + end + + - it returns true on success: + fd = socket (AF_INET, SOCK_STREAM, 0) + ait = getaddrinfo ("www.lua.org", "http", {family = AF_INET, socktype = SOCK_STREAM}) + expect (connect (fd, ait[1])).to_be (true) + close (fd) + + + +- describe bind: + - before: + bind, typeerrors = init (posix, "bind") + + - context with bad arguments: | + badargs.diagnose (bind, "bind (int, table)") + + examples { + ["it diagnoses wrong family types"] = function () + expect (bind (42, {family=false})). + to_raise.any_of (typeerrors (2, "int", "family", "boolean")) + expect (bind (42, {family=-1})).to_raise.any_of { + "bad argument #2 to '?' (unsupported family type -1)", + "bad argument #2 to 'bind' (unsupported family type -1)", + } + end + } + examples { + ["it diagnoses wrong AF_INET field types"] = function () + expect (bind (42, {family=AF_INET, port=false})). + to_raise.any_of (typeerrors (2, "int", "port", "boolean")) + expect (bind (42, {family=AF_INET, port=9999, addr=false})). + to_raise.any_of (typeerrors (2, "string", "addr", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_INET fields"] = function () + expect (bind (42, { + family=AF_INET, port=9999, addr="127.0.0.1", flags=false + })).to_raise.any_of (typeerrors (2, nil, "flags")) + end + } + examples { + ["it diagnoses wrong AF_INET6 field types"] = function () + expect (bind (42, {family = AF_INET6, port = false})). + to_raise.any_of (typeerrors (2, "int", "port", "boolean")) + expect (bind (42, {family = AF_INET6, port = 9999, addr = false})). + to_raise.any_of (typeerrors (2, "string", "addr", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_INET6 fields"] = function () + expect (bind (42, { + family=AF_INET6, port=9999, addr="::", flags=false + })).to_raise.any_of (typeerrors (2, nil, "flags")) + end + } + examples { + ["it diagnoses wrong AF_UNIX field types"] = function () + expect (bind (42, {family = AF_UNIX, path = false})). + to_raise.any_of (typeerrors (2, "string", "path", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_UNIX fields"] = function () + expect (bind (42, {family=AF_UNIX, path="/tmp/afunix", port=9999})). + to_raise.any_of (typeerrors (2, nil, "port")) + end + } + if AF_NETLINK then + examples { + ["it diagnoses wrong AF_NETLINK field types"] = function () + expect (bind (42, {family = AF_NETLINK, pid = false})). + to_raise.any_of (typeerrors (2, "int", "pid", "boolean")) + expect (bind (42, {family = AF_NETLINK, pid = 9999, groups = false})). + to_raise.any_of (typeerrors (2, "int", "groups", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_NETLINK fields"] = function () + expect (bind (42, {family=AF_NETLINK, pid=9999, groups=9999, port=9999})). + to_raise.any_of (typeerrors (2, nil, "port")) + end + } + end + + - it returns true on success: + fd = socket (AF_INET, SOCK_STREAM, 0) + expect (bind (fd, {family = AF_INET, addr = "127.0.0.1", port = 13457 })).to_be (true) + close (fd) + + +- describe exec: + - before: + exec, typeerrors = init (posix, "exec") + + # posix.exec takes a string or non-empty table as its second + # argument, followed by zero or more strings only if the second + # argument was a string; since we can't express that with + # `badargs.diagnose` do it all manually again... + - context with bad arguments: + - 'it diagnoses argument #1 type not string': + expect (exec (false)).to_raise.any_of (typeerrors (1, "string", "boolean")) + - 'it diagnoses argument #2 type not table or string': + expect (exec ("cmd", false)). + to_raise.any_of (typeerrors (2, "?string|table", "boolean")) + - 'it diagnoses argument #3 type not string': + expect (exec ("cmd", "cmd", false)). + to_raise.any_of (typeerrors (3, "string", "boolean")) + - it diagnoses too many arguments: + expect (exec ("cmd", {}, false)).to_raise.any_of (typeerrors (3)) + + +- describe execp: + - before: + # redirect output to /dev/null + dup2, fork, open, wait, O_WRONLY, O_APPEND = + posix.dup2, posix.fork, posix.open, posix.wait, posix.O_WRONLY, posix.O_APPEND + P_CHILD = 0 + + function child (...) + quietly = open ("/dev/null", bor (O_WRONLY, O_APPEND)) + dup2 (quietly, 1) + execp (...) + expect ("not reached").to_be (true) + end + + execp, typeerrors = init (posix, "execp") + + # posix.execp takes a string or non-empty table as its second + # argument, followed by zero or more strings only if the second + # argument was a string; since we can't express that with + # `badargs.diagnose` do it all manually again... + - context with bad arguments: + - 'it diagnoses argument #1 type not string': + expect (execp (false)).to_raise.any_of (typeerrors (1, "string", "boolean")) + - 'it diagnoses argument #2 type not table or string': + expect (execp ("cmd", false)). + to_raise.any_of (typeerrors (2, "?string|table", "boolean")) + - 'it diagnoses argument #3 type not string': + expect (execp ("cmd", "cmd", false)). + to_raise.any_of (typeerrors (3, "string", "boolean")) + - it diagnoses too many arguments: + expect (execp ("cmd", {}, false)).to_raise.any_of (typeerrors (3)) + + - it overwrites the running process with a shell invocation: + process = fork () + if process == P_CHILD then + child ("date", "+[%c]") + else + p, msg, ret = wait (process) + expect (table.concat {msg, " ", tostring (ret)}).to_be "exited 0" + end + - it accepts a table of arguments: + process = fork () + if process == P_CHILD then + child ("date", {"+[%c]"}) + else + p, msg, ret = wait (process) + expect (table.concat {msg, " ", tostring (ret)}).to_be "exited 0" + end + - "it sets argv[0]": + + +- describe openlog: + - before: + openlog = posix.openlog + + - context with bad arguments: | + if openlog then + badargs.diagnose (openlog, "openlog (string, ?string, ?int)") + + examples { + ["it diagnoses invalid options"] = function () + expect (openlog ("log", "cp*")).to_raise.any_of { + "bad argument #2 to '?' (invalid openlog option '*')", + "bad argument #2 to 'openlog' (invalid openlog option '*')", + } + end + } + end diff --git a/specs/posix_dirent_spec.yaml b/specs/posix_dirent_spec.yaml new file mode 100644 index 0000000..fff35d4 --- /dev/null +++ b/specs/posix_dirent_spec.yaml @@ -0,0 +1,61 @@ +specify posix.dirent: +- before: + dirent = require "posix.dirent" + + +- describe dir: + - before: + dir = dirent.dir + + - context with bad arguments: | + badargs.diagnose (dir, "(?string)") + + examples { + ["it diagnoses argument #1 not a valid file"] = function () + expect (dir "/not/exists").to_raise.any_of { + -- Can't be any more accurate, because error message is system specific + "bad argument #1 to 'dir' (/not/exists: ", + "bad argument #1 to '?' (/not/exists: ", + } + end + } + +- describe files: + - before: + # Make and change into a temporary subdirectory where we can + # control all the contents for self-contained examples. + link, mkdir, mkdtemp = posix.link, posix.mkdir, posix.mkdtemp + origwd = posix.getcwd () + dir, errmsg = mkdtemp (template) + mkdir (dir .. "/subdir") + link ("subdir", dir .. "/soft", true) + touch (dir .. "/file") + link (dir .. "/file", dir .. "/hard") + link ("no such destination", dir .. "/dangling", true) + + files = dirent.files + + - after: + posix.chdir (origwd) + rmtmp (dir) + + - context with bad arguments: | + badargs.diagnose (files, "(?string)") + + examples { + ["it diagnoses argument #1 not a valid file"] = function () + expect (files "/not/exists").to_raise.any_of { + -- Can't be any more accurate, because error message is system specific + "bad argument #1 to 'files' (/not/exists: ", + "bad argument #1 to '?' (/not/exists: ", + } + end + } + + - it returns a table of files in the given directory: + t = {} + for f in files (dir) do + table.insert (t, f) + end + table.sort (t) + expect (t).to_equal {".", "..", "dangling", "file", "hard", "soft", "subdir"} diff --git a/specs/posix_fcntl_spec.yaml b/specs/posix_fcntl_spec.yaml new file mode 100644 index 0000000..695c537 --- /dev/null +++ b/specs/posix_fcntl_spec.yaml @@ -0,0 +1,47 @@ +specify posix.fcntl: +- before: + fc = require "posix.fcntl" + + +- describe open: + - before: | + unistd = require "posix.unistd" + + O_CREAT, O_RDONLY, O_WRONLY = fc.O_CREAT, fc.O_RDONLY, fc.O_WRONLY + open = fc.open + close, read, write = unistd.close, unistd.read, unistd.write + + dir = posix.mkdtemp (template) + fh = io.open (dir .. "/file", "w") + fh:write "garbage\n" + fh:close () + + - after: + rmtmp (dir) + + - context with bad arguments: + badargs.diagnose (open, "(string, int, ?int)") + + - it opens an existing file: + fd, err = open (dir .. "/file", O_RDONLY) + expect (type (fd)).to_be "number" + expect (fd >= 0).to_be (true) + expect (read (fd, 10)).to_be "garbage\n" + close (fd) + + - it opens a new file: + buf = "more garbage\n" + fd, err = open (dir .. "/creat", bor (O_CREAT, O_WRONLY)) + expect (type (fd)).to_be "number" + expect (fd >= 0).to_be (true) + expect (write (fd, buf)).to_be (#buf) + close (fd) + +- describe posix_fadvise: + - before: + posix_fadvise = fc.posix_fadvise + + - context with bad arguments: + if posix_fadvise then + badargs.diagnose (posix_fadvise, "(int, int, int, int)") + end diff --git a/specs/posix_fnmatch_spec.yaml b/specs/posix_fnmatch_spec.yaml new file mode 100644 index 0000000..dde66a4 --- /dev/null +++ b/specs/posix_fnmatch_spec.yaml @@ -0,0 +1,29 @@ +specify posix.fnmatch: +- before: + fnm = require "posix.fnmatch" + +- describe fnmatch: + - before: + fnmatch, FNM_PATHNAME, FNM_PERIOD, FNM_NOMATCH = + fnm.fnmatch, fnm.FNM_PATHNAME, fnm.FNM_PERIOD, fnm.FNM_NOMATCH + + - context with bad arguments: + badargs.diagnose (fnmatch, "(string, string, ?int)") + + - it matches a file path against itself: + expect (fnmatch ("test", "test")).to_be (0) + - "it matches * against any filename characters": + expect (fnmatch ("tes*", "test")).to_be (0) + expect (fnmatch ("tes*", "test2")).to_be (0) + expect (fnmatch ("*t*", "test")).to_be (0) + - "it matches ? against a single filename character": + expect (fnmatch ("tes?", "test")).to_be (0) + expect (fnmatch ("t???", "test")).to_be (0) + expect (fnmatch ("tes?", "tes")).to_be (FNM_NOMATCH) + expect (fnmatch ("tes?", "test2")).to_be (FNM_NOMATCH) + - "it doesn't match path separators with FNM_PATHNAME": + expect (fnmatch ("*test", "/test")).to_be (0) + expect (fnmatch ("*test", "/test", FNM_PATHNAME)).to_be (FNM_NOMATCH) + - "it doesn't match periods with FNM_PERIOD": + expect (fnmatch ("*test", ".test")).to_be (0) + expect (fnmatch ("*test", ".test", FNM_PERIOD)).to_be (FNM_NOMATCH) diff --git a/specs/posix_grp_spec.yaml b/specs/posix_grp_spec.yaml new file mode 100644 index 0000000..b374254 --- /dev/null +++ b/specs/posix_grp_spec.yaml @@ -0,0 +1,92 @@ +specify posix:grp: +- before: + grp = require "posix.grp" + + +- describe endgrent: + - before: + endgrent = grp.endgrent + + - context with bad arguments: + badargs.diagnose (endgrent, "()") + + - it returns 'nil': + expect (endgrent ()).to_be (nil) + - it rewinds the group database: + g = grp.getgrent () + grp.getgrent () + endgrent () + expect (grp.getgrent ()).to_equal (g) + + +- describe getgrent: + - before: + getgrent = grp.getgrent + + - context with bad arguments: + badargs.diagnose (getgrent, "()") + + - it returns a PosixGroup for an existing group: + expect (prototype (getgrent ())).to_be "PosixGroup" + - it fetches a different group on subsequent calls: + g = getgrent () + expect (getgrent ()).not_to_equal (g) + - it returns nil after the last entry was fetched: + g = getgrent () + while (g) do + h = getgrent () + expect (g).not_to_equal (h) + g = h + end + expect (g).to_be (nil) + grp.endgrent () + + +- describe getgrgid: + - before: + getgrgid = posix.getgrgid + groot = getgrgid (0).gr_name + + - context with bad arguments: + badargs.diagnose (getgrgid, "(int)") + + - it returns a PosixGroup for an existing group: + expect (prototype (getgrgid (0))).to_be "PosixGroup" + - it fetches a group by gid: + expect (getgrgid (0).gr_name).to_be (groot) + expect (getgrgid (0).gr_gid).to_be (0) + expect (type (getgrgid (0).gr_mem)).to_be "table" + + +- describe getgrnam: + - before: + getgrgid, getgrnam = posix.getgrgid, posix.getgrnam + groot = getgrgid (0).gr_name + + - context with bad arguments: + badargs.diagnose (getgrnam, "(string)") + + - it returns 'nil' for a non-existent group: + expect (getgrnam "veryunlikelygroupname").to_be (nil) + - it returns a PosixGroup for an existing group: + expect (prototype (getgrnam (groot))).to_be "PosixGroup" + - it fetches a group by name: + expect (getgrnam (groot).gr_name).to_be (groot) + expect (getgrnam (groot).gr_gid).to_be (0) + expect (type (getgrnam (groot).gr_mem)).to_be "table" + + +- describe setgrent: + - before: + setgrent = grp.setgrent + + - context with bad arguments: + badargs.diagnose (setgrent, "()") + + - it returns 'nil': + expect (setgrent ()).to_be (nil) + - it rewinds the group database: + g = grp.getgrent () + grp.getgrent () + setgrent () + expect (grp.getgrent ()).to_equal (g) diff --git a/specs/posix_pwd_spec.yaml b/specs/posix_pwd_spec.yaml new file mode 100644 index 0000000..ede2c92 --- /dev/null +++ b/specs/posix_pwd_spec.yaml @@ -0,0 +1,94 @@ +specify posix.pwd: +- before: + pwd = require "posix.pwd" + + +- describe endpwent: + - before: + endpwent = pwd.endpwent + + - context with bad arguments: + badargs.diagnose (endpwent, "()") + + - it returns 'nil': + expect (endpwent ()).to_be (nil) + - it rewinds the passwd database: + p = pwd.getpwent () + pwd.getpwent () + endpwent () + expect (pwd.getpwent ()).to_equal (p) + + +- describe getpwent: + - before: + getpwent = pwd.getpwent + + - context with bad arguments: + badargs.diagnose (getpwent, "()") + + - it returns a PosixPasswd for an existing user: + expect (prototype (getpwent ())).to_be "PosixPasswd" + - it fetches a different user on subsequent calls: + p = getpwent () + expect (getpwent ()).not_to_equal (p) + - it returns nil after the last entry was fetched: + p = getpwent () + while (p) do + q = getpwent () + expect (p).not_to_equal (q) + p = q + end + expect (p).to_be (nil) + pwd.endpwent () + + +- describe getpwnam: + - before: + getpwuid, getpwnam = posix.getpwuid, posix.getpwnam + + - context with bad arguments: + badargs.diagnose (getpwnam, "(string)") + + - it returns 'nil' for a non-existent user: + expect (getpwnam "veryunlikelyusername").to_be (nil) + - it returns a PosixPasswd for an existing user: + expect (prototype (getpwnam "root")).to_be "PosixPasswd" + - it fetches a passwd entry by name: + expect (getpwnam ("root").pw_name).to_be "root" + expect (getpwnam ("root").pw_uid).to_be (0) + expect (getpwnam ("root").pw_gid).to_be (0) + expect (type (getpwnam ("root").pw_dir)).to_be "string" + expect (type (getpwnam ("root").pw_shell)).to_be "string" + + +- describe getpwuid: + - before: + getpwuid = posix.getpwuid + + - context with bad arguments: + badargs.diagnose (getpwuid, "(int)") + + - it returns a PosixPasswd for an existing user: + expect (prototype (getpwuid (0))).to_be "PosixPasswd" + - it fetches a passwd entry by gid: + expect (getpwuid (0).pw_name).to_be "root" + expect (getpwuid (0).pw_uid).to_be (0) + expect (getpwuid (0).pw_gid).to_be (0) + expect (type (getpwuid (0).pw_dir)).to_be "string" + expect (type (getpwuid (0).pw_shell)).to_be "string" + + +- describe setpwent: + - before: + setpwent = pwd.setpwent + + - context with bad arguments: + badargs.diagnose (setpwent, "()") + + - it returns 'nil': + expect (setpwent ()).to_be (nil) + - it rewinds the passwd database: + p = pwd.getpwent () + pwd.getpwent () + setpwent () + expect (pwd.getpwent ()).to_equal (p) diff --git a/specs/posix_signal_spec.yaml b/specs/posix_signal_spec.yaml new file mode 100644 index 0000000..5253e6a --- /dev/null +++ b/specs/posix_signal_spec.yaml @@ -0,0 +1,23 @@ +specify posix.signal: +- before: + sig = require "posix.signal" + + +- describe kill: + - context with bad arguments: + badargs.diagnose (sig.kill, "(int, ?int)") + + +- describe killpg: + - context with bad arguments: + badargs.diagnose (sig.killpg, "(int, ?int)") + + +- describe raise: + - context with bad arguments: + badargs.diagnose (sig.raise, "(int)") + + +- describe signal: + - context with bad arguments: + badargs.diagnose (sig.signal, "(int, ?function|string, ?int)") diff --git a/specs/posix_spec.yaml b/specs/posix_spec.yaml new file mode 100644 index 0000000..7e26ef2 --- /dev/null +++ b/specs/posix_spec.yaml @@ -0,0 +1,797 @@ +# Specl specifications for APIs in lposix.c +# +# Specifications are topographically sorted, with fundamental calls specified +# at the top of the file, and calls with dependencies on correct functioning +# of earlier specifications further down. +# +# If you get a series of failed expectations, fixing the earliest failures +# first will often clear up later failures automatically! + +specify posix: +- describe euidaccess: + - before: f = posix.euidaccess + - context with bad arguments: + badargs.diagnose (f, "euidaccess (string, string)") + + +- describe errno: + - context with bad arguments: + badargs.diagnose (posix.errno, "(?int)") + + +- describe set_errno: + - context with bad arguments: + badargs.diagnose (posix.set_errno, "(int)") + + +- describe getopt: + - context with bad arguments: + badargs.diagnose (posix.getopt, "(list, string, ?table, ?int, ?int)") + + +- describe openpty: + - context with bad arguments: + badargs.diagnose (posix.openpty, "openpty ()") + + +# spawn's tests also cover execx +- describe spawn: + - before: f = posix.spawn + + - context with bad arguments: + badargs.diagnose (f, "spawn (table|function, ?any*)") + + - it spawns a command and can detect success: + expect (f ({"true"})).to_equal (0) + - it can detect failure: + expect (f ({"false"})).to_equal (1) + - it can pass a table of arguments: + expect (f ({"echo", "foo"})).to_equal(0) + - it can pass a function: + # FIXME: If the function body contains: + # io.stdout.write ("hello") + # then the specl results are printed twice; "hello" is not printed + expect (f (function () end)).to_equal(0) + +- describe popen: + - before: + popen, pclose = posix.popen, posix.pclose + read, write, BUFSIZE = posix.read, posix.write, posix.BUFSIZ + - context with bad arguments: + badargs.diagnose (popen, "popen (table|function, string, ?function)") + + - it spawns a command and reads its output: + p = popen ({"echo", "foo"}, "r") + s = posix.read (p.fd, posix.BUFSIZ) + pclose (p) + expect (s).to_equal "foo\n" + + - it spawns a command and writes its input: + p = popen ({"wc"}, "w") + s = "foo bar baz" + expect (write (p.fd, s)).to_equal (#s) + pclose (p) + +- describe popen_pipeline: + - before: + popen_pipeline, pclose = posix.popen_pipeline, posix.pclose + read, write, BUFSIZE = posix.read, posix.write, posix.BUFSIZ + - context with bad arguments: + badargs.diagnose (popen_pipeline, "popen_pipeline (table, string, ?function)") + + - it spawns a pipeline and reads its output: + p = popen_pipeline ({{"echo", "foo", "bar", "baz"}, {"wc"}, {"wc", "-l"}}, "r") + expect (read (p.fd, posix.BUFSIZ)).to_match ("^%s*1\n") + pclose (p) + + - it spawns a pipeline and writes its input: + s = "foo bar baz" + p = popen_pipeline ({{"cat"}, {"wc"}}, "w") + expect (write (p.fd, s)).to_equal (#s) + pclose (p) + + +- describe timeradd: + - before: + tv1 = { sec = 2, usec = 123456 } + tv2 = { sec = 1, usec = 876543 } + f = posix.timeradd + + - context with bad arguments: + badargs.diagnose (f, "timeradd (table, table)") + + - it adds both fields of a timerval: + expect (f (tv1, tv2)).to_equal { sec = 3, usec = 999999 } + - it carries overflow second: + expect (f (tv2, tv2)).to_equal { sec = 3, usec = 753086 } + - it does not require 'sec' field: + expect (f (tv1, {usec = 876543})).to_equal { sec = 2, usec = 999999 } + expect (f ({usec = 123456}, {usec = 876543})).to_equal { sec = 0, usec = 999999} + - it does not require 'usec' field: + expect (f (tv1, {sec = 1})).to_equal { sec = 3, usec = 123456 } + expect (f ({sec = 2}, {sec = 1})).to_equal { sec = 3, usec = 0 } + + +- describe timercmp: + - before: + tv1 = { sec = 2, usec = 123456 } + tv2 = { sec = 1, usec = 876543 } + f = posix.timercmp + + - context with bad arguments: + badargs.diagnose (f, "timercmp (table, table)") + + - it returns 0 if timers are equal: + expect (f (tv1, tv1)).to_equal (0) + - it returns positive integer if second timer is greater than first: + expect (f (tv1, tv2) > 0).to_be (true) + - it returns negative integer if first timer is greater than the second: + expect (f (tv2, tv1) < 0).to_be (true) + + +- describe timersub: + - before: + tv1 = { sec = 2, usec = 876543 } + tv2 = { sec = 1, usec = 123456 } + f = posix.timersub + + - context with bad arguments: + badargs.diagnose (f, "timersub (table, table)") + + - it subtracts both fields of a timerval: + expect (f (tv1, tv2)).to_equal { sec = 1, usec = 753087 } + - it carries overflow second: + expect (f (tv2, tv1)).to_equal { sec = -2, usec = 246913 } + - it does not require 'sec' field: + expect (f (tv1, {usec = 123456})).to_equal { sec = 2, usec = 753087 } + expect (f ({usec = 876543}, {usec = 123456})). + to_equal { sec = 0, usec = 753087} + - it does not require 'usec' field: + expect (f (tv1, {sec = 1})).to_equal { sec = 1, usec = 876543 } + expect (f ({sec = 2}, {sec = 1})).to_equal { sec = 1, usec = 0 } + + +- specify file descriptors: + - describe fileno: + - context with bad arguments: + badargs.diagnose (posix.fileno, "(file)") + + + - describe rpoll: + - context with bad arguments: + badargs.diagnose (posix.rpoll, "(int, int)") + + + - describe poll: + - context with bad arguments: + badargs.diagnose (posix.poll, "(table, ?int)") + + + - describe close: + - context with bad arguments: + badargs.diagnose (posix.close, "(int)") + + + - describe dup: + - context with bad arguments: + badargs.diagnose (posix.dup, "(int)") + + + - describe dup2: + - context with bad arguments: + badargs.diagnose (posix.dup2, "(int, int)") + + + - describe pipe: + - before: + pipe, read, write = posix.pipe, posix.read, posix.write + + - context with bad arguments: + badargs.diagnose (pipe, "()") + + - it creates a pipe: + pout, pin = pipe () + expect (pout > 0).to_be (true) + expect (pin > 0).to_be (true) + - it can buffer characters: + pout, pin = pipe () + data = "test characters" + write (pin, data) + expect (read (pout, data:len ())).to_be (data) + + + - describe read: + - context with bad arguments: + badargs.diagnose (posix.read, "(int, int)") + + + - describe write: + - context with bad arguments: + badargs.diagnose (posix.write, "(int, string)") + + + - describe fcntl: + - before: + F_GETLK, F_SETLK, F_SETLKW = posix.F_GETLK, posix.F_SETLK, posix.F_SETLKW + F_RDLCK, F_WRLCK, F_UNLCK = posix.F_RDLCK, posix.F_WRLCK, posix.F_UNLCK + SEEK_SET, SEEK_CUR, SEEK_END = posix.SEEK_SET, posix.SEEK_CUR, posix.SEEK_END + + fcntl, typeerrors = init (posix, "fcntl") + + # posix.fcntl diagnoses the third arg differently depending on + # the value of `cmd`, which `diagnose.badargs` can't express; ergo + # manual checks here... + - context with bad arguments: + - 'it diagnoses missing argument #1': + expect (fcntl ()).to_raise.any_of (typeerrors (1, "int")) + - 'it diagnoses argument #1 type not int': + expect (fcntl (false)).to_raise.any_of (typeerrors (1, "int", "boolean")) + - 'it diagnoses missing argument #2': + expect (fcntl (-1)).to_raise.any_of (typeerrors (2, "int")) + - 'it diagnoses argument #2 type not int': + expect (fcntl (-1, false)).to_raise.any_of (typeerrors (2, "int", "boolean")) + - 'it diagnoses missing argument #3 to F_GETLK': + expect (fcntl (-1, F_GETLK)).to_raise.any_of (typeerrors (3, "table")) + - 'it diagnoses argument #3 type to F_GETLK not table': + expect (fcntl (-1, F_GETLK, false)). + to_raise.any_of (typeerrors (3, "table", "boolean")) + - 'it diagnoses argument #3 type to non-F_GETLK not int': + expect (fcntl (-1, 0, false)). + to_raise.any_of (typeerrors (3, "?int", "boolean")) + - 'it diagnoses too many arguments': + expect (fcntl (-1, F_GETLK, {}, false)).to_raise.any_of (typeerrors (4)) + expect (fcntl (-1, 0, -1, false)).to_raise.any_of (typeerrors (4)) + + - it has all needed constants: + expect (type (F_GETLK)).to_be "number" + expect (type (F_SETLK)).to_be "number" + expect (type (F_SETLKW)).to_be "number" + expect (type (F_RDLCK)).to_be "number" + expect (type (F_WRLCK)).to_be "number" + expect (type (F_UNLCK)).to_be "number" + expect (type (SEEK_SET)).to_be "number" + expect (type (SEEK_CUR)).to_be "number" + expect (type (SEEK_END)).to_be "number" + + - context when file locking: + - before: + mkstemp, open, close = posix.mkstemp, posix.open, posix.close + fork, wait, errno = posix.fork, posix.wait, posix.errno + O_RDWR, EAGAIN, EACCES = posix.O_RDWR, posix.EAGAIN, posix.EACCES + P_CHILD = 0 + SUCCESS = 0 + fd, path = mkstemp "tmpXXXXXX" + close (fd) + parent_pid = posix.getpid "pid" + + query_lock = { + l_type = F_RDLCK, l_whence = SEEK_SET, l_start = 0, l_len = 0, + } + write_lock = { + l_type = F_WRLCK, l_whence = SEEK_SET, l_start = 0, l_len = 0, + } + - after: + os.remove (path) + + - it checks whether lock is possible with F_GETLK: + fd = open (path, O_RDWR) + result = fcntl (fd, F_GETLK, query_lock) + expect (result).to_be (SUCCESS) + expect (query_lock.l_type).to_be (F_UNLCK) + close (fd) + - it can lock file with F_SETLK: | + parent_fd = open (path, O_RDWR) + result = fcntl (parent_fd, F_SETLK, write_lock) + expect (result).to_be (SUCCESS) + process = fork () + if process == P_CHILD then + child_fd = open (path, O_RDWR) + result = fcntl (child_fd, F_GETLK, query_lock) + close (child_fd) + -- (not sure how to expect () in subprocess) + if result ~= SUCCESS then + os.exit (10) + elseif query_lock.l_pid ~= parent_pid then + os.exit (11) + else + os.exit (12) + end + else + _, _, exit_code = wait (process) + expect (exit_code).to_be (12) + end + close (parent_fd) + - it returns error if cannot lock file with F_SETLK: | + parent_fd = open (path, O_RDWR) + result = fcntl (parent_fd, F_SETLK, write_lock) + expect (result).to_be (0) + process = fork () + if process == P_CHILD then + child_fd = open (path, O_RDWR) + result = fcntl (child_fd, F_SETLK, write_lock) + close (child_fd) + -- (not sure how to expect () in subprocess) + if result == SUCCESS then + os.exit (10) + elseif errno () ~= errno (EACCES) and errno () ~= errno (EAGAIN) then + os.exit (11) + else + os.exit (12) + end + else + _, _, exit_code = wait (process) + expect (exit_code).to_be (12) + end + close (parent_fd) + + + - describe lseek: + - before: + close, lseek, open, read, write = + posix.close, posix.lseek, posix.open, posix.read, posix.write + SEEK_SET, SEEK_CUR, SEEK_END = + posix.SEEK_SET, posix.SEEK_CUR, posix.SEEK_END + + - context with bad arguments: + badargs.diagnose (lseek, "(int, int, int)") + + - it changes the current position of a file descriptor: + _, path = posix.mkstemp (template) + fd = open (path, posix.O_RDWR) + expect (fd).not_to_be (nil) + write (fd, "0123456789") + lseek (fd, 3, SEEK_SET) + expect (read (fd, 3)).to_be "345" + lseek (fd, -2, SEEK_CUR) + expect (read (fd, 3)).to_be "456" + lseek (fd, -5, SEEK_END) + expect (read (fd, 3)).to_be "567" + close (fd) + os.remove (path) + + + +- specify file system: + - before: + # Make and change into a temporary subdirectory where we can + # control all the contents for self-contained examples. + link, mkdir, mkdtemp = posix.link, posix.mkdir, posix.mkdtemp + origwd = posix.getcwd () + dir, errmsg = mkdtemp (template) + mkdir (dir .. "/subdir") + link ("subdir", dir .. "/soft", true) + touch (dir .. "/file") + link (dir .. "/file", dir .. "/hard") + link ("no such destination", dir .. "/dangling", true) + - after: + posix.chdir (origwd) + rmtmp (dir) + + + - describe sync: + - context with bad arguments: + badargs.diagnose (posix.sync, "()") + + + - describe fsync: + - context with bad arguments: + badargs.diagnose (posix.fsync, "(int)") + + + - describe fdatasync: + - context with bad arguments: + if posix.fdatasync then + badargs.diagnose (posix.fdatasync, "(int)") + end + + + - describe basename: + - before: + basename = posix.basename + + - context with bad arguments: + badargs.diagnose (basename, "(string)") + + - it returns a path without leading directories: + expect (basename "/foo/bar").to_be "bar" + + + - describe dirname: + - before: + dirname = posix.dirname + + - context with bad arguments: + badargs.diagnose (dirname, "(string)") + + - it return a path without final element: + expect (dirname "/foo/bar").to_be "/foo" + + + - describe dir: + - context with bad arguments: + badargs.diagnose (posix.dir, "(?string)") + + + - describe glob: + - before: + chdir, glob, mkdtemp = posix.chdir, posix.glob, posix.mkdtemp + + - context with bad arguments: + badargs.diagnose (glob, "(?string)") + + - it matches files in the given directory: + dir = mkdtemp (template) + touch (dir .. "/test.1") + touch (dir .. "/test.2") + touch (dir .. "/extra_file") + chdir (dir) + globlist, errmsg = glob "test.*" + expect (errmsg).to_be (nil) + expect (type (globlist)).to_be "table" + rmtmp (dir) + + + - describe files: + - before: + files = posix.files + + - context with bad arguments: + badargs.diagnose (files, "(?string)") + + - it returns a table of files in the given directory: + t = {} + for f in files (dir) do + table.insert (t, f) + end + table.sort (t) + expect (t).to_equal {".", "..", "dangling", "file", "hard", "soft", "subdir"} + + + - describe getcwd: + - context with bad arguments: + badargs.diagnose (posix.getcwd, "()") + + + - describe chdir: + - before: + chdir, chmod, getcwd, mkdir, rmdir = + posix.chdir, posix.chmod, posix.getcwd, posix.mkdir, posix.rmdir + cwd = getcwd () + - after: + chdir (cwd) + pcall (rmdir, "x") + + - context with bad arguments: + badargs.diagnose (chdir, "(string)") + + - it changes to a relative directory: + thisdir = posix.basename (getcwd ()) + expect (Emsg (chdir ("../" .. thisdir))). + not_to_contain "No such file or directory" + expect (Emsg (chdir "..")).not_to_contain "No such file or directory" + - it changes to an absolute directory: + expect (Emsg (chdir "/var/tmp/")). + not_to_contain "No such file or directory" + - it diagnoses missing directory: + expect (Emsg (chdir "very_unlikely_to_exist")). + to_contain "No such file or directory" + - it diagnoses insufficient permissions: + mkdir "x" + chmod ("x", "a-rwx") + expect (Emsg (chdir "x")). + to_contain "Permission denied" + rmdir "x" + + + - describe rmdir: + - before: + mkdir, rmdir = posix.mkdir, posix.rmdir + + - context with bad arguments: + badargs.diagnose (rmdir, "(string)") + + - it removes the named directory: + mkdir "x" + expect (Emsg (rmdir "x")).not_to_contain "No such file or directory" + - it diagnoses missing directory: + expect (Emsg (rmdir ".")).to_contain "Invalid argument" + + + - describe unlink: + - context with bad arguments: + badargs.diagnose (posix.unlink, "(string)") + + + - describe link: + - before: + link, stat = posix.link, posix.stat + touch "xxx" + - after: + os.remove "xxx" + + - context with bad arguments: + badargs.diagnose (link, "(string, string, ?boolean)") + + - it creates hard links: + expect (Emsg (link ("xxx", "xxx-hard"))).to_be "" + expect (stat ("xxx-hard", "ino")).to_be (stat ("xxx", "ino")) + os.remove "xxx-hard" + - it creates soft links: + expect (Emsg (link ("xxx", "xxx-soft", true))).to_be "" + expect (stat ("xxx-soft", "type")).to_be "link" + os.remove "xxx-soft" + + - describe readlink: + - before: + readlink = posix.readlink + + - context with bad arguments: + badargs.diagnose (readlink, "(string)") + + - it diagnoses missing file: | + _, err, code = readlink "does not exist!" + expect (err).to_match "^does not exist!: " + expect (code).to_be (posix.ENOENT) + - it diagnoses non-symbolic link: | + _, err, code = readlink (dir .. "/file") + expect (err).to_be (dir .. "/file: not a symbolic link") + expect (code).to_be (posix.EINVAL) + - it reads the contents of a symbolic link: + expect (readlink (dir .. "/soft")).to_be "subdir" + - it reads the contents of a dangling symbolic link: + expect (readlink (dir .. "/dangling")).to_be "no such destination" + + + - describe access: + - before: + access = posix.access + touch "xxx" + - after: + os.remove "xxx" + + - context with bad arguments: + badargs.diagnose (posix.access, "(string, ?string)") + + - it checks whether a file is visible to the real user: + expect (Emsg (access ("xxx", "f"))).to_be "" + - it checks whether a file is readable by the real user: + expect (Emsg (access ("xxx", "r"))).to_be "" + - it checks whether a file is writable by the real user: + expect (Emsg (access ("xxx", "w"))).to_be "" + - "it defaults to 'f' with no mode argument": + expect (access ("xxx")).to_be (access ("xxx", "f")) + - it diagnoses missing files: + os.remove "xxx" + expect (Emsg (access "xxx")).to_contain "No such file or directory" + + + - describe chown: + - context with bad arguments: + badargs.diagnose (posix.chown, "(string, ?string|int, ?string|int)") + + + - describe utime: + - before: + stat, utime = posix.stat, posix.utime + touch "xxx" + - after: + os.remove "xxx" + + - context with bad arguments: + badargs.diagnose (posix.utime, "(string, ?int, ?int)") + + - it sets the last file modification time: + mtime = stat ("/etc", "mtime") + expect (stat ("xxx", "mtime")).not_to_equal (mtime) + expect (Emsg (utime ("xxx", mtime))).to_be "" + expect (stat ("xxx", "mtime")).to_equal (mtime) + - it sets the last file access time: + atime = stat ("/etc", "atime") + expect (stat ("xxx", "atime")).not_to_equal (atime) + expect (Emsg (utime ("xxx", nil, atime))).to_be "" + expect (stat ("xxx", "atime")).to_equal (atime) + + +- specify process management: + - describe nice: + - before: + nice = posix.nice + + - context with bad arguments: + badargs.diagnose (nice, "(int)") + + - it adjusts the process priority: + old = nice (1) + expect (old).not_to_be (nil) + new = nice (2) + expect (new).to_be (old + 2) + + + - describe fork: + # NOTE: Calling expect in a child process does not report results + # back to parent, so we send test data over a pipe. + - before: + nice, execp, fork, getpid, getppid, wait = + posix.nice, posix.execp, posix.fork, posix.getpid, posix.getppid, posix.wait + _exit, close, pipe, read, write = + posix._exit, posix.close, posix.pipe, posix.read, posix.write + P_CHILD = 0 + + - context with bad arguments: + badargs.diagnose (fork, "()") + + - it copies itself to a new child process: | + r, w = pipe () + process, status = fork (), 67 + if process == P_CHILD then + close (r) -- close unused read end + -- write parent pid and child pid to shared pipe. + write (w, tostring (getppid ()).."\n") + write (w, tostring (getpid "pid").."\n") + close (w) + _exit (status) + else + posix.close (w) -- close unused write end + p, msg, ret = wait (process) + expect (p).to_be (process) + expect (msg).to_be "exited" + expect (ret).to_be (status) + -- check pids from child process. + buf = posix.read (r, 1024) + cppid, cpid = string.match (buf, "(%d+)\n(%d+)\n") + close (r) + expect (cppid).to_be (tostring (getpid "pid")) + expect (cpid).to_be (tostring (process)) + end + + + - describe _exit: + - context with bad arguments: + badargs.diagnose (posix. _exit, "(int)") + + + - describe wait: + - context with bad arguments: + badargs.diagnose (posix.wait, "(?int, ?int)") + + + - describe setpid: + - before: + setpid, typeerrors = init (posix, "setpid") + + - context with bad arguments: + - 'it diagnoses missing argument #1': + expect (setpid ()).to_raise.any_of (typeerrors (1, "string")) + - 'it diagnoses argument #1 type not string': + expect (setpid (false)).to_raise.any_of (typeerrors (1, "string", "boolean")) + - 'it diagnoses argument #1 invalid option': | + expect (setpid "fubar").to_raise.any_of { + "bad argument #1 to '?' (invalid id option 'f')", + "bad argument #1 to 'setpid' (invalid id option 'f')", + } + - 'it diagnoses missing argument #2': + expect (setpid "p").to_raise.any_of (typeerrors (2, "int")) + - 'it diagnoses argument #2 type not int': + expect (setpid ("p", false)). + to_raise.any_of (typeerrors (2, "int", "boolean")) + - 'it diagnoses missing argument #3': + expect (setpid ("p", 0)).to_raise.any_of (typeerrors (3, "int")) + - 'it diagnoses argument #3 type not int': + expect (setpid ("p", 0, false)). + to_raise.any_of (typeerrors (3, "int", "boolean")) + - it diagnoses too many arguments: + expect (setpid ("p", 0, 0, false)).to_raise.any_of (typeerrors (4)) + expect (setpid ("u", 0, false)).to_raise.any_of (typeerrors (3)) + + + - describe sleep: + - context with bad arguments: + badargs.diagnose (posix.sleep, "(int)") + + + - describe sched_setscheduler: + - context with bad arguments: + if posix.sched_setscheduler then + badargs.diagnose (posix.sched_setscheduler, "(?int, ?int, ?int)") + end + + + - describe sched_getscheduler: + - context with bad arguments: + if posix.sched_getscheduler then + badargs.diagnose (posix.sched_getscheduler, "(?int)") + end + + + +- specify terminal handling: + - describe ttyname: + - before: + ttyname = posix.ttyname + + - context with bad arguments: + badargs.diagnose (posix.ttyname, "(?int)") + + - it takes a file descriptor argument: + expect (ttyname (2)).to_contain.any_of {"console", "pts", "tty"} + - it returns a string: + expect (type (ttyname (1))).to_be "string" + - it defaults the first argument to 0: + expect (ttyname ()).to_be (ttyname (0)) + + + - describe ctermid: + - before: + ctermid = posix.ctermid + + - context with bad arguments: + badargs.diagnose (posix.ctermid, "()") + + - it returns the pathname of the controlling terminal: + expect (ctermid ()).to_match.any_of {"/.*pts.*", "/.*tty.*"} + + + - describe isatty: + - context with bad arguments: + badargs.diagnose (posix.isatty, "(int)") + + + - describe tcsetattr: + - context with bad arguments: + badargs.diagnose (posix.tcsetattr, "(int, int, table)") + + + - describe tcgetattr: + - context with bad arguments: + badargs.diagnose (posix.tcgetattr, "(int)") + + + - describe tcsendbreak: + - context with bad arguments: + badargs.diagnose (posix.tcsendbreak, "(int, int)") + + + - describe tcdrain: + - context with bad arguments: + badargs.diagnose (posix.tcdrain, "(int)") + + + - describe tcflush: + - context with bad arguments: + badargs.diagnose (posix.tcflush, "(int, int)") + + + - describe tcflow: + - context with bad arguments: + badargs.diagnose (posix.tcflow, "(int, int)") + + + +- specify user management: + - describe getlogin: + - context with bad arguments: + badargs.diagnose (posix.getlogin, "()") + + + - describe getgroups: + - context with bad arguments: + if posix.getgroups then + badargs.diagnose (posix.getgroups, "()") + end + + + - describe crypt: + - before: + crypt = posix.crypt + key, salt = "hello", "pl" + + - context with bad arguments: + if posix.crypt then + badargs.diagnose (posix.crypt, "(string, string)") + end + + - it can perform repeatable one-way hashing: + hash = crypt (key, salt) + expect (crypt (key, salt)).to_be (hash) + - it encrypts differently for a different salt: + expect (crypt (key, salt)).not_to_equal (crypt (key, "/.")) diff --git a/specs/posix_stdio_spec.yaml b/specs/posix_stdio_spec.yaml new file mode 100644 index 0000000..cb215a6 --- /dev/null +++ b/specs/posix_stdio_spec.yaml @@ -0,0 +1,21 @@ +specify posix.stdio: +- before: + stdio = require "posix.stdio" + + +- describe fdopen: + - before: + fdopen = stdio.fdopen + unistd = require "posix.unistd" + STDOUT_FILENO = unistd.STDOUT_FILENO + f = fdopen (STDOUT_FILENO, "w") + + - context with bad arguments: + badargs.diagnose (fdopen, "(int,string)") + + - it duplicates a stream: + expect (type (f)).to_be "userdata" + + - it writes to the duplicated stream: + -- Lua 5.1 file.write returns true; > 5.1 returns file handle + expect (f:write ("writing to fdopen(stdout)\n")).not_to_be (nil) diff --git a/specs/posix_stdlib_spec.yaml b/specs/posix_stdlib_spec.yaml new file mode 100644 index 0000000..9d7a87f --- /dev/null +++ b/specs/posix_stdlib_spec.yaml @@ -0,0 +1,152 @@ +specify posix.stdlib: +- before: + stdlib = require "posix.stdlib" + + +- describe abort: + - context with bad arguments: + badargs.diagnose (stdlib.abort, "()") + + +- describe getenv: + - before: + getenv = stdlib.getenv + + - context with bad arguments: + badargs.diagnose (getenv, "(?string)") + + - it fetches a table of process environment variables: | + volatile = { _=true, CWD=true, LUA_PATH=true, PWD=true, SHLVL=true, } + for k,v in pairs (getenv ()) do + if not volatile[k] then + expect (hell.spawn ('echo "' .. k .. '=$' .. k .. '"')). + to_contain_output (k.."="..v) + end + end + - it fetches a named process environment variable: + expect (getenv "USER").to_be (cmd_output ('echo "$USER"')) + expect (getenv "HOME").to_be (cmd_output ('echo "$HOME"')) + expect (getenv "SHELL").to_be (cmd_output ('echo "$SHELL"')) + - it returns nil for an absent environment setting: + expect (getenv "very_unlikely_to_be_set").to_be (nil) + + +- describe grantpt: + - context with bad arguments: + badargs.diagnose (stdlib.grantpt, "(int)") + + +- describe mkdtemp: + - before: + st = require "posix.sys.stat" + mkdtemp = stdlib.mkdtemp + stat, IFMT, IFDIR, IRWXU = st.stat, st.S_IFMT, st.S_IFDIR, st.S_IRWXU + IRWXA = bor (st.S_IRWXU, st.S_IRWXG, st.S_IRWXO) + + - context with bad arguments: + badargs.diagnose (mkdtemp, "(string)") + + - it creates a temporary directory from a template: + dir, errmsg = mkdtemp (template) + expect (dir).not_to_be (nil) + dirstat = stat (dir) + expect (band (dirstat.st_mode, IFMT)).to_be (IFDIR) + expect (band (dirstat.st_mode, IRWXA)).to_be (IRWXU) + rmtmp (dir) + + +- describe mkstemp: + - before: + fc = require "posix.fcntl" + st = require "posix.sys.stat" + unistd = require "posix.unistd" + O_RDONLY, open = fc.O_RDONLY, fc.open + mkstemp = stdlib.mkstemp + close, isatty, read, write = + unistd.close, unistd.isatty, unistd.read, unistd.write + stat, IFMT, IFREG = st.stat, st.S_IFMT, st.S_IFREG + IRW_U = bor (st.S_IRUSR, st.S_IWUSR) + IRWXA = bor (st.S_IRWXU, st.S_IRWXG, st.S_IRWXO) + fd, path = mkstemp (template) + - after: + close (fd) + os.remove (path) + + - context with bad arguments: + badargs.diagnose (mkstemp, "(string)") + + - it creates a temporary file from a template: + expect (fd).not_to_be (nil) + write (fd, "12345") + expect (isatty (fd)).not_to_be (true) + fstat = stat (path) + expect (band (fstat.st_mode, IFMT)).to_be (IFREG) + expect (band (fstat.st_mode, IRWXA)).to_be (IRW_U) + expect (fstat.st_size).to_be (5) + fd2 = open (path, O_RDONLY) + expect (read (fd2, 5)).to_be "12345" + close (fd2) + - it creates a new temporary file on each call: + fd2, another = mkstemp (template) + expect (fd2).not_to_be (fd) + expect (another).not_to_be (path) + close (fd2) + os.remove (another) + + +- describe openpt: + - before: + fc = require "posix.fcntl" + st = require "posix.sys.stat" + close = require "posix.unistd".close + grantpt, openpt, ptsname, unlockpt = + stdlib.grantpt, stdlib.openpt, stdlib.ptsname, stdlib.unlockpt + O_RDWR, O_NOCTTY, open = fc.O_RDWR, fc.O_NOCTTY, fc.open + stat, IFMT, IFCHR = st.stat, st.S_IFMT, st.S_IFCHR + + - context with bad arguments: + badargs.diagnose (openpt, "(int)") + + - it can create a pseudoterminal: + masterfd = openpt (bor (O_RDWR, O_NOCTTY)) + expect (type (masterfd)).to_be "number" + expect (masterfd > 0).to_be (true) + expect (Emsg (grantpt (masterfd))).to_be "" + expect (Emsg (unlockpt (masterfd))).to_be "" + slavename = ptsname (masterfd) + slavestat = stat (slavename) + expect (band (slavestat.st_mode, IFMT)).to_be (IFCHR) + slavefd = open (slavename, bor (O_RDWR, O_NOCTTY)) + expect (type (slavefd)).to_be "number" + expect (slavefd > 0).to_be (true) + close (slavefd) + close (masterfd) + + +- describe ptsname: + - context with bad arguments: + badargs.diagnose (stdlib.ptsname, "(int)") + + +- describe realpath: + - context with bad arguments: + badargs.diagnose (stdlib.realpath, "(string)") + + +- describe setenv: + - before: + getenv, setenv = stdlib.getenv, stdlib.setenv + + - context with bad arguments: + badargs.diagnose (stdlib.setenv, "(string, ?string, ?any)") + + - it sets a new value in the process environment: + setenv ("MYVAR", "123") + expect (getenv "MYVAR").to_be "123" + setenv ("MYVAR", nil) + expect (getenv "MYVAR").to_be (nil) + + +- describe unlockpt: + - context with bad arguments: + badargs.diagnose (stdlib.unlockpt, "(int)") diff --git a/specs/posix_sys_msg_spec.yaml b/specs/posix_sys_msg_spec.yaml new file mode 100644 index 0000000..3546a39 --- /dev/null +++ b/specs/posix_sys_msg_spec.yaml @@ -0,0 +1,45 @@ +specify posix.sys.msg: +- before: + errno = require "posix.errno" + msg = require "posix.sys.msg" + st = require "posix.sys.stat" + + EEXIST = errno.EEXIST + msgget, msgsnd, msgrcv = msg.msgget, msg.msgsnd, msg.msgrcv + IPC_CREAT, IPC_EXCL = msg.IPC_CREAT, msg.IPC_EXCL + S_IRWXU, S_IRWXG, S_IRWXO = st.S_IRWXU, st.S_IRWXG, st.S_IRWXO + + mode = bor (S_IRWXU, S_IRWXG, S_IRWXO) + mq, err, errnum = msgget (100, bor (IPC_CREAT, IPC_EXCL, mode)) + if errnum == EEXIST then + mq, err = msgget (100, mode) + end + + type = 42 + data = "Answer to the Ultimate Question of Life" + + +- describe msgget: + - context with bad arguments: + badargs.diagnose (msgget, "(int, ?int)") + + - it creates a queue: + expect (mq).not_to_be (nil) + expect (err).to_be (nil) + + +- describe msgsnd: + - context with bad arguments: + badargs.diagnose (msgsnd, "(int, int, string, ?int)") + + - it sends a message: + ok, err = msgsnd (mq, type, data) + expect (ok).not_to_be (err) + + +- describe msgrcv: + - context with bad arguments: + badargs.diagnose (msgrcv, "(int, int, ?int, ?int)") + + - it receives a message: + expect ({msgrcv (mq, 128)}).to_equal {type, data, nil} diff --git a/specs/posix_sys_resource_spec.yaml b/specs/posix_sys_resource_spec.yaml new file mode 100644 index 0000000..6707c91 --- /dev/null +++ b/specs/posix_sys_resource_spec.yaml @@ -0,0 +1,74 @@ +specify posix.sys.resource: +- before: + resource = require "posix.sys.resource" + + +- describe getrlimit: + - before: + getrlimit = resource.getrlimit + + - context with bad arguments: + badargs.diagnose (getrlimit, "(int)") + + - it returns a PosixRlimit: + expect (prototype (getrlimit (resource.RLIMIT_AS))).to_be "PosixRlimit" + - it fetches resource limits for a process: + for _, rc in pairs {"RLIMIT_CORE", "RLIMIT_CPU", "RLIMIT_DATA", "RLIMIT_FSIZE", + "RLIMIT_NOFILE", "RLIMIT_STACK", "RLIMIT_AS"} + do + rlim = getrlimit (resource[rc]) + expect (type (rlim.rlim_cur)).to_be "number" + expect (type (rlim.rlim_max)).to_be "number" + end + + +- describe setrlimit: + - before: + setrlimit, typeerrors = init (resource, "setrlimit") + getrlimit = resource.getrlimit + + - context with bad arguments: | + badargs.diagnose (setrlimit, "(int, table)") + + examples { + ["context diagnosing rlimit table fields"] = { + { + ["it diagnoses argument #2 missing rlim_cur field"] = function () + expect (setrlimit (-1, {})).to_raise. + any_of (typeerrors (2, "number", "rlim_cur", "no value")) + end + }, + { + ["it diagnoses argument #2 rlim_cur field type not int"] = function () + expect (setrlimit (-1, {rlim_cur = false})).to_raise. + any_of (typeerrors (2, "number", "rlim_cur", "boolean")) + end + }, + { + ["it diagnoses argument #2 missing rlim_max field"] = function () + expect (setrlimit (-1, {rlim_cur = -1})).to_raise. + any_of (typeerrors (2, "number", "rlim_max", "no value")) + end + }, + { + ["it diagnoses argument #2 rlim_max field type not int"] = function () + expect (setrlimit (-1, {rlim_cur = -1, rlim_max = false})).to_raise. + any_of (typeerrors (2, "number", "rlim_max", "boolean")) + end + }, + { + ["it diagnoses argument #2 spurious fields"] = function () + expect (setrlimit (-1, {rlim_cur = -1, rlim_max = -1, bogus = false})). + to_raise.any_of (typeerrors (2, nil, "bogus")) + end + }, + } + } + - it accepts PosixRlimit argument: + pending "requires elevated privileges" + for _, rc in pairs {"RLIMIT_CORE", "RLIMIT_CPU", "RLIMIT_DATA", "RLIMIT_FSIZE", + "RLIMIT_NOFILE", "RLIMIT_STACK", "RLIMIT_AS"} + do + rlim = getrlimit (resource[rc]) + expect (setrlimit (resource[rc], rlim)).to_be (0) + end diff --git a/specs/posix_sys_socket_spec.yaml b/specs/posix_sys_socket_spec.yaml new file mode 100644 index 0000000..d2b1615 --- /dev/null +++ b/specs/posix_sys_socket_spec.yaml @@ -0,0 +1,383 @@ +specify posix.sys.socket: +- before: + sock = require "posix.sys.socket" + + bind, setsockopt, socket = sock.bind, sock.setsockopt, sock.socket + recvfrom, sendto = sock.recvfrom, sock.sendto + AF_INET, AF_INET6, AF_UNIX, AF_NETLINK = + sock.AF_INET, sock.AF_INET6, sock.AF_UNIX, sock.AF_NETLINK + IPPROTO_TCP, SOCK_DGRAM = sock.IPPROTO_TCP, sock.SOCK_DGRAM + SOL_SOCKET, SO_RCVTIMEO = sock.SOL_SOCKET, sock.SO_RCVTIMEO + + +- describe socket: + - context with bad arguments: + badargs.diagnose (sock.socket, "(int, int, int)") + + +- describe socketpair: + - context with bad arguments: + badargs.diagnose (sock.socketpair, "(int, int, int)") + + +- describe getaddrinfo: + - before: + getaddrinfo, typeerrors = init (sock, "getaddrinfo") + + - context with bad arguments: | + badargs.diagnose (getaddrinfo, "(?string, ?string|int, ?table)") + + examples { + ["it diagnoses unspecified host and service"] = function () + expect (getaddrinfo ()).to_raise. + any_of (typeerrors (2, "string or int")) + end + } + examples { + ["it diagnoses invalid hints fields"] = function () + expect (getaddrinfo ("localhost", nil, { + protacol=IPPROTO_TCP + })).to_raise.any_of (typeerrors (3, nil, "protacol")) + expect (getaddrinfo ("localhost", nil, { + family=AF_INET, sacktype=SOCK_DGRAM, protocol=IPPROTO_TCP, + })).to_raise.any_of (typeerrors (3, nil, "sacktype")) + end + } + examples { + ["it diagnoses wrong hints field types"] = function () + expect (getaddrinfo ("localhost", nil, { + family=false, + })).to_raise.any_of (typeerrors (3, "int", "family", "boolean")) + expect (getaddrinfo ("localhost", nil, { + family=AF_INET, socktype=false, + })).to_raise.any_of (typeerrors (3, "int", "socktype", "boolean")) + expect (getaddrinfo ("localhost", nil, { + family=AF_INET, socktype=SOCK_DGRAM, protocol=false, + })).to_raise.any_of (typeerrors (3, "int", "protocol", "boolean")) + expect (getaddrinfo ("localhost", nil, { + family=AF_INET, socktype=SOCK_DGRAM, protocol=IPPROTO_TCP, flags=false, + })).to_raise.any_of (typeerrors (3, "int", "flags", "boolean")) + end + } + + +- describe connect: + - before: + connect, typeerrors = init (sock, "connect") + + - context with bad arguments: | + badargs.diagnose (connect, "(int, table)") + + examples { + ["it diagnoses wrong family types"] = function () + expect (connect (42, {family=false})). + to_raise.any_of (typeerrors (2, "int", "family", "boolean")) + expect (connect (42, {family=-1})).to_raise.any_of { + "bad argument #2 to 'connect' (unsupported family type -1)", + "bad argument #2 to '?' (unsupported family type -1)", + } + end + } + examples { + ["it diagnoses wrong AF_INET field types"] = function () + expect (connect (42, {family=AF_INET, port=false})). + to_raise.any_of (typeerrors (2, "int", "port", "boolean")) + expect (connect (42, {family=AF_INET, port=9999, addr=false})). + to_raise.any_of (typeerrors (2, "string", "addr", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_INET fields"] = function () + expect (connect (42, { + family=AF_INET, port=9999, addr="127.0.0.1", flags=false + })).to_raise.any_of (typeerrors (2, nil, "flags")) + end + } + examples { + ["it diagnoses wrong AF_INET6 field types"] = function () + expect (connect (42, {family = AF_INET6, port = false})). + to_raise.any_of (typeerrors (2, "int", "port", "boolean")) + expect (connect (42, {family = AF_INET6, port = 9999, addr = false})). + to_raise.any_of (typeerrors (2, "string", "addr", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_INET6 fields"] = function () + expect (connect (42, { + family=AF_INET6, port=9999, addr="::", flags=false + })).to_raise.any_of (typeerrors (2, nil, "flags")) + end + } + examples { + ["it diagnoses wrong AF_UNIX field types"] = function () + expect (connect (42, {family = AF_UNIX, path = false})). + to_raise.any_of (typeerrors (2, "string", "path", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_UNIX fields"] = function () + expect (connect (42, {family=AF_UNIX, path="/tmp/afunix", port=9999})). + to_raise.any_of (typeerrors (2, nil, "port")) + end + } + if AF_NETLINK then + examples { + ["it diagnoses wrong AF_NETLINK field types"] = function () + expect (connect (42, {family = AF_NETLINK, pid = false})). + to_raise.any_of (typeerrors (2, "int", "pid", "boolean")) + expect (connect (42, {family = AF_NETLINK, pid = 9999, groups = false})). + to_raise.any_of (typeerrors (2, "int", "groups", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_NETLINK fields"] = function () + expect (connect (42, {family=AF_NETLINK, pid=9999, groups=9999, port=9999})). + to_raise.any_of (typeerrors (2, nil, "port")) + end + } + end + + +- describe bind: + - before: + bind, typeerrors = init (sock, "bind") + + - context with bad arguments: | + badargs.diagnose (bind, "(int, table)") + + examples { + ["it diagnoses wrong family types"] = function () + expect (bind (42, {family=false})). + to_raise.any_of (typeerrors (2, "int", "family", "boolean")) + expect (bind (42, {family=-1})).to_raise.any_of { + "bad argument #2 to '?' (unsupported family type -1)", + "bad argument #2 to 'bind' (unsupported family type -1)", + } + end + } + examples { + ["it diagnoses wrong AF_INET field types"] = function () + expect (bind (42, {family=AF_INET, port=false})). + to_raise.any_of (typeerrors (2, "int", "port", "boolean")) + expect (bind (42, {family=AF_INET, port=9999, addr=false})). + to_raise.any_of (typeerrors (2, "string", "addr", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_INET fields"] = function () + expect (bind (42, { + family=AF_INET, port=9999, addr="127.0.0.1", flags=false + })).to_raise.any_of (typeerrors (2, nil, "flags")) + end + } + examples { + ["it diagnoses wrong AF_INET6 field types"] = function () + expect (bind (42, {family = AF_INET6, port = false})). + to_raise.any_of (typeerrors (2, "int", "port", "boolean")) + expect (bind (42, {family = AF_INET6, port = 9999, addr = false})). + to_raise.any_of (typeerrors (2, "string", "addr", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_INET6 fields"] = function () + expect (bind (42, { + family=AF_INET6, port=9999, addr="::", flags=false + })).to_raise.any_of (typeerrors (2, nil, "flags")) + end + } + examples { + ["it diagnoses wrong AF_UNIX field types"] = function () + expect (bind (42, {family = AF_UNIX, path = false})). + to_raise.any_of (typeerrors (2, "string", "path", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_UNIX fields"] = function () + expect (bind (42, {family=AF_UNIX, path="/tmp/afunix", port=9999})). + to_raise.any_of (typeerrors (2, nil, "port")) + end + } + if AF_NETLINK then + examples { + ["it diagnoses wrong AF_NETLINK field types"] = function () + expect (bind (42, {family = AF_NETLINK, pid = false})). + to_raise.any_of (typeerrors (2, "int", "pid", "boolean")) + expect (bind (42, {family = AF_NETLINK, pid = 9999, groups = false})). + to_raise.any_of (typeerrors (2, "int", "groups", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_NETLINK fields"] = function () + expect (bind (42, {family=AF_NETLINK, pid=9999, groups=9999, port=9999})). + to_raise.any_of (typeerrors (2, nil, "port")) + end + } + end + + +- describe listen: + - context with bad arguments: + badargs.diagnose (sock.listen, "(int, int)") + + +- describe accept: + - context with bad arguments: + badargs.diagnose (sock.accept, "(int)") + + +- describe recv: + - context with bad arguments: + badargs.diagnose (sock.recv, "(int, int)") + + +- describe recvfrom: + - context with bad arguments: + badargs.diagnose (sock.recvfrom, "(int, int)") + + +- describe send: + - context with bad arguments: + badargs.diagnose (sock.send, "(int, string)") + + +- describe sendto: + - before: + sendto, typeerrors = init (sock, "sendto") + + - context with bad arguments: | + badargs.diagnose (sendto, "(int, string, table)") + + examples { + ["it diagnoses wrong family types"] = function () + expect (sendto (42, "msg", {family=false})). + to_raise.any_of (typeerrors (3, "int", "family", "boolean")) + expect (sendto (42, "msg", {family=-1})).to_raise.any_of { + "bad argument #3 to '?' (unsupported family type -1)", + "bad argument #3 to 'sendto' (unsupported family type -1)", + } + end + } + examples { + ["it diagnoses wrong AF_INET field types"] = function () + expect (sendto (42, "msg", {family=AF_INET, port=false})). + to_raise.any_of (typeerrors (3, "int", "port", "boolean")) + expect (sendto (42, "msg", {family=AF_INET, port=9999, addr=false})). + to_raise.any_of (typeerrors (3, "string", "addr", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_INET fields"] = function () + expect (sendto (42, "msg", { + family=AF_INET, port=9999, addr="127.0.0.1", flags=false + })).to_raise.any_of (typeerrors (3, nil, "flags")) + end + } + examples { + ["it diagnoses wrong AF_INET6 field types"] = function () + expect (sendto (42, "msg", {family = AF_INET6, port = false})). + to_raise.any_of (typeerrors (3, "int", "port", "boolean")) + expect (sendto (42, "msg", {family = AF_INET6, port = 9999, addr = false})). + to_raise.any_of (typeerrors (3, "string", "addr", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_INET6 fields"] = function () + expect (sendto (42, "msg", { + family=AF_INET6, port=9999, addr="::", flags=false + })).to_raise.any_of (typeerrors (3, nil, "flags")) + end + } + examples { + ["it diagnoses wrong AF_UNIX field types"] = function () + expect (sendto (42, "msg", {family = AF_UNIX, path = false})). + to_raise.any_of (typeerrors (3, "string", "path", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_UNIX fields"] = function () + expect (sendto (42, "msg", {family=AF_UNIX, path="/tmp/afunix", port=9999})). + to_raise.any_of (typeerrors (3, nil, "port")) + end + } + if AF_NETLINK then + examples { + ["it diagnoses wrong AF_NETLINK field types"] = function () + expect (sendto (42, "msg", {family = AF_NETLINK, pid = false})). + to_raise.any_of (typeerrors (3, "int", "pid", "boolean")) + expect (sendto (42, "msg", {family = AF_NETLINK, pid = 9999, groups = false})). + to_raise.any_of (typeerrors (3, "int", "groups", "boolean")) + end + } + examples { + ["it diagnoses invalid AF_NETLINK fields"] = function () + expect (sendto (42, "msg", {family=AF_NETLINK, pid=9999, groups=9999, port=9999})). + to_raise.any_of (typeerrors (3, nil, "port")) + end + } + end + + +- describe shutdown: + - context with bad arguments: + badargs.diagnose (sock.shutdown, "(int, int)") + + +- describe getsockname: + - context with bad arguments: + badargs.diagnose (sock.getsockname, "(int)") + + +- describe setsockopt: + - before: + SOL_SOCKET, SO_LINGER, IPPROTO_TCP = + sock.SOL_SOCKET, sock.SO_LINGER, sock.IPPROTO_TCP + + setsockopt, typeerrors = init (sock, "setsockopt") + + - context with bad arguments: + - 'it diagnoses missing argument #1': + expect (setsockopt ()).to_raise.any_of (typeerrors (1, "int")) + - 'it diagnoses argument #1 type not int': + expect (setsockopt (false)).to_raise.any_of (typeerrors (1, "int", "boolean")) + - 'it diagnoses missing argument #2': + expect (setsockopt (1)).to_raise.any_of (typeerrors (2, "int")) + - 'it diagnoses argument #2 type not int': + expect (setsockopt (1, false)).to_raise.any_of (typeerrors (2, "int", "boolean")) + - 'it diagnoses missing argument #3': + expect (setsockopt (1, 2)).to_raise.any_of (typeerrors (3, "int")) + - 'it diagnoses argument #3 type not int': + expect (setsockopt (1, 2, false)).to_raise.any_of (typeerrors (3, "int", "boolean")) + - 'it diagnoses missing argument #4': + expect (setsockopt (1, SOL_SOCKET, SO_LINGER)). + to_raise.any_of (typeerrors (4, "int")) + - 'it diagnoses argument #4 type not int': + expect (setsockopt (1, SOL_SOCKET, SO_LINGER, false)). + to_raise.any_of (typeerrors (4, "int", "boolean")) + - 'it diagnoses missing argument #5': + expect (setsockopt (1, SOL_SOCKET, SO_LINGER, 4)). + to_raise.any_of (typeerrors (5, "int")) + - 'it diagnoses argument #5 type not int': + expect (setsockopt (1, SOL_SOCKET, SO_LINGER, 4, false)). + to_raise.any_of (typeerrors (5, "int", "boolean")) + - it diagnoses too many arguments: + expect (setsockopt (1, SOL_SOCKET, IPPROTO_TCP, 4, false)). + to_raise.any_of (typeerrors (5)) + expect (setsockopt (1, SOL_SOCKET, SO_LINGER, 4, 5, false)). + to_raise.any_of (typeerrors (6)) + + - it communicates with IPV4 and IPV6 over loopback: | + fd = socket (AF_INET6, SOCK_DGRAM, 0) + expect (type (fd)).to_be "number" + expect (fd >= 0).to_be (true) + + expect (setsockopt (fd, SOL_SOCKET, SO_RCVTIMEO, 1, 0)).to_be (0) + + expect (bind (fd, { family = AF_INET6, addr = "::", port = 9999 })). + to_be (0) + + pending "issue #92" + sockt = { family = AF_INET, addr = "127.0.0.1", port = 59999 } + expect (sendto (fd, "Test ipv4", sockt)).to_be (9) + + data, so = recvfrom (fd, 1024) + expect (data).to_be "Test ipv4" diff --git a/specs/posix_sys_stat_spec.yaml b/specs/posix_sys_stat_spec.yaml new file mode 100644 index 0000000..49e5213 --- /dev/null +++ b/specs/posix_sys_stat_spec.yaml @@ -0,0 +1,310 @@ +specify posix.sys.stat: +- before: + st = require "posix.sys.stat" + + S_IRWXU, S_IRWXG, S_IRWXO = st.S_IRWXU, st.S_IRWXG, st.S_IRWXO + S_ISBLK, S_ISCHR, S_ISDIR, S_ISFIFO, S_ISREG, S_ISLNK, S_ISSOCK = + st.S_ISBLK, st.S_ISCHR, st.S_ISDIR, st.S_ISFIFO, st.S_ISREG, st.S_ISLNK, st.S_ISSOCK + RWXALL = bor (S_IRWXU, S_IRWXG, S_IRWXO) + + dir = posix.mkdtemp (template) + posix.mkdir (dir .. "/subdir") + posix.link ("subdir", dir .. "/soft", true) + touch (dir .. "/file") + posix.link (dir .. "/file", dir .. "/hard") + posix.link ("no such destination", dir .. "/dangling", true) + posix.mkfifo (dir .. "/fifo") + +- after: + rmtmp (dir) + + +- describe chmod: + - before: + chmod, lstat = st.chmod, st.lstat + chmod (dir .. "/file", bor (st.S_IRWXU, st.S_IRGRP, st.S_IXGRP)) + + - context with bad arguments: | + badargs.diagnose (chmod, "(string, int)") + + examples { + ["it diagnoses non-existent files"] = function () + expect (Emsg (chmod (dir .. "/not existing file", st.S_IRWXU))). + to_contain "No such file or directory" + end + } + + - it sets file mode: + mode = bor (st.S_IRUSR, st.S_IWUSR, st.S_IXGRP, st.S_IROTH) + chmod (dir .. "/file", mode) + expect (band (lstat (dir .. "/file").st_mode, RWXALL)).to_be (mode) + + +- describe lstat: + - before: + # choose a format without seconds, that won't cause a race condition + fmt = "%b %d %H:%M" + now = os.date (fmt) + getegid, geteuid = posix.getegid, posix.geteuid + + lstat = st.lstat + + - context with bad arguments: + badargs.diagnose (lstat, "(string)") + + - it returns a PosixStat: + expect (prototype (lstat (dir .. "/file"))).to_be "PosixStat" + - it fetches the device id: + dev = lstat (dir .. "/file").st_dev + expect (type (dev)).to_be "number" + expect (dev >= 0).to_be (true) + expect (dev).to_be (lstat (dir).st_dev) + - it fetches the file inode: + ino = lstat (dir .. "/file").st_ino + expect (type (ino)).to_be "number" + expect (ino >= 0).to_be (true) + expect (ino).to_be (lstat (dir .. "/hard").st_ino) + expect (ino).not_to_be (lstat (dir .. "/soft").st_ino) + - context with file mode: + - it fetches the file access mode: + mode = lstat (dir).st_mode + expect (type (mode)).to_be "number" + expect (band (mode, S_IRWXU)).to_be (S_IRWXU) + - it recognises directories: + expect (S_ISBLK (lstat (dir).st_mode)).to_be (0) + expect (S_ISCHR (lstat (dir).st_mode)).to_be (0) + expect (S_ISDIR (lstat (dir).st_mode)).not_to_be (0) + expect (S_ISFIFO (lstat (dir).st_mode)).to_be (0) + expect (S_ISREG (lstat (dir).st_mode)).to_be (0) + expect (S_ISLNK (lstat (dir).st_mode)).to_be (0) + expect (S_ISSOCK (lstat (dir).st_mode)).to_be (0) + - it recognises fifos: + expect (S_ISBLK (lstat (dir .. "/fifo").st_mode)).to_be (0) + expect (S_ISCHR (lstat (dir .. "/fifo").st_mode)).to_be (0) + expect (S_ISDIR (lstat (dir .. "/fifo").st_mode)).to_be (0) + expect (S_ISFIFO (lstat (dir .. "/fifo").st_mode)).not_to_be (0) + expect (S_ISREG (lstat (dir .. "/fifo").st_mode)).to_be (0) + expect (S_ISLNK (lstat (dir .. "/fifo").st_mode)).to_be (0) + expect (S_ISSOCK (lstat (dir .. "/fifo").st_mode)).to_be (0) + - it recognises regular files: + expect (S_ISBLK (lstat (dir .. "/file").st_mode)).to_be (0) + expect (S_ISCHR (lstat (dir .. "/file").st_mode)).to_be (0) + expect (S_ISDIR (lstat (dir .. "/file").st_mode)).to_be (0) + expect (S_ISFIFO (lstat (dir .. "/file").st_mode)).to_be (0) + expect (S_ISREG (lstat (dir .. "/file").st_mode)).not_to_be (0) + expect (S_ISLNK (lstat (dir .. "/file").st_mode)).to_be (0) + expect (S_ISSOCK (lstat (dir .. "/file").st_mode)).to_be (0) + - it recognises soft links: + expect (S_ISBLK (lstat (dir .. "/soft").st_mode)).to_be (0) + expect (S_ISCHR (lstat (dir .. "/soft").st_mode)).to_be (0) + expect (S_ISDIR (lstat (dir .. "/soft").st_mode)).to_be (0) + expect (S_ISFIFO (lstat (dir .. "/soft").st_mode)).to_be (0) + expect (S_ISREG (lstat (dir .. "/soft").st_mode)).to_be (0) + expect (S_ISLNK (lstat (dir .. "/soft").st_mode)).not_to_be (0) + expect (S_ISSOCK (lstat (dir .. "/soft").st_mode)).to_be (0) + - it fetches the number of links: + expect (lstat (dir .. "/file").st_nlink).to_be (2) + expect (lstat (dir .. "/soft").st_nlink).to_be (1) + expect (lstat (dir .. "/hard").st_nlink). + to_be (lstat (dir .. "/file").st_nlink) + expect (lstat (dir .. "/subdir").st_nlink).to_be (2) + - it fetches the owner id: + expect (lstat (dir .. "/file").st_uid).to_be (geteuid ()) + expect (lstat (dir .. "/subdir").st_uid).to_be (geteuid ()) + - it fetches the owner group id: + expect (lstat (dir .. "/file").st_gid).to_be (getegid ()) + expect (lstat (dir .. "/subdir").st_gid).to_be (getegid ()) + - it fetches the device special file id: + pending "mknod not yet bound" + - it fetches the file size: + # skip directory size, which is system dependent + expect (lstat (dir .. "/file").st_size).to_be (0) + expect (lstat (dir .. "/soft").st_size).to_be (string.len ("subdir")) + expect (lstat (dir .. "/hard").st_size). + to_be (lstat (dir .. "/file").st_size) + - it fetches the file access time: + expect (os.date (fmt, lstat (dir .. "/file").st_atime)).to_be (os.date (fmt)) + - it fetches the file modification time: + expect (os.date (fmt, lstat (dir .. "/file").st_mtime)).to_be (now) + - it fetches the file change time: + expect (os.date (fmt, lstat (dir .. "/file").st_ctime)).to_be (now) + - it fetches the device block size: + blksize = lstat (dir .. "/file").st_blksize + expect (type (blksize)).to_be "number" + expect (blksize > 0).to_be (true) + expect (blksize).to_be (lstat (dir .. "/hard").st_blksize) + - it fetches the number of blocks: + blocks = lstat (dir .. "/file").st_blocks + expect (type (blocks)).to_be "number" + expect (blocks >= 0).to_be (true) + expect (blocks).to_be (lstat (dir .. "/hard").st_blocks) + + +- describe mkdir: + - before: + dir = posix.mkdtemp (template) + lstat, mkdir = st.lstat, st.mkdir + + - after: + rmtmp (dir) + + - context with bad arguments: + badargs.diagnose (mkdir, "(string, ?int)") + + - it creates the named directory: + expect (Emsg (mkdir (dir .. "/subdir"))).not_to_contain "exists" + mode = lstat (dir .. "/subdir").st_mode + expect (st.S_ISDIR (mode)).not_to_be (0) + - it sets the new directory permissions: + mkdir (dir .. "/subdir", S_IRWXU) + mode = lstat (dir .. "/subdir").st_mode + expect (band (mode, RWXALL)).to_be (S_IRWXU) + - it diagnoses already existing directory: + expect (Emsg (mkdir (dir, RWXALL))).to_contain "exists" + + +- describe mkfifo: + - before: + dir = posix.mkdtemp (template) + lstat, mkfifo = st.lstat, st.mkfifo + + - after: + rmtmp (dir) + + - context with bad arguments: + badargs.diagnose (mkfifo, "(string, ?int)") + + - it creates the named fifo: + expect (Emsg (mkfifo (dir .. "/fifo"))).not_to_contain "exists" + mode = lstat (dir .. "/fifo").st_mode + expect (st.S_ISFIFO (mode)).not_to_be (0) + - it sets the new fifo permissions: + mkfifo (dir .. "/fifo", S_IRWXU) + mode = lstat (dir .. "/fifo").st_mode + expect (band (mode, RWXALL)).to_be (S_IRWXU) + - it diagnoses already existing fifo: + expect (Emsg (mkfifo (dir, RWXALL))).to_contain "exists" + + +- describe stat: + - before: + # choose a format without seconds, that won't cause a race condition + fmt = "%b %d %H:%M" + now = os.date (fmt) + getegid, geteuid = posix.getegid, posix.geteuid + + stat = st.stat + + - context with bad arguments: + badargs.diagnose (stat, "(string)") + + - it returns a PosixStat: + expect (prototype (stat (dir .. "/file"))).to_be "PosixStat" + - it fetches the device id: + dev = stat (dir .. "/file").st_dev + expect (type (dev)).to_be "number" + expect (dev >= 0).to_be (true) + expect (dev).to_be (stat (dir).st_dev) + - it fetches the file inode: + ino = stat (dir .. "/file").st_ino + expect (type (ino)).to_be "number" + expect (ino >= 0).to_be (true) + expect (ino).to_be (stat (dir .. "/hard").st_ino) + expect (ino).not_to_be (stat (dir .. "/soft").st_ino) + - context with file mode: + - it fetches the file access mode: + mode = stat (dir).st_mode + expect (type (mode)).to_be "number" + expect (band (mode, S_IRWXU)).to_be (S_IRWXU) + - it recognises directories: + expect (S_ISBLK (stat (dir).st_mode)).to_be (0) + expect (S_ISCHR (stat (dir).st_mode)).to_be (0) + expect (S_ISDIR (stat (dir).st_mode)).not_to_be (0) + expect (S_ISFIFO (stat (dir).st_mode)).to_be (0) + expect (S_ISREG (stat (dir).st_mode)).to_be (0) + expect (S_ISLNK (stat (dir).st_mode)).to_be (0) + expect (S_ISSOCK (stat (dir).st_mode)).to_be (0) + - it recognises fifos: + expect (S_ISBLK (stat (dir .. "/fifo").st_mode)).to_be (0) + expect (S_ISCHR (stat (dir .. "/fifo").st_mode)).to_be (0) + expect (S_ISDIR (stat (dir .. "/fifo").st_mode)).to_be (0) + expect (S_ISFIFO (stat (dir .. "/fifo").st_mode)).not_to_be (0) + expect (S_ISREG (stat (dir .. "/fifo").st_mode)).to_be (0) + expect (S_ISLNK (stat (dir .. "/fifo").st_mode)).to_be (0) + expect (S_ISSOCK (stat (dir .. "/fifo").st_mode)).to_be (0) + - it recognises regular files: + expect (S_ISBLK (stat (dir .. "/file").st_mode)).to_be (0) + expect (S_ISCHR (stat (dir .. "/file").st_mode)).to_be (0) + expect (S_ISDIR (stat (dir .. "/file").st_mode)).to_be (0) + expect (S_ISFIFO (stat (dir .. "/file").st_mode)).to_be (0) + expect (S_ISREG (stat (dir .. "/file").st_mode)).not_to_be (0) + expect (S_ISLNK (stat (dir .. "/file").st_mode)).to_be (0) + expect (S_ISSOCK (stat (dir .. "/file").st_mode)).to_be (0) + - it recognises soft links: + expect (S_ISBLK (stat (dir .. "/soft").st_mode)).to_be (0) + expect (S_ISCHR (stat (dir .. "/soft").st_mode)).to_be (0) + expect (S_ISDIR (stat (dir .. "/soft").st_mode)).not_to_be (0) + expect (S_ISFIFO (stat (dir .. "/soft").st_mode)).to_be (0) + expect (S_ISREG (stat (dir .. "/soft").st_mode)).to_be (0) + expect (S_ISLNK (stat (dir .. "/soft").st_mode)).to_be (0) + expect (S_ISSOCK (stat (dir .. "/soft").st_mode)).to_be (0) + - it fetches the number of links: + expect (stat (dir .. "/file").st_nlink).to_be (2) + expect (stat (dir .. "/soft").st_nlink). + to_be (stat (dir .. "/subdir").st_nlink) + expect (stat (dir .. "/hard").st_nlink). + to_be (stat (dir .. "/file").st_nlink) + expect (stat (dir .. "/subdir").st_nlink).to_be (2) + - it fetches the owner id: + expect (stat (dir .. "/file").st_uid).to_be (geteuid ()) + expect (stat (dir .. "/subdir").st_uid).to_be (geteuid ()) + - it fetches the owner group id: + expect (stat (dir .. "/file").st_gid).to_be (getegid ()) + expect (stat (dir .. "/subdir").st_gid).to_be (getegid ()) + - it fetches the device special file id: + pending "mknod not yet bound" + - it fetches the file size: + # skip directory size, which is system dependent + expect (stat (dir .. "/file").st_size).to_be (0) + expect (stat (dir .. "/soft").st_size).not_to_be (string.len ("subdir")) + expect (stat (dir .. "/hard").st_size). + to_be (stat (dir .. "/file").st_size) + - it fetches the file access time: + expect (os.date (fmt, stat (dir .. "/file").st_atime)).to_be (os.date (fmt)) + - it fetches the file modification time: + expect (os.date (fmt, stat (dir .. "/file").st_mtime)).to_be (now) + - it fetches the file change time: + expect (os.date (fmt, stat (dir .. "/file").st_ctime)).to_be (now) + - it fetches the device block size: + blksize = stat (dir .. "/file").st_blksize + expect (type (blksize)).to_be "number" + expect (blksize > 0).to_be (true) + expect (blksize).to_be (stat (dir .. "/hard").st_blksize) + - it fetches the number of blocks: + blocks = stat (dir .. "/file").st_blocks + expect (type (blocks)).to_be "number" + expect (blocks >= 0).to_be (true) + expect (blocks).to_be (stat (dir .. "/hard").st_blocks) + + +- describe umask: + - before: + lstat, umask = st.lstat, st.umask + newmask = band (st.S_IWGRP, st.S_IRWXO) + origmask = umask (newmask) + - after: + umask (origmask) + + - context with bad arguments: + badargs.diagnose (umask, "(int)") + + - it returns current umask: + expect (umask (0)).to_be (newmask) + expect (umask (newmask)).to_be (0) + - it controls the mode of newly created files: + all = bor (st.S_IRWXU, st.S_IRWXG, st.S_IRWXO) + xxx, mask = dir .. "/xxx", bor (st.S_IRWXO, st.S_IWGRP, st.S_IXGRP) + umask (mask) + touch (xxx) + expect (band (lstat (xxx).st_mode, all)).to_be (bor (st.S_IRUSR, st.S_IWUSR, st.S_IRGRP)) + os.remove (xxx) diff --git a/specs/posix_sys_statvfs_spec.yaml b/specs/posix_sys_statvfs_spec.yaml new file mode 100644 index 0000000..c2ccc1d --- /dev/null +++ b/specs/posix_sys_statvfs_spec.yaml @@ -0,0 +1,35 @@ +specify posix.sys.statvfs: +- before: + sv = require "posix.sys.statvfs" + +- describe statvfs: + - before: + statvfs = sv.statvfs + + - context with bad arguments: + if statvfs then + badargs.diagnose (statvfs, "(string)") + end + + - it returns a PosixStatvfs: + if statvfs then + expect (prototype (statvfs ("/"))).to_be "PosixStatvfs" + end + - it fetches statistics for a mounted file system: + if statvfs then + sv = statvfs "/" + expect (type (sv)).to_be "table" + for _, field in pairs {"f_bsize", "f_frsize", "f_blocks", "f_bfree", + "f_bavail", "f_files", "f_ffree", "f_favail", "f_flag", "f_namemax"} + do + expect (type (sv[field])).to_be "number" + expect (sv[field] >= 0).to_be (true) + end + end + - it returns a non-negative value from fsid: | + -- Merge this back into the previous example when #102 is fixed + if statvfs then + sv = statvfs "/" + pending "issue #102" + expect (sv[field] >= 0).to_be (true) + end diff --git a/specs/posix_sys_time_spec.yaml b/specs/posix_sys_time_spec.yaml new file mode 100644 index 0000000..b97db75 --- /dev/null +++ b/specs/posix_sys_time_spec.yaml @@ -0,0 +1,19 @@ +specify posix.sys.time: +- before: + systime = require "posix.sys.time" + + +- describe gettimeofday: + - before: + gettimeofday = systime.gettimeofday + + - context with bad arguments: + badargs.diagnose (gettimeofday, "()") + + - it returns a PosixTimeval: + expect (prototype (gettimeofday ())).to_be "PosixTimeval" + - it fetches the current epoch time: + tv, epoch = gettimeofday (), posix.time () + expect (tv.tv_sec).to_be (epoch) + expect (type (tv.tv_usec)).to_be "number" + expect (tv.tv_usec >= 0).to_be (true) diff --git a/specs/posix_sys_times_spec.yaml b/specs/posix_sys_times_spec.yaml new file mode 100644 index 0000000..5af505b --- /dev/null +++ b/specs/posix_sys_times_spec.yaml @@ -0,0 +1,27 @@ +specify posix.sys.times: +- before: + tms = require "posix.sys.times" + +- describe times: + - before: + table.unpack = table.unpack or unpack + times = tms.times + + # posix.times takes an optional string or table as its first + # argument, followed by zero or more strings only if the first + # argument was a string; since we can't express that with + # `badargs.diagnose` do it all manually again... + - context with bad arguments: + badargs.diagnose (times, "()") + + - it returns a PosixTms: + expect (prototype (times ())).to_be "PosixTms" + - it fetches everything without an argument: + keys = { + "tms_utime", "tms_stime", "tms_cutime", "tms_cstime", "elapsed" + } + t = times () + expect (t).to_contain.a_permutation_of (keys) + for _, key in ipairs (keys) do + expect (type (t[key])).to_be "number" + end diff --git a/specs/posix_sys_utsname_spec.yaml b/specs/posix_sys_utsname_spec.yaml new file mode 100644 index 0000000..5af19e9 --- /dev/null +++ b/specs/posix_sys_utsname_spec.yaml @@ -0,0 +1,26 @@ +specify posix.sys.utsname: +- before: + utsname = require "posix.sys.utsname" + + +- describe uname: + - before: + uname = utsname.uname + + u = uname () + + - context with bad arguments: + badargs.diagnose (uname, "()") + + - it returns a PosixUtsname: + expect (prototype (u)).to_be "PosixUtsname" + - it returns machine name: + expect (u.machine).to_be (cmd_output "uname -m") + - it returns nodename: + expect (u.nodename).to_be (cmd_output "uname -n") + - it returns operating system release: + expect (u.release).to_be (cmd_output "uname -r") + - it returns system name: + expect (u.sysname).to_be (cmd_output "uname -s") + - it returns operating system version: + expect (u.version).to_be (cmd_output "uname -v") diff --git a/specs/posix_syslog_spec.yaml b/specs/posix_syslog_spec.yaml new file mode 100644 index 0000000..98e1fa0 --- /dev/null +++ b/specs/posix_syslog_spec.yaml @@ -0,0 +1,41 @@ +specify posix.syslog: +- before: + log = require "posix.syslog" + + +- describe LOG_MASK: + - context with bad arguments: + if log.LOG_MASK then + badargs.diagnose (log.LOG_MASK, "(int)") + end + + +- describe closelog: + - context with bad arguments: + if log.closelog then + badargs.diagnose (log.closelog, "()") + end + + +- describe openlog: + - before: + openlog = log.openlog + + - context with bad arguments: | + if openlog then + badargs.diagnose (openlog, "(string, ?int, ?int)") + end + + +- describe setlogmask: + - context with bad arguments: + if log.setlogmask then + badargs.diagnose (log.setlogmask, "(?int)") + end + + +- describe syslog: + - context with bad arguments: + if log.syslog then + badargs.diagnose (log.syslog, "(int, string)") + end diff --git a/specs/posix_time_spec.yaml b/specs/posix_time_spec.yaml new file mode 100644 index 0000000..0a08ce9 --- /dev/null +++ b/specs/posix_time_spec.yaml @@ -0,0 +1,210 @@ +specify posix.time: +- before: + tm = require "posix.time" + + now = tm.time () + +- describe clock_getres: + - before: + clock_getres = tm.clock_getres + + - context with bad arguments: + if clock_getres then + badargs.diagnose (clock_getres, "(int)") + end + + - it returns a PosixTimespec: + if clock_getres then + expect (prototype (clock_getres (tm.CLOCK_REALTIME))). + to_be "PosixTimespec" + end + +- describe clock_gettime: + - before: + clock_gettime = tm.clock_gettime + + - context with bad arguments: + if clock_gettime then + badargs.diagnose (clock_gettime, "(int)") + end + + - it returns a PosixTimespec: + if clock_getres then + expect (prototype (clock_gettime (tm.CLOCK_REALTIME))). + to_be "PosixTimespec" + end + +- describe gmtime: + - before: + gmtime = tm.gmtime + + - context with bad arguments: + badargs.diagnose (gmtime, "(int)") + + - it returns a PosixTm: + expect (prototype (gmtime (now))).to_be "PosixTm" + - it fetches broken-down time values: + t = gmtime (now) + fields = {"tm_sec", "tm_min", "tm_hour", "tm_mday", + "tm_mon", "tm_year", "tm_wday", "tm_yday", "tm_isdst"} + expect (t).to_contain.a_permutation_of (fields) + for _, field in pairs (fields) do + expect (type (t[field])).to_be "number" + expect (t[field] >= 0).to_be (true) + end + - it returns a month in the range 0-11: + # A recent December afternoon in epoch seconds... + expect (gmtime (1418734089).tm_mon).to_be (11) + t = gmtime (now) + expect (t.tm_mon >= 0 and t.tm_mon < 12).to_be (true) + - it returns years since 1900: + expect (gmtime (now).tm_year < 1900).to_be (true) + + +- describe localtime: + - before: + localtime = tm.localtime + + - context with bad arguments: + badargs.diagnose (localtime, "(int)") + + - it returns a PosixTm: + expect (prototype (localtime (now))).to_be "PosixTm" + - it fetches broken-down time values: + t = localtime (now) + fields = {"tm_sec", "tm_min", "tm_hour", "tm_mday", + "tm_mon", "tm_year", "tm_wday", "tm_yday", "tm_isdst"} + expect (t).to_contain.a_permutation_of (fields) + for _, field in pairs (fields) do + expect (type (t[field])).to_be "number" + expect (t[field] >= 0).to_be (true) + end + - it returns a month in the range 0-11: + # A recent December afternoon in epoch seconds... + expect (localtime (1418734089).tm_mon).to_be (11) + t = localtime (now) + expect (t.tm_mon >= 0 and t.tm_mon < 12).to_be (true) + - it returns years since 1900: + expect (localtime (now).tm_year < 1900).to_be (true) + + +- describe mktime: + - before: + localtime, mktime, time = tm.localtime, tm.mktime, tm.time + epoch = time () + t = localtime (epoch) + + - context with bad arguments: + badargs.diagnose (mktime, "(table)") + + - it returns an epoch time: + expect (prototype (mktime (t))).to_be "number" + - it is the inverse of localtime: + expect (mktime (t)).to_be (epoch) + + +- describe nanosleep: + - before: + nanosleep, typeerrors = init (tm, "nanosleep") + + - context with bad arguments: | + badargs.diagnose (nanosleep, "(table)") + + examples { + ["context diagnosing timespec table fields"] = { + { + ["it diagnoses argument #1 tv_sec field type not int"] = function () + expect (nanosleep {tv_sec = false}). + to_raise.any_of (typeerrors (1, "int", "tv_sec", "boolean")) + end + }, + { + ["it diagnoses argument #1 tv_nsec field type not int"] = function () + expect (nanosleep {tv_sec = -1, tv_nsec = false}). + to_raise.any_of (typeerrors (1, "int", "tv_nsec", "boolean")) + end + }, + { + ["it diagnoses argument #1 spurious fields"] = function () + expect (nanosleep {tv_sec = -1, tv_nsec = -1, bogus = false}). + to_raise.any_of (typeerrors (1, nil, "bogus")) + end + }, + } + } + + - it returns an integer: + expect (nanosleep {tv_sec = 0, tv_nsec = 10}).to_be (0) + + +- describe strftime: + - before: + strftime = tm.strftime + + t = { + tm_wday = 0, tm_isdst = 1, tm_sec = 2, tm_min = 3, tm_hour = 4, + tm_mday = 5, tm_mon = 6, tm_year = 7, tm_yday = 8 + } + + - context with bad arguments: + badargs.diagnose (strftime, "(string, table)") + + - context with place-holders: + - it plugs tm_wday: + expect (strftime ("%w", t)).to_be "0" + - it plugs tm_sec: + expect (strftime ("%S", t)).to_be "02" + - it plugs tm_min: + expect (strftime ("%M", t)).to_be "03" + - it plugs tm_hour: + expect (strftime ("%H", t)).to_be "04" + - it plugs tm_mday: + expect (strftime ("%d", t)).to_be "05" + - it plugs tm_mon: + expect (strftime ("%m", t)).to_be "07" + - it plugs tm_year: + expect (strftime ("%y", t)).to_be "07" + - it plugs tm_yday: + expect (strftime ("%j", t)).to_be "009" + + +- describe strptime: + - before: + strptime = tm.strptime + + - context with bad arguments: + badargs.diagnose (strptime, "(string, string)") + + - context with place-holders: + - before: + t, i = strptime ("Mon Jun 4 03:02:01 BST 1906 garbage", + "%a %b %d %H:%M:%S BST %Y") + - it returns the first unconsumed character: + expect (i).to_be (29) + # tm_yday and tm_isdst are not set by strptime + - it scans into tm_wday: + expect (t.tm_wday).to_be (1) + - it scans into tm_sec: + expect (t.tm_sec).to_be (1) + - it scans into tm_min: + expect (t.tm_min).to_be (2) + - it scans into tm_hour: + expect (t.tm_hour).to_be (3) + - it scans into tm_mday: + expect (t.tm_mday).to_be (4) + - it scans into tm_mon: + expect (t.tm_mon).to_be (5) + - it scans into tm_year: + expect (t.tm_year).to_be (6) + + +- describe time: + - before: + time = tm.time + + - context with bad arguments: + badargs.diagnose (time, "()") + + - it returns epoch seconds: + expect (type (time ())).to_be "number" + expect (time () > 0).to_be (true) diff --git a/specs/posix_unistd_spec.yaml b/specs/posix_unistd_spec.yaml new file mode 100644 index 0000000..7a78398 --- /dev/null +++ b/specs/posix_unistd_spec.yaml @@ -0,0 +1,198 @@ +specify posix.unistd: +- before: | + pwd = require "posix.pwd" + unistd = require "posix.unistd" + + -- Assume $USER is the process owner, egid is gid and euid is uid + ids = pwd.getpwnam (os.getenv "USER") + + +- describe exec: + - before: + exec = unistd.exec + + - context with bad arguments: + badargs.diagnose (exec, "(string, table)") + + +- describe execp: + - before: | + bit = require "bit32" + fcntl = require "posix.fcntl" + syswait = require "posix.sys.wait" + + execp = unistd.execp + + dup2, fork, wait = unistd.dup2, unistd.fork, syswait.wait + open, O_WRONLY, O_APPEND = fcntl.open, fcntl.O_WRONLY, fcntl.O_APPEND + P_CHILD = 0 + + -- redirect output to /dev/null + function child (...) + quietly = open ("/dev/null", bit.bor (O_WRONLY, O_APPEND)) + dup2 (quietly, 1) + execp (...) + expect ("not reached").to_be (true) + end + + - context with bad arguments: + badargs.diagnose (execp, "(string, table)") + + - it overwrites the running process with a shell invocation: + process = fork () + if process == P_CHILD then + child ("date", {"+[%c]"}) + else + p, msg, ret = wait (process) + expect (table.concat {msg, " ", tostring (ret)}).to_be "exited 0" + end + - "it sets argv[0]": + + +- describe getegid: + - before: + getegid = unistd.getegid + + - context with bad arguments: + badargs.diagnose (getegid, "()") + + - it returns the effective group id: + expect (getegid ()).to_be (ids.pw_gid) + + +- describe geteuid: + - before: + geteuid = unistd.geteuid + + - context with bad arguments: + badargs.diagnose (geteuid, "()") + + - it returns the effective user id: + expect (geteuid ()).to_be (ids.pw_uid) + + +- describe getgid: + - before: + getgid = unistd.getgid + + - context with bad arguments: + badargs.diagnose (getgid, "()") + + - it returns the group id: + expect (getgid ()).to_be (ids.pw_gid) + + +- describe gethostid: + - before: + gethostid = unistd.gethostid + + - context with bad arguments: + badargs.diagnose (gethostid, "()") + + - it returns an integer: + expect (math.floor (gethostid ())).to_be (gethostid ()) + + +- describe getuid: + - before: + getuid = unistd.getuid + + - context with bad arguments: + badargs.diagnose (getuid, "()") + + - it returns the user id: + expect (getuid ()).to_be (ids.pw_uid) + + +- describe getpgrp: + - before: + getpgrp = unistd.getpgrp + + - context with bad arguments: + badargs.diagnose (getpgrp, "()") + + - it returns a positive integer: + expect (math.floor (getpgrp ())).to_be (getpgrp ()) + expect (getpgrp () > 0).to_be (true) + + +- describe getpid: + - before: + getpid = unistd.getpid + + - context with bad arguments: + badargs.diagnose (getpid, "()") + + - it returns the a positive integer: + expect (math.floor (getpid ())).to_be (getpid ()) + expect (getpid () > 0).to_be (true) + + +- describe getppid: + - before: + getppid = unistd.getppid + + - context with bad arguments: + badargs.diagnose (getppid, "()") + + - it returns a positive integer: + expect (math.floor (getppid ())).to_be (getppid ()) + expect (getppid () > 0).to_be (true) + - it does not return the process id: + expect (getppid ()).not_to_be (unistd.getpid ()) + + +- describe pathconf: + - before: + pathconf = unistd.pathconf + + - context with bad arguments: + badargs.diagnose (pathconf, "(string, int)") + + - it returns whether chown can be used on the given file: + expect (type (pathconf (".", unistd._PC_CHOWN_RESTRICTED))).to_be "number" + - it fetches the maximum number of links to the given file: + expect (type (pathconf (".", unistd._PC_LINK_MAX))).to_be "number" + - it fetches the maximum formatted line input length for a tty: + expect (type (pathconf (".", unistd._PC_MAX_CANON))).to_be "number" + - it fetches the maximum raw line input length for a tty: + expect (type (pathconf (".", unistd._PC_MAX_INPUT))).to_be "number" + - it fetches the maximum filename length in this directory: + expect (type (pathconf (".", unistd._PC_NAME_MAX))).to_be "number" + - it fetches whether accessing overlong filenames is an error: + expect (type (pathconf (".", unistd._PC_NO_TRUNC))).to_be "number" + - it fetches the maximum relative path length from this directory: + expect (type (pathconf (".", unistd._PC_PATH_MAX))).to_be "number" + - it fetches the size of the pipe buffer: + expect (type (pathconf (".", unistd._PC_PIPE_BUF))).to_be "number" + - it fetches whether special character processing can be disabled: + expect (type (pathconf (".", unistd._PC_VDISABLE))).to_be "number" + + +- describe sysconf: + - before: + sysconf = unistd.sysconf + + - context with bad arguments: + badargs.diagnose (sysconf, "(int)") + + - it fetches the maximum number of exec arguments: + expect (type (sysconf (unistd._SC_ARG_MAX))).to_be "number" + - it fetches the number processes per user: + expect (type (sysconf (unistd._SC_CHILD_MAX))).to_be "number" + - it fetches the number of clock ticks per second: + expect (type (sysconf (unistd._SC_CLK_TCK))).to_be "number" + - it fetches the job control version: + expect (type (sysconf (unistd._SC_JOB_CONTROL))).to_be "number" + - it fetches the maximum number of groups: + expect (type (sysconf (unistd._SC_NGROUPS_MAX))).to_be "number" + - it fetches the maximum number of open descriptors: + expect (type (sysconf (unistd._SC_OPEN_MAX))).to_be "number" + - it fetches the number of saved ids: + expect (type (sysconf (unistd._SC_SAVED_IDS))).to_be "number" + - it fetches the maximum number of open streams: + expect (type (sysconf (unistd._SC_STREAM_MAX))).to_be "number" + - it fetches the maximum length of a timezone name: + expect (type (sysconf (unistd._SC_TZNAME_MAX))).to_be "number" + - it fetches the POSIX.1 version: + expect (type (sysconf (unistd._SC_VERSION))).to_be "number" diff --git a/specs/posix_version_spec.yaml b/specs/posix_version_spec.yaml new file mode 100644 index 0000000..0b9f132 --- /dev/null +++ b/specs/posix_version_spec.yaml @@ -0,0 +1,5 @@ +describe version: +- it is set: + expect (posix.version).not_to_be (nil) +- it contains the correct release number: + expect (posix.version).to_contain (os.getenv "PACKAGE_STRING") diff --git a/specs/spec_helper.lua b/specs/spec_helper.lua new file mode 100755 index 0000000..89e5523 --- /dev/null +++ b/specs/spec_helper.lua @@ -0,0 +1,125 @@ +if os.getenv "installcheck" == nil then + -- Unless we're running inside `make installcheck`, add the dev-tree + -- directories to the module search paths. + local std = require "specl.std" + + local top_srcdir = os.getenv "top_srcdir" or "." + local top_builddir = os.getenv "top_builddir" or "." + + package.path = std.package.normalize ( + top_builddir .. "/lib/?.lua", + top_srcdir .. "/lib/?.lua", + top_builddir .. "/lib/?/init.lua", + top_srcdir .. "/lib/?/init.lua", + package.path) + package.cpath = std.package.normalize ( + top_builddir .. "/ext/posix/.libs/?.so", + top_srcdir .. "/ext/posix/.libs/?.so", + top_builddir .. "/ext/posix/_libs/?.dll", + top_srcdir .. "/ext/posix/_libs/?.dll", + package.cpath) +end + + +local bit = require "bit32" +band, bnot, bor = bit.band, bit.bnot, bit.bor + +badargs = require "specl.badargs" +hell = require "specl.shell" +posix = require "posix" + + +-- Allow user override of LUA binary used by hell.spawn, falling +-- back to environment PATH search for "lua" if nothing else works. +local LUA = os.getenv "LUA" or "lua" + + +-- Easily check for std.object.type compatibility. +function prototype (o) + return (getmetatable (o) or {})._type or io.type (o) or type (o) +end + + +local function mkscript (code) + local f = os.tmpname () + local h = io.open (f, "w") + h:write (code) + h:close () + return f +end + + +--- Run some Lua code with the given arguments and input. +-- @string code valid Lua code +-- @tparam[opt={}] string|table arg single argument, or table of +-- arguments for the script invocation +-- @string[opt] stdin standard input contents for the script process +-- @treturn specl.shell.Process|nil status of resulting process if +-- execution was successful, otherwise nil +function luaproc (code, arg, stdin) + local f = mkscript (code) + if type (arg) ~= "table" then arg = {arg} end + local cmd = {LUA, f, unpack (arg)} + -- inject env and stdin keys separately to avoid truncating `...` in + -- cmd constructor + cmd.stdin = stdin + cmd.env = { + LUA_CPATH = package.cpath, + LUA_PATH = package.path, + LUA_INIT = "", + LUA_INIT_5_2 = "" + } + local proc = hell.spawn (cmd) + os.remove (f) + return proc +end + + +-- Use a consistent template for all temporary files. +TMPDIR = posix.getenv ("TMPDIR") or "/tmp" +template = TMPDIR .. "/luaposix-test-XXXXXX" + +-- Allow comparison against the error message of a function call result. +function Emsg (_, msg) return msg or "" end + +-- Collect stdout from a shell command, and strip surrounding whitespace. +function cmd_output (cmd) + return hell.spawn (cmd).output:gsub ("^%s+", ""):gsub ("%s+$", "") +end + + +local st = require "posix.sys.stat" +local stat, S_ISDIR = st.lstat, st.S_ISDIR + +-- Recursively remove a temporary directory. +function rmtmp (dir) + for f in posix.files (dir) do + if f ~= "." and f ~= ".." then + local path = dir .. "/" .. f + if S_ISDIR (stat (path).st_mode) ~= 0 then + rmtmp (path) + else + os.remove (path) + end + end + end + os.remove (dir) +end + + +-- Create an empty file at PATH. +function touch (path) io.open (path, "w+"):close () end + + +-- Format a bad argument type error. +local function typeerrors (fname, i, want, field, got) + return { + badargs.format ("?", i, want, field, got), -- LuaJIT + badargs.format (fname, i, want, field, got), -- PUC-Rio + } +end + + +function init (M, fname) + return M[fname], function (...) return typeerrors (fname, ...) end +end diff --git a/specs/specs.mk b/specs/specs.mk new file mode 100644 index 0000000..a1ba3b6 --- /dev/null +++ b/specs/specs.mk @@ -0,0 +1,41 @@ +# Specl specs make rules. + + +## ------ ## +## Specs. ## +## ------ ## + +specl_SPECS = \ + $(srcdir)/specs/posix_version_spec.yaml \ + $(srcdir)/specs/curses_spec.yaml \ + $(srcdir)/specs/lposix_spec.yaml \ + $(srcdir)/specs/posix_compat_spec.yaml \ + $(srcdir)/specs/posix_ctype_spec.yaml \ + $(srcdir)/specs/posix_deprecated_spec.yaml \ + $(srcdir)/specs/posix_dirent_spec.yaml \ + $(srcdir)/specs/posix_fcntl_spec.yaml \ + $(srcdir)/specs/posix_fnmatch_spec.yaml \ + $(srcdir)/specs/posix_grp_spec.yaml \ + $(srcdir)/specs/posix_pwd_spec.yaml \ + $(srcdir)/specs/posix_signal_spec.yaml \ + $(srcdir)/specs/posix_stdio_spec.yaml \ + $(srcdir)/specs/posix_stdlib_spec.yaml \ + $(srcdir)/specs/posix_sys_msg_spec.yaml \ + $(srcdir)/specs/posix_sys_resource_spec.yaml \ + $(srcdir)/specs/posix_sys_socket_spec.yaml \ + $(srcdir)/specs/posix_sys_stat_spec.yaml \ + $(srcdir)/specs/posix_sys_statvfs_spec.yaml \ + $(srcdir)/specs/posix_sys_time_spec.yaml \ + $(srcdir)/specs/posix_sys_times_spec.yaml \ + $(srcdir)/specs/posix_sys_utsname_spec.yaml \ + $(srcdir)/specs/posix_syslog_spec.yaml \ + $(srcdir)/specs/posix_time_spec.yaml \ + $(srcdir)/specs/posix_unistd_spec.yaml \ + $(srcdir)/specs/posix_spec.yaml \ + $(NOTHING_ELSE) + +EXTRA_DIST += \ + $(srcdir)/specs/spec_helper.lua \ + $(NOTHING_ELSE) + +include build-aux/specl.mk diff --git a/travis.yml.in b/travis.yml.in new file mode 100644 index 0000000..ae2daf4 --- /dev/null +++ b/travis.yml.in @@ -0,0 +1,150 @@ +language: c + +env: + global: + - _COMPILE="libtool --mode=compile --tag=CC gcc" + - _CFLAGS="-O2 -Wall -DLUA_COMPAT_ALL -DLUA_COMPAT_5_2 -DLUA_USE_LINUX" + - _INSTALL="libtool --mode=install install -p" + - _LINK="libtool --mode=link --tag=CC gcc" + - _LIBS="-lm -Wl,-E -ldl -lreadline" + + - prefix=/usr/local + - bindir=$prefix/bin + - incdir=$prefix/include + - libdir=$prefix/lib + + - _inst=$TRAVIS_BUILD_DIR/_inst + - luadir=$_inst/share/lua + - luaexecdir=$_inst/lib/lua + matrix: + - LUA=lua5.3 + - LUA=lua5.2 + - LUA=lua5.1 + - LUA=luajit + + +before_install: + # Put back the links for libyaml, which are missing on recent Travis VMs + - test -f /usr/lib/libyaml.so || + sudo find /usr/lib -name 'libyaml*' -exec ln -s {} /usr/lib \; + - sudo apt-get install help2man + + # Fetch Lua sources. + - cd $TRAVIS_BUILD_DIR + - 'if test lua5.3 = "$LUA"; then + curl http://www.lua.org/ftp/lua-5.3.0.tar.gz | tar xz; + cd lua-5.3.0; + fi' + - 'if test lua5.2 = "$LUA"; then + curl http://www.lua.org/ftp/lua-5.2.3.tar.gz | tar xz; + cd lua-5.2.3; + fi' + - 'if test lua5.1 = "$LUA"; then + curl http://www.lua.org/ftp/lua-5.1.5.tar.gz | tar xz; + cd lua-5.1.5; + fi' + + # Unpack, compile and install Lua. + - 'if test luajit = "$LUA"; then + curl http://luajit.org/download/LuaJIT-2.0.3.tar.gz | tar xz; + cd LuaJIT-2.0.3; + make && sudo make install; + for header in lua.h luaconf.h lualib.h lauxlib.h luajit.h lua.hpp; do + if test -f /usr/local/include/luajit-2.0/$header; then + sudo ln -s /usr/local/include/luajit-2.0/$header /usr/local/include/$header; + fi; + done; + else + for src in src/*.c; do + test src/lua.c = "$src" || test src/luac.c = "$src" || eval $_COMPILE $_CFLAGS -c $src; + done; + eval $_LINK -o lib$LUA.la -version-info 0:0:0 -rpath $libdir *.lo; + sudo mkdir -p $libdir; + eval sudo $_INSTALL lib$LUA.la $libdir/lib$LUA.la; + + eval $_COMPILE $_CFLAGS -c src/lua.c; + eval $_LINK -static -o $LUA lua.lo lib$LUA.la $_LIBS; + sudo mkdir -p $bindir; + eval sudo $_INSTALL $LUA $bindir/$LUA; + + sudo mkdir -p $incdir; + for header in lua.h luaconf.h lualib.h lauxlib.h lua.hpp; do + if test -f src/$header; then + eval sudo $_INSTALL src/$header $incdir/$header; + fi; + done; + fi' + + # Fetch LuaRocks. + - cd $TRAVIS_BUILD_DIR + - 'git clone https://github.com/keplerproject/luarocks.git luarocks-2.2.0' + - cd luarocks-2.2.0 + - git checkout v2.2.0 + + # Compile and install luarocks. + - if test luajit = "$LUA"; then + ./configure --lua-suffix=jit; + else + ./configure; + fi + - 'make build && sudo make install' + + # Tidy up file droppings. + - cd $TRAVIS_BUILD_DIR + - rm -rf lua-5.3.0 lua-5.2.3 lua-5.1.5 LuaJIT-2.0.3 luarocks-2.2.0 + + +install: + # Use Lua 5.3 compatible rocks, where available. + - 'for rock in @EXTRA_ROCKS@""; do + if test -z "$rock"; then break; fi; + if luarocks list | grep "^$rock$" >/dev/null; then continue; fi; + sudo luarocks install --server=http://rocks.moonscript.org/manifests/gvvaughan $rock; + done' + + # Fudge timestamps on release branches. + - 'if test -f configure; then + test -f aclocal.m4 && touch aclocal.m4; + sleep 1; touch Makefile.in; + sleep 1; test -f config.h.in && touch config.h.in; + sleep 1; touch configure; + fi' + + # Build from rockspec. + - export ROCKSPEC=@PACKAGE@-@VERSION@-1.rockspec + - 'test -f "$ROCKSPEC" || ROCKSPEC=@PACKAGE@-git-1.rockspec' + - sudo luarocks make $ROCKSPEC LUA="$LUA" + + # Clean up files created by root + - sudo git clean -dfx + - sudo rm -rf slingshot /tmp/ldoc + + +script: + # Reconfigure for in-tree test install. + - test -f configure || ./bootstrap --verbose + - ./configure --prefix="$_inst" --disable-silent-rules LUA="$LUA" + + # Verify luarocks installation. + - make installcheck || make installcheck V=1 + + # Verify local build. + - make + - make check || make check V=1 + + # Verify configured installation. + - make install prefix="$_inst" luadir="$luadir" luaexecdir="$luaexecdir" + - LUA_PATH="$luadir/?.lua;$luadir/?/init.lua;;" + LUA_CPATH="$luaexecdir/?.so;;" + make installcheck V=1 + + +# Run sanity checks on CI server, ignoring buggy automakes. +after_success: + - '{ _assign="="; + if grep local-checks-to-skip build-aux/sanity-cfg.mk >/dev/null; then + _assign="+="; + fi; + printf "local-checks-to-skip %s sc_vulnerable_makefile_CVE-2012-3386\n" "$_assign"; + } >> build-aux/sanity-cfg.mk' + - 'make syntax-check || : this will usually fail on the release branch'